世界を動かす技術を、日本語で。

Deno 2.8

概要

  • Deno 2.8 はこれまでで最大規模のマイナーリリース
  • 新サブコマンドや機能追加で開発・CI/CD体験を大幅強化
  • Node.js互換性 ・パフォーマンスが大幅に向上
  • npmパッケージ管理がより直感的・高速に
  • さまざまな新機能でプロジェクト管理・パッケージ配布が簡単に

Deno 2.8 新機能と改善点

  • アップグレード方法

    • 既存ユーザーは deno upgrade コマンドでバージョンアップ
    • 新規インストールは公式サイトまたは curl/iwr コマンドを利用
  • deno audit fix

    • deno audit(2.6で導入)はnpm依存関係の脆弱性を検出
    • deno audit fixで自動的に脆弱なパッケージをパッチ済みバージョンへアップグレード
    • メジャーバージョンアップが必要な場合は個別にリスト化
  • deno bump-version

    • deno.jsonpackage.jsonのバージョンフィールドを自動更新
    • ワークスペース対応で、全パッケージのバージョンを一括管理
    • Conventional Commitsに基づく自動バージョン判定も可能
    • --dry-runで変更内容の事前確認が可能
  • deno ci

    • CIやDockerfile向けの再現性の高いインストール専用コマンド
    • deno.lockの厳密な一致を強制し、node_modulesを初期化
    • --prod--skip-typesも利用可能
  • deno pack

    • Deno/JSRプロジェクトをnpm公開用tarballに一発変換
    • TypeScript→JavaScript変換、型定義、README・LICENSE自動同梱
    • 依存関係やimportの自動書き換えでnpm互換性確保
    • --dry-run--set-version等多彩なオプション
  • deno transpile

    • TypeScript, JSX, TSXから型を除去し純粋なJavaScriptに変換
    • 複数ファイル・ディレクトリ出力・ソースマップ・型定義生成に対応
    • JSのみの配布やTS非対応ランタイム向け事前ビルド用途
  • deno why

    • 指定パッケージが依存関係に含まれる理由を可視化
    • npm/JSR両方の依存ツリーをトレースし、npm explain/pnpm why/yarn whyと同等機能
    • バージョン指定も可能
  • npm: プレフィックス不要化

    • CLIでnpmパッケージ名にnpm:プレフィックスが不要に
    • deno add expressでnpm:expressを自動認識
    • import時は従来通りプレフィックス必須
    • JSRパッケージはjsr:プレフィックス維持

Node.js互換性・パフォーマンス向上

  • Node.js API互換性の大幅進展

    • Node公式テストスイート合格率が42%→76.4%に急上昇(Deno 2.7→2.8間)
    • 500以上のコミットでほぼ全モジュールに最適化・修正
    • Bun 1.3.14と比較しても圧倒的な互換性
  • パフォーマンス最適化

    • npmインストールが3.66倍高速化(3,319ms→906ms)

    • base64処理・node:bufferが3倍以上高速化

    • node:httpのスループット2.21倍、レイテンシ40%減

    • その他node:crypto, node:fs, Worker間通信も大幅高速化

    • 主な高速化手法

      • npmレジストリの省略版メタデータ利用(packument短縮)
      • 依存解決の並列化
      • gzip展開の非同期スレッド化
      • tarball展開のI/O・CPUフェーズ分離
      • base64処理のsimdutf化

まとめ

  • Deno 2.8 は開発者体験・CI/CD・パッケージ管理・Node.js互換性・パフォーマンスの全方位で大幅進化
  • npm/JSR両エコシステムを活用したい開発者にとって、より直感的・強力な選択肢を提供
  • 詳細や各コマンドの使い方は公式ドキュメント参照

Hackerたちの意見

これを読んでる時点で、ブログ記事はまだ存在しないみたいだね。

v2.8のリリース記事はまだ公開されていない。 Denoの最新リリース状況はGitHubのリリースページで確認してね。リリースはこちら: https://github.com/denoland/deno/releases/tag/v2.8.0 EDIT: フォーマット調整

