Deno v2.2がリリースされました。

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

deno lint

JavaScriptプラグインシステムの導入

deno lintのJavaScriptプラグインシステムが正式に導入されました。

プラグインを適用する際は、deno.jsonlint.pluginsで有効化できます。

注意点として、JavaScriptプラグインを有効化している際はdeno lintのインクリメンタルキャッシュの仕組みが無効化されるようです (#28026) インクリメンタルキャッシュについては今後の対応が検討されているようです。

コミュニティーからいくつかプラグインがJSRに公開されています:

React/JSX関連のルールの追加

deno_lintで実装されていたReactやJSX関連のlintルールがDeno本体で有効化されました。

$ deno lint --rules --json | jq '.rules | map(select(.tags | (contains(["jsx"]) or contains(["react"])))) | .[].code'
"jsx-boolean-value"
"jsx-button-has-type"
"jsx-curly-braces"
"jsx-key"
"jsx-no-children-prop"
"jsx-no-comment-text-nodes"
"jsx-no-duplicate-props"
"jsx-no-unescaped-entities"
"jsx-no-useless-fragment"
"jsx-props-no-spread-multi"
"jsx-void-dom-elements-no-children"
"react-no-danger"
"react-no-danger-with-children"
"react-rules-of-hooks"

新しく追加されたこれらのルールにはjsxもしくはreactタグが付与されています。React関連のルールはrecommendedタグがついていなさそうなので、必要に応じてdeno.jsonlint.rules.tagsなどで有効化するとよさそうです:

{
  "lint": {
    "rules": {
      "tags": ["fresh", "react", "recommended"]
    }
  }
}

--rulesの挙動の変更

deno lint --rulesの挙動が変更されています。

今までは無効化されているルールは表示されませんでしたが、Deno v2.2からは無効化されているものも含め利用可能なルールがすべて表示されるように挙動が変更されています。有効化されているルールにはマークが表示されるため、見分けることはできそうです。

また、deno lint --json --rulesからマークダウンドキュメントが削除されています。(代わりに公式ドキュメントへのリンクが表示されます)

Deno API

WebTransport

WebTransport API及びDeno.upgradeWebTransportが実装されています。これらのAPIの利用には--unstable-netが必要です

Deno.upgradeWebTransportDeno v2.1.5で導入されたQUICのサポートとの併用が想定されており、引数としてDeno.QuicConnを受け取り、WebTransportインスタンスを返却します。

Deno.cwd()--allow-readが不要化

Deno.cwd()--allow-readパーミッションが要求されなくなりました。元々、Errorを意図的にthrowしてスタックトレースを解析することでカレントディレクトリを判断することができたため、権限を要求する必要性が薄いと判断されたようです。

Deno.cpuUsage()

Deno.cpuUsage()が実装されています。戻り値の形式はnode:processprocess.cpuUsage()と同様です。

また、node:processprocess.cpuUsage()も合わせて実装されています。

OpenTelemetry

Deno.serve()のMetricsの拡充

Deno.serve()に関して以下のMetricsが追加されています。

  • http.server.request.duration
  • http.server.active_requests
  • http.server.request.body.size
  • http.server.response.body.size

Spanでのリンクの設定

Span#addLinkなどによるリンクの設定がサポートされています。

node:sqlite

Denoにnode:sqliteモジュールが追加されました。インメモリーデータベース(:memory:)を利用する場合を除いて、該当のデータベースファイルに対する読み込み(--allow-read)と書き込み権限(--allow-write)を与える必要があります (ただし、readOnly: trueを指定した場合は書き込み権限は要求されません)

import { join } from "node:path";
import { DatabaseSync } from "node:sqlite";

const denoDir = Deno.env.get("DENO_DIR");
const db = new DatabaseSync(join(denoDir, "check_cache_v2"), {
  readOnly: true,
});
const stmt = db.prepare("SELECT * FROM tsbuildinfo");
const rows = stmt.all();
for (const row of rows) {
  console.info(row.specifier);
}
db.close();

Web API

Temporal

Temporal.ZonedDateTime#getTimeZoneTransitionが実装されています。

createImageBitmap()の互換性の改善

createImageBitmap()に感して以下のような改善が実施されています:

  • jpeg/png/bmp/ico形式がサポート
  • colorSpaceConversionオプションがサポート
  • 引数としてImageBitmapがサポート

Web Cache API

Web Cache APIのバックエンドとしてlscacheというものがサポートされているようです (#27628)

詳細についてはわからないのですが、DENO_CACHE_LSC_ENDPOINT環境変数にカンマ区切りでエンドポイントとトークンを指定することで有効化できるようです。

deno outdated

依存関係の対話的な更新がサポート

deno outdatedで依存関係の対話的な更新がサポートされました。--update--interactiveを併用することで、Denoが対話的に依存関係を更新するUIを表示してくれます:

$ deno outdated --update --interactive
? Select which packages to update (<space> to select,↑/↓/j/k to navigate, a to select all, i to invert selection,
enter to accept, <Ctrl-c> to cancel)
❯ ○ jsr:@hono/hono       4.6.14 -> 4.7.2
  ○ npm:@nestjs/common   10.4.4 -> 10.4.15
  ○ npm:@nestjs/core     10.4.4 -> 10.4.15
  ○ jsr:@oak/oak         17.1.0 -> 17.1.4

deno task

ワイルドカード指定(*)によるタスクの一括実行がサポート

指定されたパターンにマッチするタスクをまとめて実行することができます:

# `check:`から始まるタスクをまとめて実行します
$ deno task 'check:*'

--frozenのサポート

deno task--frozenオプションがサポートされています。

"nodeModulesDir": "auto"が有効化されている際にdeno taskでエラーが起きてしまうことがあるようで、その場合に--frozen=falseを指定することで回避できるようにすることが目的のようです。

deno check

compilerOptions.rootDirsのサポート

deno checkコマンドでTypeScriptのcompilerOptions.rootDirsがサポートされました。

npmの依存解決失敗時のエラーの改善

deno checkコマンドにおいて、npmの依存関係の解決に関するエラーがtscと同様の形式で表示されるよう改善されています。

deno compile

sloppy importsのサポート

deno compilesloppy importsを認識してくれるよう改善されています。

sloppy importsは"unstable": ["sloppy-imports"]--unstable-sloppy-importsなどで有効化できます。

deno jupyter

GPUTextureGPUBufferの表示がサポート

GPUTextureimage/png, GPUBuffertext/plain形式で解釈されるようです (#28117に動画があります)

deno bench

--permit-no-filesオプション

deno benchコマンドに--permit-no-filesオプションが追加されています。deno testの同名オプションと同様に、このオプションが指定されると、ベンチマークファイルが検出されない場合にエラーが発生しなくなります。

Deno.benchwarmup/nオプションが追加

Deno.bench()v1.21で削除されたwarmupnオプションが再追加されました。

その他

TypeScript v5.7

Deno本体に組み込まれたTypeScriptがv5.7.3へアップデートされています。

これに合わせて、deno_stdにおいてもTypeScript v5.7への対応がすでにリリースされています (articles/2025/02/02)

V8 v13.4

Deno本体に組み込まれたV8が13.4へアップデートされています。

ワークスペースにおけるimportMapサポートの改善

ワークスペースのルートのdeno.jsonimportMapが定義されていると、各メンバーのimportMapがうまく動作しない問題が修正されています。

macOSにおけるXDG_CACHE_HOMEのサポート

macOSにおいてDenoのグローバルキャッシュ(DENO_DIR)を決定する際にXDG_CACHE_HOMEが考慮されるよう改善されています。

おわりに

このページは主にリリースノートを参考に記載されています。

Denoの公式ブログにおいては、OpenTelemetryサポートについて正式に発表されています。また、ワークスペースの各メンバーごとにcompilerOptionsオプションを定義できるようにする改善などについても言及されています。