Deno v1.43がリリースされました。
この記事では主な変更点などについて解説します。
HTTPサーバー
deno serveコマンド
HTTPサーバーの起動を簡略化するためにdeno serveコマンドが追加されました。
使い方などについてはこちらのページを参照いただければと思います。
公式ブログによると、将来的にはロードバランシングなどの仕組みをdeno serveコマンドに導入することなども検討されているようです。
Request.signalのサポート
Deno.serveのハンドラーに渡されるRequestオブジェクトでsignalプロパティがサポートされています。
これについても詳細はこちらのページを参照いただければと思います。
Deno.HttpServer.addr
Deno.HttpServerにaddrプロパティが追加されています。HTTPサーバーの起動ポートなどを確認できます。
const server = Deno.serve((req) => new Response("OK"));
console.info(server.addr.port); // => 8000
TypeScript
compilerOptions.jsxImportSourceTypes
deno.jsonにcompilerOptions.jsxImportSourceTypesというDeno独自のオプションが導入されました。
{
"compilerOptions": {
"jsx": "react-jsx",
"jsxImportSource": "npm:react@18.3.1",
"jsxImportSourceTypes": "npm:@types/react@18.3.1"
}
}
JSX Transformを有効化した場合、TypeScriptは<some-jsx-package>/jsx-runtimeをimportするようなコードを生成します。
// 例) Reactの場合、以下のようなコードが生成されます
import {jsx as _jsx} from 'react/jsx-runtime';
// ...
元々、この<some-jsx-package>/jsx-runtimeのimportに対して適用すべき型定義を判断する方法がDenoには存在せず、JSX Transformを有効化してReactなどを使う場合に型エラーが発生する課題がありました。(TypeScriptによって自動生成されるコードのため@deno-typesプラグマを適用することもできない)
この課題を解消するため、compilerOptions.jsxImportSourceTypesが導入されたようです。このオプションを指定することで、上記のような<some-jsx-package/jsx-runtimeのimportに対して、Denoがどの型定義を適用すればよいか判断できるようになります。また、@jsxImportSourceなどと同様に、ソースコード内で@jsxImportSourceTypesプラグマを指定することも可能です。
/** @jsxImportSourceTypes npm:@types/react@18.3.1 */
Preactの場合はパッケージ内に型定義が同梱されているのでこの問題が起きなかったようなのですが、Reactの場合は@types/reactで別管理されている関係もあり、専用の解決策が必要と判断されて導入されたようです。
compilerOptions.jsxPrecompileSkipElements
deno.jsonにcompilerOptions.jsxPrecompileSkipElementsというDeno独自のオプションが導入されています。precompiled JSX transformによる最適化の適用対象外とするHTML要素を一覧で指定できます。
{
"compilerOptions": {
"jsx": "precompile",
"jsxImportSource": "preact",
"jsxPrecompileSkipElements": ["a"]
},
"imports": {
"preact": "https://esm.sh/preact@10.19.6",
"preact/": "https://esm.sh/preact@10.19.6/"
}
}
サイドエフェクトimportに関する変更
deno checkなどによる型チェックで.cssなどのモジュールに対するサイドエフェクトimportが検出された際に、型エラーが発生しないように挙動が修正されました。
import "./app.css";
Import maps
workspaceメンバーの自動登録がサポート
各ワークスペースのメンバーがImport mapsへ自動で登録される機能が導入されています。
例えば、deno.jsonで以下のようにワークスペースが定義されていたとします。Import maps(imports)は定義されていません。
{
"workspaces": ["foo"]
}
foo/deno.jsonの内容は以下のように定義されていたとします。
{
"name": "@testing/foo",
"version": "0.0.1",
"exports": {
".": "./mod.ts"
}
}
foo/mod.tsは以下のように定義されています。
export function foo() {
return 123;
}
この場合、fooワークスペース(@testing/foo)は自動でImport mapsに登録され、以下のようにbare specifierを指定してimportできます。
// main.ts
import { foo } from "@testing/foo";
console.info(foo()); // => 123
importMapで祖先のディレクトリの指定がサポート
deno.jsonのimportMapオプションで祖先のディレクトリにあるImport mapsファイルが指定できるように改善されています。
{
"importMap": "../import_map.json"
}
Deno API
Deno.UnsafeWindowSurfaceでのWaylandのサポート
Deno.UnsafeWindowSurfaceでWaylandのサポートが追加されています。
feat(ext/webgpu): support create UnsafeWindowSurface on Wayland #23423
今のところまだ対応しているライブラリなどは見当たらなそうですが、今後、登場する可能性もあるかもしれません。
TLS関連のオプションに関する非推奨化
Deno.serve()のTLS関連のオプションを定義しているDeno.ServeTlsOptionsの以下のプロパティが非推奨化されています。
certkey
Deno.serve()から上記オプションが削除されたわけではなく、引き続きこれらのオプションは使用可能です。プロパティの定義がDeno.ServeTlsOptionsからDeno.TlsCertifiedKeyOptions (Deno.TlsCertifiedKeyPem)に移動されています。
Deno.createHttpClient()でも同様の変更が行われており、今後はTLS関連のオプションについてはDeno.TlsCertifiedKeyOptionsを使用して型を定義するとよさそうです。
DENO_FUTURE=1指定時の対応の拡充
DENO_FUTURE=1が設定されている際に、以下の変更が適用されるようになりました。
Deno.connectTlsの非推奨化されているオプションの無効化
下記オプションが無効化されます。
| 対象オプション | 移行先 |
|---|---|
certFile | certオプション |
certChain | certオプション |
privateKey | keyオプション |
Deno.listenTlsの非推奨化されているオプションの無効化
下記オプションが無効化されます。
| 対象オプション | 移行先 |
|---|---|
keyFile | keyオプション |
certFile | certオプション |
Deno.customInspectの削除
Symbol.for("Deno.customInspect")への移行が推奨されます。
Import Assertionsの無効化
Import Attributesへの移行が推奨されます。
deno task
npmバイナリの実行がサポート
package.jsonで管理されているnpmパッケージに付属しているコマンドをdeno taskにより実行できるようになりました
$ npm install --save-dev cowsay
$ cat deno.json | jq .tasks
{
"hi": "cowsay hi"
}
$ deno task hi
Task hi cowsay hi
____
< hi >
----
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Node.js互換性の改善
各組み込みパッケージの改善やNODE_DEBUGのサポートなど、様々な改善が行われています。また、このリリースに伴い、@grpc/grpc-js/examples/helloworld/dynamic_codegen/greeter_client.jsが動作するようになったようです。
node:process:beforeExit/exitがリスナーの有無に関わらず常に発火されるように改善node:process:process.killがRustで再実装されました (今まではkillコマンドなどを子プロセスとして起動することにより実装されていました)node:process:process.stdinでunref/refメソッドがサポートnode:worker_threads:Workerでenvオプションがサポートnode:worker_threads:MessagePortでoff/removeListenerメソッドが実装node:fs:cpで宛先ファイルのディレクトリがない場合に自動で作成するように改善node:http:maxHeaderSizeが追加node:crypto: RSA公開鍵のexportがサポート
Web API
URL.parse
URL.parseが実装されました。与えられた引数がURLとして解析できない場合、nullを返却してくれます。
URL.parse("invalid-url"); // => null
URL.parse("http://localhost:8000/") instanceof URL; // => true
Float16Array
Float16Arrayがサポートされました。
パフォーマンス改善
deno lsp
deno lspのパフォーマンスが改善されているようです。公式ブログによると、巨大なプロジェクトでは自動補完に6〜8秒程時間がかかることもあったようですが、現在は1秒以内に収まる程度まで高速化されているようです。
Deno本体にもdeco-cx/appsを使用したベンチマークの仕組みが導入されており、これにより計測などが行われているようです。
V8コードキャッシュ
Denoの起動を高速化するためにV8によって生成されたコードキャッシュを保存する仕組みが導入されています。無効化方法などの詳細についてはこちらのページを参照いただければと思います。