Deno v1.32がリリースされました。
この記事では主な変更点などについて解説します。
WebGPU APIの削除
Deno v1.8で追加されたWebGPU APIが削除されました。
バイナリサイズや起動速度に影響があったというのが理由のようです。
ただし、削除は一時的なもののようで、将来的には再びWebGPU APIが追加される想定のようです。
KVストア
Deno本体にKVストアが実装されています。
ただし、こちらについてはまだ公式では紹介などはされておらず、今後、APIなどに大きな変更が入る可能性もあります。
詳細については、以下の記事を参照いただければと思います。
TypeScript
TypeScript v5.0.2へのアップデート
Deno内部に搭載されているTypeScriptがv5.0.2へアップデートされました。
ただし、制限として、ES Decoratorsのサポートについては現時点では除外されているようです。
--allを指定しなかった際の初回の型チェックの実行が高速化
Denoでは型チェックの実行結果をSQLiteにキャッシュしておくことで、型チェックの効率化を図っています。
しかし、初回の型チェック実行時についてはこのキャッシュの仕組みが効かないため、型チェックの実行効率が少し落ちてしまいます。
この問題を解消するために、--allが指定されていない際は、ローカルのファイルのみを型チェックするように挙動が変更されました。
これによって、キャッシュが効いていない場合でも、場合によっては2倍程度の高速化が見られることもあるようです。
CLIに関する改善
deno compileでdynamic importとWeb Workerがサポート
deno compileでdynamic importとWeb Workerを使用したコードのバイナリが作成できるようになりました。
例えば、以下のようなファイルがあったとします。
// sum.js
export function sum(...numbers) {
  return numbers.reduce((a, b) => a + b, 0);
}
// main.js
const { sum } = await import("./sum.js");
console.info(sum(1, 2, 3));
このようにシンプルなケースでは、特に設定などは不要でうまく動いてくれます。
$ deno compile -o main main.js
$ ./main
6
ただし、制限として、dynamic importやWorkerに与えるURLやパスを動的に組み立てている場合、読み込まれる対象となるファイルをdeno compileコマンドは認識することができません。
そういったケースに備えて、deno compileに--includeオプションが追加されています。
例えば、以下のようにimport.meta.resolveなどを使用してURLを動的に作成している場合などにこのオプションを指定する必要があります。
// main.js
const { sum } = await import(import.meta.resolve("./sum.js"));
console.info(sum(1, 2, 3));
--includeを指定しない場合、以下のようにエラーが発生します。
$ deno compile -o main main.js
$ ./main
error: Uncaught (in promise) TypeError: Module not found
const { sum } = await import(import.meta.resolve("./sum.js"));
--includeを指定すると、うまく動作するようになります。
$ deno compile -o main --include=sum.js  main.js
$ ./main
6
--extオプションの追加
deno compile/deno run/deno bundleコマンドで--extオプションがサポートされました。
このオプションは、主に拡張子を持たないスクリプトを実行する場合に指定することが想定されているようです。
$ deno run --ext ts some_script_without_extension
deno replの改善
DENO_REPL_HISTORY環境変数がサポートされました。
この環境変数を設定することで、ヒストリの保存先を変更できます。また、この変数に空を設定した場合は、ヒストリの保存が無効化されます。
$ DENO_REPL_HISTORY=./deno_repl_history.txt deno repl
また、配列などに対してタブ補完をした際に、全インデックスが補完されてしまう問題が修正されています。
--watchとblob:URLの併用
--watchオプションとblob:URLを併用すると、エラーが発生する問題が修正されました。
Deno API
WindowsでのDeno.FileInfo.devサポート
今までは、WindowsではDeno.FileInfo.devにはnullが設定されていました。 (このオブジェクトはDeno.statなどのAPIから返却されます)
今回のリリースでは、このプロパティに値が設定されるように改善されました。
この影響により、Deno.FileInfo.devプロパティの型定義がnumber | nullからnumberへ変わっています。
マルチキャストのサポート
Deno.DatagramConnにjoinMulticastV4とjoinMulticastV6メソッドが追加されました。(利用には--unstableの指定が必要になります)
これらのメソッドは、それぞれIP_ADD_MEMBERSHIP及びIPV6_ADD_MEMBERSHIPに対応し、Deno.MulticastV4Membership/Deno.MulticastV6Membershipを返却します。
これらのオブジェクトには、以下のメソッドが定義されています。
- leave():- IP_DROP_MEMBERSHIP/- IPV6_DROP_MEMBERSHIPに対応します。
- setLoopback():- IP_MULTICAST_LOOP/- IPV6_MULTICAST_LOOPオプションを設定できます
- setTTL():- IP_MULTICAST_TTLオプションを設定できます (- Deno.MulticastV4Membershipのみ)
また、Deno.UdpListenOptionsにloopbackオプションが追加されています。
これにtrueを設定すると、送信したマルチキャストパケットが送信元ソケットにループバックされるようになります。(IP_MULTICAST_LOOPやIPV6_MULTICAST_LOOPオプションに相当します)
Node.js互換性の改善
node:crypto
- createCipherivが実装されました。 (- aes-128-cbcのみがサポートされています)
- createHmacでリソースリークが起きる問題が修正されています。
node:process
killを呼ぶと、TypeError: DenoCommand is not a constructorエラーが発生する問題が修正されています。
URLSearchParams.size
URLSearchParamsにsizeプロパティが実装されました。
const params = new URLSearchParams();
params.set("num", 123);
params.set("str", "foobar");
params.size; // => 2