2月20日、Deno 2.2がリリースされた。
Deno 2.2では、バンドルされたOpenTelemetryのサポートやLintプラグインの追加、node:sqlite
の対応など、多岐にわたる改善と新機能が含まれている。
以下では主な項目について簡潔に紹介する。
OpenTelemetryを統合
Deno 2.2から、ログやメトリクス、トレースをモニタリングするためのOpenTelemetryがビルトインされた。Denoはデフォルトでconsole.log
やDeno.serve
、fetch
などを自動でインストルメントする。また、npm:@opentelemetry/api
を通じて任意のコードを計測することもできる。
例えば、以下のようなサーバーコードがあったとする。
// server.ts
Deno.serve((req) => {
console.log("Received request for", req.url);
return new Response("Hello world");
});
ログやトレースなどのオブザーバビリティデータを収集するには、OTLPエンドポイントを提供する必要がある。すでにオブザーバビリティシステムが用意されている場合はそれを利用することもできる。
もしそうした用意がない場合は、Dockerを利用してローカルのLGTMスタックを立ち上げるのが簡単だ。
$ docker run --name lgtm -p 3000:3000 -p 4317:4317 -p 4318:4318 --rm -ti \
-v "$PWD"/lgtm/grafana:/data/grafana \
-v "$PWD"/lgtm/prometheus:/data/prometheus \
-v "$PWD"/lgtm/loki:/data/loki \
-e GF_PATHS_DATA=/data/grafana \
docker.io/grafana/otel-lgtm:0.8.1
OpenTelemetry機能はまだ不安定版のため、--unstable-otel
フラグが必要になる。次のコマンドでサーバを起動してアクセスすると、メトリクスやトレースが観測可能となる。
$ OTEL_DENO=true deno run --unstable-otel --allow-net server.ts
Listening on http://localhost:8000/
アクセス後は観測ツールのダッシュボードでログやトレースを確認できる。
上記のサーバーに、ブラウザかcurlなどを用いてアクセスすると、
$ curl http://localhost:8000
Hello world
LGTM スタックを使用している場合は、 http://localhost:3000で Grafana ダッシュボードにアクセスできる。
リンターの更新
Deno付属のdeno lintが大幅にアップデートされ、新たに15個のルールが追加されただけでなく、プラグインシステムが導入された。主にJSXやReactのベストプラクティスに関連するルールが多く、新たにjsx
やreact
というタグも追加されている。
JavaScriptプラグインAPI
今回最大の変更は、外部プラグインで独自ルールを作成できるようになった点である。以下のmy-plugin.ts
は、変数名がfoo
だとエラーを出す単純な例として紹介されている。
my-plugin.ts
export default {
name: "my-lint-plugin",
rules: {
"my-lint-rule": {
create(context) {
return {
VariableDeclarator(node) {
if (node.id.type === "Identifier" && node.id.name === "foo") {
context.report({
node,
message: "Use more descriptive name than `foo`",
});
}
},
};
},
},
},
} satisfies Deno.lint.Plugin;
次のように設定ファイルdeno.json
にプラグインを指定し、deno lint
を実行するとルールが適用される。
deno.json
{
"lint": {
"plugins": ["./my-plugin.ts"]
}
}
main.js
const foo = "foo";
console.log(foo);
$ deno lint main.js
error[my-lint-plugin/my-lint-rule]: Use more descriptive name than `foo`
--> /dev/main.js:1:7
...
node:sqlite
のサポート
node:sqlite
モジュールが追加されたことにより、ローカルデータベースやインメモリDBに簡単にアクセスできるようになった。次のサンプルコードでは、test.db
にレコードを挿入し、取得して表示している。
import { DatabaseSync } from "node:sqlite";
const db = new DatabaseSync("test.db");
// CREATE TABLEステートメントの実行
db.exec(`
CREATE TABLE IF NOT EXISTS people (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
age INTEGER
);`);
// SQL実行
const query = db.prepare(`INSERT INTO people (name, age) VALUES (?, ?);`);
query.run("Bob", 40);
const rows = db.prepare("SELECT id, name, age FROM people").all();
console.log("People:");
for (const row of rows) {
console.log(row);
}
db.close();
$ deno run --allow-read --allow-write db.ts
People:
[Object: null prototype] { id: 1, name: "Bob", age: 40 }
その他の注目点
deno check
の改善
JSDocタグに対応し、JavaScriptファイルでもより強力な型チェックが可能になった。またディレクトリごとに異なるcompilerOptions
を設定できるようになり、プロジェクトごとの柔軟な設定管理が容易になっている。deno task
のアップデート
タスク名にワイルドカードを利用できたり、コマンドを持たないタスクを定義してタスクのグルーピングができるようになるなど、利便性が向上した。Deno.cwd()
のパーミッション緩和--allow-read
なしでも作業ディレクトリの取得が許可されるようになった。deno compile
の高速化・サイズ削減
バイナリサイズが小さくなり、生成時に要点をまとめたサマリーが表示されるようになった。deno bench
の精度向上warmup
やn
といったオプションが復活し、ベンチマーク実行の回数を細かく指定できるようになった。WebTransport
およびQUIC APIの実験的サポート--unstable-net
フラグが必要だが、HTTP/3ベースの新しい通信方式に対応したエコーサーバやクライアントの例が示されている。Node.js / npm互換性の改善
process
、fs
、http
、zlib
などさまざまなモジュールで機能向上やバグ修正が行われている。WebGPUの改善
パフォーマンス面で大きく向上し、Jupyterとの連携でGPUTexture
などが視覚的に表示できるようになった。

Linuxバイナリのサイズ縮小
リンク時最適化(LTO)によって、およそ15MBほど削減されている。TypeScript 5.7 / V8 13.4
TypeScriptやV8エンジンも最新バージョンにアップデートされている。Long Term Support (LTS)
Deno 2.1が引き続きLTSバージョンとしてサポートされ、今後6か月間はバグ修正やセキュリティアップデートが行われる見通しである。
記事内ではこれら以外にも多数の変更点が紹介されている。詳細は[Deno 2.2: OpenTelemetry, Lint Plugins, node:sqlite]を参照していただきたい。