DenoはJavaScriptとTypeScriptのランタイムなんだけど、名前を知らない人もいるかもね。Deno 2.6と競合のBun 1.3、Node.js 25の比較レビューがあるよ: https://www.devtoolreviews.com/reviews/bun-vs-node-vs-deno-2...

Bunがウェブリクエストを処理するのがこんなに速いのは驚きだね。記事ではZigが要因として挙げられてるけど、メモリを細かく管理することでNodeに対して2倍以上の速度が出るって本当なのかな?同様に、彼らは正確には言ってないけど、Bunを温かいパッケージキャッシュで動かしてるみたいだね…他のはどうなんだろう?キャッシュ持ってるのかな?

Denoはどうなってるんだろう。Nodeは安定したソリューションで、ずっと使われ続けるだろうね。今はTypeScriptも使えるし、もうすぐアプリを単一の実行ファイルにビルドできるようになるよ -- ネイティブ依存関係も含めてね。Bunはカオスだけど、それでもめっちゃ速いし、標準ライブラリに全部含める面白いアプローチを取ってる。しかも、Anthropicに買収されたし。Denoはサンドボックスとサードパーティ依存関係のインポートの簡単さで素晴らしいストーリーがあったけど、今はサンドボックスが一般的になっちゃって、インポートメカニズムもnpm addより良いとは思えないな。

もうすぐアプリを単一の実行ファイルにビルドできるようになるよ -- ネイティブ依存関係も含めてね。 おお、それは知らなかった!めっちゃいい機能だね!

しかも、Anthropicに買収されたし。 これがポジティブだと思う人いるの?

彼らは約2ヶ月前に会社の半分を解雇したみたいだよ: https://news.ycombinator.com/item?id=47467746

選択肢があるのはいいことだね、エコシステムが停滞しないように。

もう単一の実行ファイルを出荷できるよ。私の製品のCLIはNodeの単一実行ファイルアプリケーションなんだ。

新しいdeno packコマンドは、安全でシンプルなパッケージングにいい追加だね。Node.jsを使ってる人には、同じような単一コマンドが https://www.npmjs.com/package/ts-node-pack で使えるよ。Node.jsが.tsモジュールのインポートをサポートするようになったから、ビルドステップなしでリポジトリが使えるようになったね。

そうだね、この記事を読んでるとすぐに思うのは、deno packが私のオープンソースパッケージのnpm publishワークフローの素晴らしい代替になるかもしれないってこと。Deno優先/Deno中心に移行を続けたいけど、逆にNodeのTypeScriptサポートが増えてきたから、TypeScript専用のnpmパッケージに切り替えようかなって(ちょっとした)メッセージをエコシステムに送りたいとも思ってる。JSRが存在するのは嬉しいけど、あれは(ほぼ)クリーンなエコシステムだからね。

大体のノード系のものをラップして、ランタイムとしてDenoを使ってるよ。うまくいってる。プロジェクトが純粋なTypeScriptなら、Denoでそのまま実行するだけ。セキュリティのための追加オプションもいいし、インストールスクリプトがデフォルトで無効になってるのもいいね。もし直接Nodeを使ってるなら、やめた方がいいよ。少なくともBunを使ってみて。エージェント的な作業では、RustとTypeScript以外を使う理由はほとんどないと思う。異論はあるかもしれないけど、型安全性、メモリ安全性、そして大量の作業の蓄積は重要だよ。エージェントは難しいエラーや、簡単にナビゲートできるパターンが必要だからね。UIに関しては、TypeScriptが一番理にかなってると思う。デザインの例がたくさんあるからね。

Denoは基本的な権限モデルがあって、とても役立つし、Rustで書かれてるし、TypeScriptのネイティブサポートもある。私はウェブ開発やNode、Bunのエコシステムには詳しくないけど、小さなサービスのために何年もDenoを使ってて満足してる。誰か、Bunが急成長してる理由を説明してくれない?単なるバンドラーとして使われてるだけなのかな?それともJSランタイムとしては使われてないの?権限システムだけでも(モジュールにも拡張されるといいんだけど)Denoは魅力的だから、NodeからBunに移行する理由がわからないよ。NodeからDenoに移行するならわかるけど。

