🦕

Deno 1.6.0 がリリースされたので主要機能の紹介

2020/12/09に公開

deno illust
Copyright (c) 2018-2020 the Deno authors. MIT License.

こんにちは、@magurotuna です。

日本時間の今日(2020年12月9日)に Deno の v1.6.0 がリリースされました。

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

変更内容は 上記の Deno 1.6 Release Notes にまとまっていますが、特に大きな変更としてリリースノート中でも取り上げられている以下の点を簡単に紹介したいと思います。

  1. deno compile
  2. deno lsp
  3. TypeScript v4.1 へアップグレード、さらに一部のコンパイルオプションの設定変更
  4. M1 Mac サポート

(2020/12/11 追記)
@uki00a さんが Deno Advent Calendar の10日目の記事として同じく 1.6.0 の紹介をされています!
紹介内容自体はほぼ同じですが、僕の紹介よりも詳しく説明されている箇所が数多くあるので、ぜひこちらもご一読ください。
https://qiita.com/uki00a/items/86eae971286d2bff515a
(追記おわり)

1. deno compile ― スタンドアローンな実行バイナリを生成

あるスクリプトに対して、スタンドアローンな実行バイナリを作ることができるコマンド deno compile が追加されました。
これは、Deno への機能追加リクエストの中でも最も多くの賛同意見を集めていた機能であり、コミュニティからはとても熱い歓迎を受けています。

ちょっと試してみましょう。例えば、以下のスクリプトを用意したとします(https://deno.land/std@0.80.0/examples/curl.ts より):

my_curl.ts
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
const url_ = Deno.args[0];
const res = await fetch(url_);
const body = new Uint8Array(await res.arrayBuffer());
await Deno.stdout.write(body);

ファイル名 my_curl.ts の通り、curl コマンドのように URL を引数にとってレスポンスボディを標準出力に書き出すスクリプトです。
このスクリプトを、まずは通常の方法で起動してみましょう。Deno がインストールされていれば、以下のコマンドで起動することができます:

$ deno run --allow-net my_curl.ts https://www.google.com

# 以下のように HTML が返ってきます
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head> 
# (以下略)

これを deno compile によって実行バイナリに変換し、生成されたバイナリを実行してみます:

# compile する。--unstable フラグが必要
$ deno compile --unstable my_curl.ts
Check file:///tmp/my_curl.ts
Bundle file:///tmp/my_curl.ts
Compile file:///tmp/my_curl.ts
Emit my_curl

# my_curl という実行可能ファイルができているので、それを実行
$ ./my_curl https://www.google.com

# さきほどと同じ結果が返ってきます
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head> 
# (以下略)

動きました!
なお、my_curl(実行バイナリ)のサイズは、手元の環境では 50M でした。結構でかいですね。

現在の制約

  • Web Worker はサポートされていない
  • 動的インポートができない
  • V8に渡すフラグおよび Deno のパーミッションフラグ(deno run --allow-net foo.ts--allow-net みたいなやつのこと)が使えない

それぞれ issue が立っており、徐々に対応が進められていく予定です。

将来の展望

静的なアセット(画像など)をバンドルする

実現はしたいが、ECMAScript にプロポーザルとして提出されている import assertions と asset references の動向を見守る、といったスタンスのようです。少なくとも仮想的なファイルシステムを作ることによって無理矢理アセットバンドルを実現する、という方向は目指していなさそう。

https://github.com/tc39/proposal-import-assertions
https://github.com/tc39/proposal-asset-references

クロスコンパイル

今はクロスコンパイルはできません。僕の環境(x86_64 Linux 5.8.11-1-MANJARO)でコンパイルすると、x86-64 Linux向けのバイナリができあがります。
しかし、要望が多ければクロスコンパイルに対応したい、とのこと。

バイナリサイズ削減

上で my_curl.ts のコンパイル結果が 50M になったと書きましたが、このサイズを削減するという展望もあります。
具体的には、Rust の feature フラグ機能を利用して、deno compile 時には、コードを動かすのに必要な最小限のランタイムだけを埋め込むようにする、という方針で実装が進められています。
逆に言うと、今はコードを走らせるのに必要ない機能(例えば、リンターやフォーマッタなど)もたくさん含んだ実行バイナリになってしまっているということです。

これによって、50M から 20M ほどに削減できる見込みのようです。

2. deno lsp ― 組み込みの Language Server

Deno には denoland/vscode_deno という VSCode 向けの LSP 実装がありますが、これのサーバーサイドを deno lsp として Deno の組み込みにしてしまおうという変更です。
こうすることで、deno lsp をLSPのサーバーサイドとして、各エディタ向けのフロントエンドをそれぞれ独自にコミュニティが開発することができるようになります。
早速 @uki00a さんが Vim/Neovim との連携に成功したようです。

また、deno lsp は Rust で実装されているので、速度面でも優位性があると考えられます。

まだごく基本的な機能しか実装されていないですが、今後も精力的に開発が進められていく予定です。

3. TypeScript v4.1 へ + コンパイルオプション変更

組み込まれている TypeScript のバージョンが v4.1.2 へと上がりました。これで界隈を盛り上げた Template Literal Types も使えるようになります。

また、今までは TypeScript コンパイラオプションとして "isolatedModules": false が指定されていたのですが、これが "isolatedModules": true へと変更になりました。

4. M1 Mac (ARM64) の実験的なサポート

これまでは M1 Mac で Deno を動かすためには Rosseta2 を介する必要がありました。しかし、Deno の今回のリリースから、ARM64 Mac 向けのバイナリも配布されるようになりました。

ただし、nightly の Rust を使用していること、CI による自動テスト・ビルドの仕組みがまだ整っていないことから、あくまで「実験的な」サポートという扱いです。とはいえ、テストケースがパスすることは確認されているので、おそらく大丈夫でしょうとのこと。

おわり

Deno はおおよそ週に1回のペースでバグフィックスなどのリリース、1ヶ月半に1回のペースで比較的大きな機能追加などを含むリリースが行われています。
1.7.0 のリリースは年明けになると思いますが、また何か興味深い機能追加があったら紹介していきたいと思います。

Discussion