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

また、配列などに対してタブ補完をした際に、全インデックスが補完されてしまう問題が修正されています。

--watchblob: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.DatagramConnjoinMulticastV4joinMulticastV6メソッドが追加されました。(利用には--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.UdpListenOptionsloopbackオプションが追加されています。

これにtrueを設定すると、送信したマルチキャストパケットが送信元ソケットにループバックされるようになります。(IP_MULTICAST_LOOPIPV6_MULTICAST_LOOPオプションに相当します)

Node.js互換性の改善

node:crypto

  • createCipherivが実装されました。 (aes-128-cbcのみがサポートされています)
  • createHmacでリソースリークが起きる問題が修正されています。

node:process

killを呼ぶと、TypeError: DenoCommand is not a constructorエラーが発生する問題が修正されています。

URLSearchParams.size

URLSearchParamssizeプロパティが実装されました。

const params = new URLSearchParams();

params.set("num", 123);
params.set("str", "foobar");

params.size; // => 2

参考