私は両方使ってるし、好きだよ。BunはNodeの代替としてそのまま使える。テスト設定やtsconfig、esmodulesとか面倒なことを気にしたくないなら、Bunはそのまま動くと思う。Denoにはいい標準ライブラリがあって、CLIサポートも素晴らしい。以前はDeno Deployが大好きだったけど、最近はちょっと使いづらくなってきたね。

Bunの成長の一因は、単にV8に疲れた人が多いからだと思う。JavaScriptCoreは異なるランタイム特性を持ってるし、言語エンジンの多様性があるのはいいことだよね。(ChakraCoreがほとんど使われなくなって、TC-39についていけてないのは残念だし、SpiderMonkeyのNode互換ラッパーもまだないけど、JavaScriptCoreのラッパーがあるのは新鮮な風だね。)

ほとんどの人にとって、Denoが約束するものは必要ないからだと思う。例えば、私は基本的なSvelteKitサーバーを動かすためにNode.jsやBunを使うだけだから、最初にHTMLをレンダリングするためにね。コア機能はすべてCrystalやRustで書かれたバックエンドサービスに委ねてる。そんな目的のために500MBのRAMを占有するような肥大化したJSランタイムは必要ないよ(Crystalのサービスはそれぞれ20MB以上しか使わないし)。Bunはスリムなランタイムを約束していて、すべての重要な機能がZigで書かれてるから、速度とメモリフットプリントが向上してる。JavaScriptCoreもV8に比べてメモリを少なく使うしね。私たちが期待するのは、Bunが安定して、メモリリークやクラッシュなしに24/7動作できることだけ。残念ながら、今はその約束が果たされてないね。

DenoとBunは、立ち上げたときに全然違うことに注力してたんだよね。Denoは、Nodeの元クリエイターであるライアンがNodeに対して感じていた問題を解決しようとしてた。一方でBunは、Nodeとの互換性やNext.jsみたいな人気のフレームワークを最初から動かせることに焦点を当ててた。Denoは長い間、依存関係やフレームワークがうまく動かなかったし、最初はnpmから依存関係をインストールする機能すらなかったんだよね。(振り返ってみると、npmのサプライチェーン攻撃のことを考えると、ライアンはこれらのことについて正しかったかも。)だから、BunはNodeのより良いバージョンで、すごく使いやすい機能がたくさんあって、設定もずっと少なくて済んだ。Denoチームも、成功するためにはNodeとの互換性が必要だって気づいたみたいで、ここ数年はその方向に注力してるっぽい。編集:今はDenoの方がBunよりNodeとの互換性が高いよ。

Denoを約1年使ってたけど、君が言った理由で好きだったんだ。でも、AstroやPrisma、Viteみたいなパッケージとの互換性の問題が多すぎて、結局Bunに切り替えたら、ずっとスムーズになったよ!

誰か、Bunの急成長の理由を説明してくれない?私の場合、ちょっとしたTypeScriptのサイドプロジェクトを始めるとき、npmやyarn、berry、pnpm、bubble、vite、webpack、rollup、rolldown、rollout、swc、esbuild、teatimeなどの海に溺れる代わりに、ただ一つのツールを使えばいいから。ああ、あれの中にはポケモンの技もあるけど、実際のJS/TSエコシステムのツールじゃないやつもあるよ。

Denoが最初に出たとき、インポートにURLを使ってたのが主な問題だったんだ。その後npmのサポートが追加されたけど、その頃にはBunがすでにあって、シェアを奪われちゃったんだよね。

同じく、私は主にバックエンド開発者だけど、個人プロジェクトでフロントエンドに手を出すときは、Denoが一番まともな選択肢に思える。使っててすごく快適なんだよね。JSの人たちの間であまり広がってないのがちょっと残念。

