Deno v1.28がリリースされました。

この記事では主な変更点などについて解説します。

npmパッケージサポートの安定化

Deno v1.25で実装されたnpmパッケージサポートが安定化されました。

今後は--unstableなしでnpmパッケージを読み込むことができます。

$ cat main.js
import chalk from "npm:chalk@5.1.2";

console.log(chalk.green("Deno"));

$ deno run --allow-read --allow-env main.js

ただし、リモートモジュールの中にnpm:が含まれていた際は、従来どおり--unstableが要求されるため注意が必要そうです。

その他にも以下の改善などが実施されています。

今後npmパッケージサポートに関して計画されている変更内容についてはロードマップを参照ください。

ロックファイルの自動適用と生成がサポート

Denoにはアプリケーションが依存するサードパーティモジュールの内容を元にハッシュ値を計算し、ロックファイルと呼ばれるファイルに保存する機能があります。

アプリケーションを実行する際にサードパーティモジュールから再度ハッシュ値を計算し、ロックファイルに書き込まれたハッシュ値と比較することで、サードパーティモジュールの内容が改ざんされていないことを保証することができます。(インテグリティチェック)

この挙動を有効化するには、従来では--lock--lock-writeの指定が必要でした。

このリリースでは、deno.json(c)が存在する場合、ロックファイル(deno.lock)の生成とインテグリティチェックが自動で実施されるように挙動が変更されました。

$ ls
deno.json  main.js

$ deno run main.js

$ ls
deno.json  deno.lock  main.js

この変更に合わせて、既存のオプションやインテグリティチェックに関する挙動も一部変更されています。

  • --lockオプションの引数がオプショナルに変更 (デフォルトはdeno.lock)
  • ロックファイルに列挙されていないパッケージが見つかった際に、インテグリティチェックが失敗しないように挙動が変更
    • 新しく検出されたパッケージについては、ハッシュが自動でロックファイルに書き込まれます。そのパッケージのインテグリティチェックについては、次回以降のDenoの実行から適用されます。

また、このロックファイルの自動適用と生成を無効化するために--no-lockという新しいオプションも追加されています。

Deno.Commandの追加

Deno.CommandというDenoからサブプロセスを生成するための新しいAPIが実装されました。

利用するには--unstable--allow-runの指定が必要です。

使用例

コマンドの実行結果の非同期での取得:

const command = new Deno.Command("deno", { args: ["info"] });
const { stdout } = await command.output();
console.log(new TextDecoder().decode(stdout));

コマンドの同期実行:

const command = new Deno.Command("deno", { args: ["info"] });
const { stdout } = command.outputSync();
console.log(new TextDecoder().decode(stdout));

サブプロセスの標準入出力とのやり取り:

const command = new Deno.Command("deno", {
  args: ["fmt", "--ext=json", "-"],
  stdin: "piped",
});
command.spawn();
const file = await Deno.open("deno.json");
file.readable.pipeTo(command.stdin);

const { stdout } = await command.output();
console.info(new TextDecoder().decode(stdout));

const status = await command.status;
console.info(status.success);

導入の背景

Deno v1.21で下記の3つのAPIが導入されました。

  • Deno.spawn() (高レベルAPI)
  • Deno.spawnChild() (低レベルAPI)
  • Deno.spawnSync() (Deno.spawnの同期版)

しかし、同様の役割を持ったAPIが3種類あるとややこしいということなどもあり、Deno.Commandという単一のAPIが新しく導入されました。

deno benchコマンドの安定化

Deno v1.20で実装されたdeno benchコマンドとDeno.benchが安定化されました。

今後は--unstableオプションなしで利用することができます。

不安定APIの安定化

下記APIが安定化されました。

  • Deno.networkInterfaces()
  • Deno.systemMemoryInfo()
  • Deno.uid()
  • Deno.gid()

今後は--unstableオプションなしで利用できます。

V8 v10.9へアップデート

Denoの内部で使用されているV8がv10.9へアップデートされています。

proposal-array-groupingのサポートが追加されています。

配列にgroupメソッドやgroupToMapメソッドなどが定義されており、指定した関数の戻り値を元に、配列の内容をグループ化することができます。

console.log([5.6, 4.1, 3.5, 4, 5.2].group(Math.floor));

この機能を利用するには、現時点ではharmonyフラグを指定する必要があります。

$ deno run --v8-flags=--harmony-array-grouping main.js
{ "3": [ 3.5 ], "4": [ 4.1, 4 ], "5": [ 5.6, 5.2 ] }

その他の改善内容

  • Responsejson/redirect/errorメソッドにenumerable: trueが設定
  • stream: falseが指定された際のTextDecoder.decode()のパフォーマンスが向上
  • deno cacheコマンドのパフォーマンスが向上

参考