1月22日、Denoで「Deno in 2024」と題した記事が公開された。この記事では、Deno 2のリリースを中心に、Nodeやnpmとの後方互換性、依存管理における性能向上、JSRという新しいJavaScriptレジストリの導入など、2024年におけるDeno関連の技術的進化について詳しく紹介されている。
以下に、その内容を簡潔にまとめて紹介する。
Deno 2の概要と主なアップデート
Denoの開発チームは2024年に、プログラミングの単純化を目指して複数の重要な取り組みを行った。最大のトピックとして挙げられるのは、Nodeやnpmと後方互換性をもたせたDeno 2のローンチである。このリリースに伴い、以下のような改善点が示された。
- NodeアプリケーションをDeno 2上で実行できるようにするための互換レイヤーを提供し、
package.json
やnode_modules
をネイティブにサポート - npmパッケージとの互換性を大幅に強化し、
@grpc/grpc-js
やplaywright
、@google-cloud
など多彩なモジュールが利用可能に - Rust製のV8バインディング
rusty_v8
を開発し、JavaScriptランタイム実装や埋め込み用途で安定版として活用 - モノレポやワークスペース管理に対応し、
deno.json
やpackage.json
を組み合わせて柔軟なプロジェクト構成が可能に
Nodeとの後方互換性とnpmサポート
特に注目される点として、Deno 2はNodeとnpmの後方互換性を重視している。これはpackage.json
を理解し、window
の排除やprocess
の導入といった変更を行うことで実現された。CommonJSのサポートも改善され、.cjs
拡張子への対応やエラーメッセージの明確化などが進められている。
Deno 2では、既存のNodeプロジェクトをそのままDeno上で動かすことが可能であるほか、playwright
、prisma
、sqlite3
、duckdb
などのnpmパッケージも利用できる。Next.jsやAstro、RemixなどのJavaScriptフレームワークとの連携も確認されている。
組み込みの高速依存管理
Deno 2にはパッケージ管理機能が組み込まれ、deno install
、deno add
、deno remove
といったコマンドが追加された。これらのコマンドはnpmと類似の動作をするが、依存関係のインストール速度において大幅な性能向上が見られる。
また、npmライフサイクルスクリプトへの対応として--allow-scripts
フラグが追加され、以下のようにnpm:duckdb
を指定できる。
deno install --allow-scripts=npm:duckdb
プライベートnpmレジストリにも対応し、.npmrc
ファイルを活用した以下のような設定が可能である。
@mycompany:registry=http://mycompany.com:8111/
新たなJavaScriptレジストリ「JSR」
2024年には、JavaScriptレジストリとしてJSRが公開された。TypeScriptをネイティブで扱え、JSDocコメントからドキュメントを自動生成し、npm互換のパッケージマネージャとも連携できるのが大きな特徴である。
以下はdeno publish
によるパッケージ公開を補助するコマンドの例である。
deno init --lib
# 生成されたプロジェクトでテストを実行
deno test
# ファイルの変更を監視しながらテストを実行
deno task dev
# 公開のドライラン
deno publish --dry-run
クロスプラットフォーム実行ファイルの高速化とサイズ削減
Denoはdeno compile
を使ってJavaScript/TypeScriptを単一の実行ファイルにまとめることができる。2024年にはバイナリサイズを最大50%削減し、コード署名やアセットバンドルといった新機能も追加された。V8コードキャッシュにより起動速度が向上したことで、例えばnpm
自体をDenoでコンパイルすると、通常のnpm実行より起動が約1.9倍高速になるというベンチマーク結果が示されている。
# hyperfine "./npm -v" "npm -v"
Benchmark 1: ./npm -v
Time (mean ± σ): 40.1 ms ± 2.0 ms
Benchmark 2: npm -v
Time (mean ± σ): 75.2 ms ± 7.6 ms
./npm -v は npm -v より1.87倍速い
より高速でシンプルなWebサーバ: deno serve
DenoでWebサーバを構築する際に利用されるDeno.serve()
は、最大で8〜15%の速度向上が図られた。さらにdeno serve
コマンドが追加され、以下のようにデクララティブにサーバを定義できるようになった。
export default {
fetch(request) {
return new Response("Hello world");
},
};
$ deno serve server.ts
deno serve: Listening on http://localhost:8000/
マルチスレッドでの並列サーバも--parallel
フラグによって簡易に実現可能である。
Denoのサーバレス環境でのパフォーマンス
サーバレス環境でDenoを動かした場合のパフォーマンス最適化にも注力しており、deno_dir
でのSQLiteジャーナルの高速化や起動時のオーバーヘッド削減など、AWS Lambdaなどでのコールドスタートを含めたベンチマークが公表されている。
Temporal APIとWasmの一級サポート
JavaScriptにおける日付操作の複雑さを解消する提案Temporal API
は、Denoで--unstable-temporal
フラグを用いることで試験的に利用可能である。さらにWebAssembly(Wasm)をモジュールとして直接import
できるようになり、以下のようにシンプルなコードで取り込みが行える。
import { add } from "./add.wasm";
console.log(add(1, 2));
deno.json
の拡張
Denoは設定ファイル不要の使いやすさを特徴としてきたが、プロジェクト規模が拡大するにつれて柔軟なカスタマイズを求めるニーズに応えるため、deno.json
の拡張が進められている。
deno task
の柔軟性向上: npmコマンドの組み込みやshebangスクリプトの実行、依存タスクの定義などdeno fmt
の拡張: HTML、CSS、YAML、Astro、Angular、Svelte、Vueなどより多様なファイル形式をフォーマット対象にimports
フィールドの事前処理で、サブパスエクスポートの扱いをシンプル化
安定版となったDeno標準ライブラリ
約4年・151回のリリース・4000件超のコミットを経て、Deno標準ライブラリ(Deno Standard Library)が安定版として公開された。データ操作やWeb関連、JavaScript専用のユーティリティなど幅広いモジュールが含まれており、Denoのみならず他のJavaScriptランタイムやブラウザ環境でも活用可能である。
Rust製オープンソースCrate群
Denoの開発過程でメンテナンスされているRust製のCrateにも注目すべきものが多い。特に以下のようなプロジェクトが挙げられる。
rusty_v8
: 高品質かつオーバーヘッドの少ないV8のRustバインディングdeno_semver
: npmやJSRパッケージで使われるSemVer形式の解析や比較を行うdeno_npm
: Denoとnpmエコシステムを橋渡しし、Node.js互換のモジュール解決を可能にするdeno-vite-plugin
: Vite上でDenoやJSR、HTTP経由のインポートを利用するためのプラグインdeno_cache_dir
: Deno CLIと同等のロジックでキャッシュを操作するためのTypeScriptモジュール
Deno DeployやFresh、Subhostingの動向
サーバレス実行環境Deno Deployにも様々な機能拡張が行われている。初心者が取り組みやすいチュートリアルや、ビルド・デプロイ手順の可視化が進められ、deployctl
によるCLI管理機能も追加された。Next.js
をDeno Deploy上で動かす実験や、Web Cache API
の提供、課金の上限管理機能なども整備されている。
エンタープライズ向けサービスであるDeno Subhostingにおいては、ドメイン管理の柔軟化やバックアップ機能の追加などが行われ、ユーザが任意コードを安全に実行できる仕組みが強化されている。フルスタックWebフレームワークFreshも2.0の公開に向けてベータ版が提供され、大幅な内部APIの見直しによって高い拡張性を目指している。
Deno 2の先へ
Deno 2ではNode/npm互換やワークスペース対応、JSR統合などを通じて、Denoの「オールインワンツールチェーン」と「Web標準API」への強みをさらに拡張している。今後は本番環境での運用における信頼性や可観測性、デバッグ機能の強化にも注力する方針を示している。Deno本体とクラウドサービスの双方でさらなる高速化や利便性向上が期待される。
詳細はDeno in 2024を参照していただきたい。