私はJSパッケージ開発者としての経験を話せるよ。数週間前に最後に試したんだけど、Node.js、Deno、Bun、ウェブの両方で動くnpmパッケージを作ってるんだ。これがNode.jsとDenoの2つのプラットフォームでやるのが面倒なんだ。Node.jsは、ネットワーク関連のことが入るときにワークアラウンドが必要だから、fetchが同じようには動かない。だから、Node.jsのワークアラウンドを考慮してコードを構成することになる。同じ話は他のAPIにも当てはまる。でも、動くかどうかはテストできる!Denoはもっと面倒で、パッケージを公開する前にDenoでテストできないんだ。npmにリリースする前に、tarファイルをインストールしてテスト用に配布してた。Nodeでは動くし、vite(ブラウザ用のNode)でも動くし、Bunでも問題なく動く。でもDenoでは、package.jsonに切り替えないと動かないし、Denoがサポートしている仕様のサブセットを正確に使わないといけない。「deno install xyz.tar」もできないから、npmを使わなきゃいけない(package.jsonに1行追加するだけ)、その後にDenoを実行することができる。ドキュメントもヒントもなく、ただ試行錯誤。さらに厄介なのは、npmとBunは両方とも「link」を提供してる。パッケージリポジトリでnpm/bun linkを呼び出して、テストリポジトリでnpm/bun link @yourpackageを実行するだけで、それでインストール完了。ソースのビルドディレクトリへのダイナミックリンクを作成して、パッキングやtarを送ることなく再ビルドできるから、パッケージディレクトリでビルドすれば、テストプロジェクトがすぐに更新される。Denoにはそれがない。しかも、それがないって教えてくれない。エラーメッセージもほとんどないし、変な方法で失敗するだけ。何時間もかけてやってみたけど、今はDenoのテストなしで公開して、バグ報告を待つだけ。だから、3つの中でBunが一番動く。これが全て。どのプラットフォームよりも良い。動くだけで、CLIもエラーメッセージもいいし、起動も速い。Web APIとNode API(たぶん)と、すごく良い独自のAPIもあって、Nodeよりも良いよ。例えばBun linkを実行すると、何が起こったかを正確に教えてくれる。「これが起こった、これを他で使うためにやらなきゃいけない」って。Nodeにはそれがない!DenoはBunの戦略、つまりnpm開発者のバックボーンを利用するのがより良い選択だって認識したと思う。だから、今はNode.jsの機能をゆっくり導入してるんだろうけど、それは彼らの元々のUSPに反してるよね。

Denoは、できるだけ多くのNodeJSテストを通過しようとゼロから作られてるんだ。Bunは、確かWebkitJSライブラリを利用していて、NodeJS特有のものは必要に応じてシムしてるよ。

Denoが最初の価値観をもう少し長く持ち続けていたら、Nodeとの互換性へのプレッシャーはAIエージェントによって解消されていたと思う。多くのプレッシャーはスキルの問題から来てるからね。もしExpress.jsを使うことしか知らなかったら、次に使うツールやランタイムは「スムーズ」な移行のために似たような抽象化を提供しなきゃいけないんだ。最近は、新しい技術を紹介するのに、実際にはドキュメントの代わりにスキルセットを提供することが多いし、時には自分が作ってるものに対してより良い代替アプローチを示すのが得意だったりする。

ここでDenoを本番環境で使ってる人いる?

その通り!全く問題がないから、ちょっと不思議な気分になるよ。普通、似たような技術を使うときは、少なくとも何かしらの問題があるもんだけど、ゼロってのはね。

npmのデフォルトについて: 1〜2年前にDenoを試したとき、すぐにこれに惹かれて、もっと良いデフォルトが出るのを待つことにしたんだ。詳しくは追ってないけど、基本的な話は知ってるよ。機能を読んでみたら、すごく感心した!自分のワークフローに合ったコマンドや機能がたくさん見つかった。Denoチーム、よくやったね!

Deno最高!小さめから中規模のウェブサービスをいくつか作ってるけど、スイスの時計みたいに動くんだ。プロジェクトの理念はUnixの精神とよく合ってると思う。個人的には、Denoの作者たちはちょっと謙虚すぎる気がする。例えば、感謝の気持ちで寄付を申し出るユーザーに対して、作者たちは丁寧に断ってるんだよね。理由は分かるけど、長期的にはプロジェクトに不必要な金銭的プレッシャーを生むかもしれない。うまくいくのは、プロジェクトの成功に依存した月額サブスクリプションみたいな「黙ってお金を取ってくれ」って感じのやつかも。