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
の以下のプロパティが非推奨化されています。
cert
key
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によって生成されたコードキャッシュを保存する仕組みが導入されています。無効化方法などの詳細についてはこちらのページを参照いただければと思います。