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

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

--allow-sysオプションの追加

Deno.osReleaseDeno.systemMemoryInfoなどのシステム情報を取得するためのAPIの利用を制御するために、--allow-sysオプションが追加されました。

$ deno run --unstable --allow-sys=osRelease,systemMemoryInfo main.js

元々、これらのAPIを使うには--allow-envの指定が必要でした。

ただ、これらのAPIの利用に--allow-envを要求することの副作用として、全ての環境変数にアクセスできるようになってしまうという問題がありました。

この問題を解決するため、--allow-sysという新しいパーミッションが導入されました。

Cache APIのサポート

DenoにCache APIが実装されました。

const cache = await caches.open("v1");

const req = new Request("https://example.com/");
console.assert(await cache.match(req) === undefined);

const res = new Response("foobar");
await cache.put(req, res);

const cachedRes = await cache.match(req);
console.assert(await cachedRes?.text() === "foobar");

挙動について

localStorageなどと同様にSQLiteをベースに実装されており、利用する際は特にパーミッションなどは要求されません。

ただし、localStorageとは異なり、DENO_DIRではなく/tmp/deno_cacheにSQLiteのデータベースやキャッシュされたコンテンツなどが保存されます。

制限

現時点では、いくつかの制限があるようです。

  • ignoreSearchignoreMethodなどのクエリオプションはまだサポートされてないようです。
  • Cache.deleteを呼んだ際に、SQLiteデータベースに保存されたメタデータは削除されるものの、キャッシュされたコンテンツは削除されないようです。

npmパッケージサポートの改善

今回のv1.26のリリースでは、--no-npmオプションが実装されています。

これにより、npm:によるnpmパッケージのimportを無効化できます。

$ deno run --no-npm main.ts

また、Denoでnpmパッケージのimportがサポートされたことにより、Deno v1.25.2でNode.js互換モードが削除されています。

--compatは動かなくなっているためご注意ください

$ deno run --compat --unstable main.mjs

上記以外にも、様々な改善が行われています。

例)

  • deno infoでnpmパッケージのキャッシュ場所が表示されるようになりました (v1.26.0)
  • --node-modules-dirオプションのサポート (v1.25.4)
    • Viteなどのnode_modulesディレクトリに依存したパッケージを動かすための機能です。
  • --reload=npm:によるnpmパッケージの再読込のサポート (v1.25.4)

unstable APIの有効化について

今まで利用に--unstableが必要であった以下のAPIが安定化されています。

また、Deno.setRaw()Deno.stdin.setRaw()へ移動しています。このDeno.stdin.setRaw()は、次のv1.27での安定化が予定されているようです。

また、Deno v1.25で実装されたDeno.serve()についてもv1.27で安定化が予定されているようです。

Deno.serve()SO_REUSEPORTがサポート

Deno v1.25で実装されたDeno.serve()reusePortオプションがサポートされています。

このオプションにtrueを指定すると、SO_REUSEPORTオプションが有効化されます (Linuxのみ)

パフォーマンスチューニング

このリリースでも、様々なパフォーマンスチューニングが実施されています。

  • TextEncoder#encodeInto()が小さなデータに対しては5倍近く高速化、大きなデータに対しては30倍近く高速化されたようです。
  • URLオブジェクトにおけるクエリ文字列を持たないURLの解析が2倍、クエリ文字列を持ったURLは1.3倍まで高速化されたようです。
  • console.logが小さなデータに対して5倍程高速化されたようです。
  • ファイルシステム関連の各APIが高速化されています。

UI改善

deno lint--compactオプションが追加されています。

これを指定すると、実行結果が簡略化された形式で表示されます。

$ deno lint --compact
/home/uki00a/sandbox/a.ts: line 5, col 11 - Empty block statement (no-empty)
/home/uki00a/sandbox/b.ts: line 11, col 4 - `mode` is never used (no-unused-vars)
Found 2 problems
Checked 2 files

また、その他にも以下のような改善が行われています。

TypeScript v4.8

Deno内部のTypeScriptがv4.8にアップデートされています。

その他の変更点

  • Crypto APIでX25519とEd25519がサポートされました (Secure Curves in the Web Cryptography API)
  • JSON Moduleがimportされているとdeno vendorが動作しない問題が修正されています
  • ProxyでラップされたDateオブジェクトをconsole.logなどで表示しようとすると、エラーが発生する問題が修正されています。

参考