はじめに
Deno Advent Calendar 2020 10日目の記事です🦕
2020/12/8にDeno@v1.6.0がリリースされました🥳
この記事では、v1.6.0に含まれる新機能について紹介します。
追記
記事を書いたあとで気づいたのですが、@maguro_tuna さんのZennの記事と内容がかぶっていました🙏🙇♂️
deno compile
等についてこの記事よりも詳細に書かれているので、よろしければ、以下の記事も参照ください🙇♂️
要約
- deno compileコマンドが実装され、アプリケーションを単一の実行可能ファイルとしてパッケージングできるようになった
- deno lspコマンドによってLanguage Serverが起動できるようになった
- isolatedModulesが常に有効化されるようになった
- TypeScriptがv4.1にアップグレードされた
deno compileコマンドが実装され、アプリケーションを単一の実行可能ファイルとしてパッケージングできるようになった
deno compileコマンドが実装され、denoのアプリケーションを単一の実行可能ファイルとしてパッケージングできるようになりました。(イメージとしては、Node.jsのpkgパッケージが近いと思います)
使い方
$ deno compile --unstable <パッケージング対象のファイル>
上記のような形式でコマンドを実行すると、コマンドライン引数で指定されたファイル及びそのファイルから再帰的に依存されているモジュールがバンドルされ、単一の実行可能ファイルへとパッケージングされます。
試しに、std/examples/welcome.ts
をパッケージングし、実行してみます。
$ deno compile --unstable https://deno.land/std@0.80.0/examples/welcome.ts
Download https://deno.land/std@0.80.0/examples/welcome.ts
Check https://deno.land/std@0.80.0/examples/welcome.ts
Bundle https://deno.land/std@0.80.0/examples/welcome.ts
Compile https://deno.land/std@0.80.0/examples/welcome.ts
Emit welcome
$ ./welcome
Welcome to Deno 🦕
うまく実行できました!
出力される実行可能ファイルの名前は、deno install
コマンドと同様に、パッケージング対象のファイル名を元に決定されます。
出力される実行可能ファイルの名前を変更したいときは、--output
オプションで指定します。
$ deno compile --unstable --output awesome-cli cli.ts
$ ./awesome-cli
ユースケース
実践的な使い方としては、以下のように様々な使い方が考えられそうです。
- Webアプリケーションのデプロイ
- CLIツールをバイナリ形式で配布する(例: dem/deno-udd)
- webview_denoやcarolと組み合わせて、シングルバイナリ形式でGUIアプリケーションを配布する
制限
現時点では以下のようにいくつか制限があります。
- クロスコンパイルに対応していない
- dynamic importが動作しない
- パーミッションの指定に対応していない(
--allow-read
,--allow-net
等)
これらの制限については、すでにissueが起票されており、将来的にはサポートされる可能性もあります。
deno lspコマンドによってLanguage Serverが起動できるようになった
deno lspコマンドが実装され、deno単体でLanguage Serverが起動できるようになりました。
現時点では、typescript-language-server等と比較すると、まだまだ実装されている機能は少ないです。
しかし、徐々に不足している機能が追加されていっているため、将来的にはvscode以外のエディタでもdenoを使った開発がしやすくなると思います。
現時点で実装されている機能
※LSPの仕様についてはlsp_spec_jaなどを参照ください
textDocument/definition
textDocument/formatting
textDocument/hover
textDocument/references
-
textDocument/completion
(部分的)
使用方法
vscodeからdeno lspを使用する方法
vscodeからdeno lspを連携させるには、現時点ではvscode-deno-canaryが必要です。
以下のように、denoland
で検索すると見つかると思います。
※vscode-deno(canaryではない方)をすでにインストールされている場合は、同一の補完候補が重複して表示されたりするため、一時的に無効化することを推奨します。
vim-lspからdeno lspを使用する方法
以下の設定をvimrcまたはinit.vimに記述すると、vim-lspからdeno lspを利用できるようになります。
if executable("deno")
augroup LspTypeScript
autocmd!
autocmd User lsp_setup call lsp#register_server({
\ "name": "deno lsp",
\ "cmd": {server_info -> ["deno", "lsp"]},
\ "root_uri": {server_info->lsp#utils#path_to_uri(lsp#utils#find_nearest_parent_file_directory(lsp#utils#get_buffer_path(), "tsconfig.json"))},
\ "whitelist": ["typescript", "typescript.tsx"],
\ })
augroup END
endif
isolatedModulesが常に有効化されるようになった
Deno@v1.4
から--unstable
オプションを指定したときのみ、TypeScriptのisolatedModules
が有効化されるようになりました
Deno@v1.6
からこの挙動が変更され、常にisolatedModules
が有効化されるようになりました。(tsconfig.json
によって変更することもできません)
この影響により、既存のアプリケーション・モジュールのコンパイルが失敗するようになる可能性があります。(修正方法についてはこちらの記事を参照ください)
TypeScriptがv4.1にアップグレードされた
Deno内部のTypeScriptがv4.1にアップグレードされました。
これにより、Template Literal Types等の機能がサポートされます。
詳細については、以下を参照ください:
まとめ
この記事ではDenoのv1.6.0でリリースされた新機能について紹介しました。
deno compileやdeno lspコマンドのサポートにより、さらに便利になったと思います。
興味があれば、ぜひDenoをさわってみてください!