Deno v1.6.0で実装された新機能の紹介

## はじめに

Deno Advent Calendar 2020 10日目の記事です🦕

2020/12/8に[Deno@v1.6.0](https://github.com/denoland/deno/releases/tag/v1.6.0)がリリースされました🥳
この記事では、v1.6.0に含まれる新機能について紹介します。

#### **追記**

記事を書いたあとで気づいたのですが、@maguro_tuna さんのZennの記事と内容がかぶっていました🙏🙇‍♂️

`deno compile`等についてこの記事よりも詳細に書かれているので、よろしければ、以下の記事も参照ください🙇‍♂️

* [Deno 1.6.0 がリリースされたので主要機能の紹介](https://zenn.dev/magurotuna/articles/020f6b103937ed) by @maguro_tunaさん

## 要約

* [deno compileコマンドが実装され、アプリケーションを単一の実行可能ファイルとしてパッケージングできるようになった](#deno-compileコマンドが実装されアプリケーションを単一の実行可能ファイルとしてパッケージングできるようになった)
* [deno lspコマンドによってLanguage Serverが起動できるようになった](#deno-lspコマンドによってlanguage-serverが起動できるようになった)
* [isolatedModulesが常に有効化されるようになった](#isolatedmodulesが常に有効化されるようになった)
* [TypeScriptがv4.1にアップグレードされた](#typescriptがv41にアップグレードされた)

## deno compileコマンドが実装され、アプリケーションを単一の実行可能ファイルとしてパッケージングできるようになった

deno compileコマンドが実装され、denoのアプリケーションを単一の実行可能ファイルとしてパッケージングできるようになりました。(イメージとしては、Node.jsの[pkg](https://github.com/vercel/pkg)パッケージが近いと思います)

### 使い方

```shell
$ deno compile --unstable <パッケージング対象のファイル>
```

上記のような形式でコマンドを実行すると、コマンドライン引数で指定されたファイル及びそのファイルから再帰的に依存されているモジュールがバンドルされ、単一の実行可能ファイルへとパッケージングされます。

試しに、`std/examples/welcome.ts`をパッケージングし、実行してみます。

```shell
$ 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`オプションで指定します。

```shell
$ deno compile --unstable --output awesome-cli cli.ts
$ ./awesome-cli
```

### ユースケース

実践的な使い方としては、以下のように様々な使い方が考えられそうです。

* Webアプリケーションのデプロイ
* CLIツールをバイナリ形式で配布する(例: [dem](https://github.com/syumai/dem)/[deno-udd](https://github.com/hayd/deno-udd))
* [webview_deno](https://github.com/webview/webview_deno)や[carol](https://github.com/uki00a/carol)と組み合わせて、シングルバイナリ形式でGUIアプリケーションを配布する

### 制限

現時点では以下のようにいくつか制限があります。

* クロスコンパイルに対応していない
* dynamic importが動作しない
* パーミッションの指定に対応していない(`--allow-read`, `--allow-net`等)

これらの制限については、すでにissueが起票されており、将来的にはサポートされる可能性もあります。

## deno lspコマンドによってLanguage Serverが起動できるようになった

deno lspコマンドが実装され、deno単体でLanguage Serverが起動できるようになりました。

現時点では、[typescript-language-server](https://github.com/theia-ide/typescript-language-server)等と比較すると、まだまだ実装されている機能は少ないです。

しかし、徐々に不足している機能が追加されていっているため、将来的にはvscode以外のエディタでもdenoを使った開発がしやすくなると思います。

### 現時点で実装されている機能

※LSPの仕様については[lsp_spec_ja](https://github.com/tennashi/lsp_spec_ja)などを参照ください

* `textDocument/definition`
* `textDocument/formatting`
* `textDocument/hover`
* `textDocument/references`
* `textDocument/completion` (部分的)

### 使用方法

#### vscodeからdeno lspを使用する方法

vscodeからdeno lspを連携させるには、現時点では[vscode-deno-canary](https://marketplace.visualstudio.com/items?itemName=denoland.vscode-deno-canary)が必要です。

以下のように、`denoland`で検索すると見つかると思います。

※vscode-deno(canaryではない方)をすでにインストールされている場合は、同一の補完候補が重複して表示されたりするため、一時的に無効化することを推奨します。

![how-to-install-vscode-deno-canary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240412/7e6f9640-3a57-daf5-7d70-75bb7de778ce.png)

#### vim-lspからdeno lspを使用する方法

以下の設定をvimrcまたはinit.vimに記述すると、[vim-lsp](https://github.com/prabirshrestha/vim-lsp)からdeno lspを利用できるようになります。

```vim:vimrc
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`によって変更することもできません)

この影響により、既存のアプリケーション・モジュールのコンパイルが失敗するようになる可能性があります。(修正方法については[こちらの記事](https://qiita.com/uki00a/items/91658e83c47b187b59d3#--unstableオプションを付与するとisolatedmodules及びimportsnotusedasvalues-errorオプションが有効化されるようになった)を参照ください)

## TypeScriptがv4.1にアップグレードされた

Deno内部のTypeScriptがv4.1にアップグレードされました。
これにより、**Template Literal Types**等の機能がサポートされます。

詳細については、以下を参照ください:

* [Announcing TypeScript 4.1](https://devblogs.microsoft.com/typescript/announcing-typescript-4-1)
* [TypeScript v4.1 で導入された機能のお話](https://qiita.com/swallowtail62/items/6851017b8aa218f7ed46)

## まとめ

この記事ではDenoのv1.6.0でリリースされた新機能について紹介しました。
deno compileやdeno lspコマンドのサポートにより、さらに便利になったと思います。
興味があれば、ぜひDenoをさわってみてください!

## 参考

* https://deno.land/posts/v1.6