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
が要求されるため注意が必要そうです。
その他にも以下の改善などが実施されています。
peerDependencies
がサポートdeno info --json
でnpm:
がサポートimport.meta.resolve
でnpm:
が無効化
今後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 ] }
その他の改善内容
Response
のjson
/redirect
/error
メソッドにenumerable: true
が設定stream: false
が指定された際のTextDecoder.decode()
のパフォーマンスが向上deno cache
コマンドのパフォーマンスが向上