Deno v1.26がリリースされました。
この記事では主な変更点などについて解説します。
--allow-sysオプションの追加
Deno.osReleaseやDeno.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のデータベースやキャッシュされたコンテンツなどが保存されます。
制限
現時点では、いくつかの制限があるようです。
ignoreSearchやignoreMethodなどのクエリオプションはまだサポートされてないようです。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ディレクトリに依存したパッケージを動かすための機能です。
- Viteなどの
--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
また、その他にも以下のような改善が行われています。
- パーミッションプロンプトの改善
- パッケージダウンロードの進捗が表示されるように
deno replでCtrl+Cを連続で押すとREPLが停止するように
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などで表示しようとすると、エラーが発生する問題が修正されています。