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

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

HTTPサーバー

deno serveコマンド

HTTPサーバーの起動を簡略化するためにdeno serveコマンドが追加されました。

使い方などについてはこちらのページを参照いただければと思います。

公式ブログによると、将来的にはロードバランシングなどの仕組みをdeno serveコマンドに導入することなども検討されているようです。

Request.signalのサポート

Deno.serveのハンドラーに渡されるRequestオブジェクトでsignalプロパティがサポートされています。

これについても詳細はこちらのページを参照いただければと思います。

Deno.HttpServer.addr

Deno.HttpServeraddrプロパティが追加されています。HTTPサーバーの起動ポートなどを確認できます。

const server = Deno.serve((req) => new Response("OK"));
console.info(server.addr.port); // => 8000

TypeScript

compilerOptions.jsxImportSourceTypes

deno.jsoncompilerOptions.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-runtimeimportするようなコードを生成します。

// 例) Reactの場合、以下のようなコードが生成されます
import {jsx as _jsx} from 'react/jsx-runtime';

// ...

元々、この<some-jsx-package>/jsx-runtimeimportに対して適用すべき型定義を判断する方法がDenoには存在せず、JSX Transformを有効化してReactなどを使う場合に型エラーが発生する課題がありました。(TypeScriptによって自動生成されるコードのため@deno-typesプラグマを適用することもできない)

この課題を解消するため、compilerOptions.jsxImportSourceTypesが導入されたようです。このオプションを指定することで、上記のような<some-jsx-package/jsx-runtimeimportに対して、Denoがどの型定義を適用すればよいか判断できるようになります。また、@jsxImportSourceなどと同様に、ソースコード内で@jsxImportSourceTypesプラグマを指定することも可能です。

/** @jsxImportSourceTypes npm:@types/react@18.3.1 */

Preactの場合はパッケージ内に型定義が同梱されているのでこの問題が起きなかったようなのですが、Reactの場合は@types/reactで別管理されている関係もあり、専用の解決策が必要と判断されて導入されたようです。


compilerOptions.jsxPrecompileSkipElements

deno.jsoncompilerOptions.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.jsonimportMapオプションで祖先のディレクトリにある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の非推奨化されているオプションの無効化

下記オプションが無効化されます。

対象オプション移行先
certFilecertオプション
certChaincertオプション
privateKeykeyオプション

Deno.listenTlsの非推奨化されているオプションの無効化

下記オプションが無効化されます。

対象オプション移行先
keyFilekeyオプション
certFilecertオプション

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.stdinunref/refメソッドがサポート
  • node:worker_threads: Workerenvオプションがサポート
  • node:worker_threads: MessagePortoff/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によって生成されたコードキャッシュを保存する仕組みが導入されています。無効化方法などの詳細についてはこちらのページを参照いただければと思います。

参考