Node.js, Deno, Bunの比較 - どれを使うべきか?
はじめに
DenoやBunなどの登場により、どのランタイムを使うべきなのかに関する意見や疑問などを見かける機会が増えてきたような気がしました このページでは、各ランタイムへの個人的な印象や意見などについてまとめてみます
私の考えとして、サーバーサイドランタイムとしてのNode.jsには概ね満足していて、スクリプティングランタイムとしてのDenoはかなり気に入っている、という立場で意見をまとめています TL;DR
現時点(2024年)では、業務におけるフロントエンド・バックエンド開発においては、DenoやBunの採用は個人的にはまだ早いと思います (現状ではNode.jsを使うのがよいと思っています) ただし、CLIツールの開発やスクリプティング、Vimプラグインの開発などの分野であれば、DenoやBunの採用はアリだと思います それでも、もし現時点でDenoやBunを業務におけるフロントエンド・バックエンド開発に採用したいという場合は、リスクの低い箇所(スクリプティング、社内システム、Faasにおける特定のFunctionなど)に対して部分的・限定的に採用することを推奨します それぞれのよい点について
(2024年時点) 誕生から15年近く経過しており、高い安定性が期待できる
(2024年時点) 基本的にフロントエンドのエコシステムの多くはNode.jsを想定して開発されることが多いため、最新のツールなどを採用しやすい ただ現状ではおそらく多くの場合、deno run -Aで実行されるケースが結構多いのではないかとも思うので、パーミッションシステムの存在が他のランタイムと比較したときに、どれほどメリットになるのかは正直わからないです
パッケージレベルでパーミッションを制御したいという要望はいくつか上がっていて、これがサポートされると実用度が上がる可能性はあるかもしれないと思いました () 元々、DenoはWeb標準への準拠を重視していたこともあり、この分野ではDenoが一番優位だと思う (2024年時点) (2024年時点) この点ではBunの方が有利だと思う 自分はスクリプティングでの体験の良さを気に入ってDenoを使い始めたので、これが個人的には一番よい点だと思う ただし、Denoとは異なり、型チェックについては別途、tscを使う必要あり (2024年時点) フロントエンド開発で使用するなら個人的にはDenoよりもBunの方が有利だと思う (おそらく意図的なものなのだとは思いますが) Bunは標準などから大きく外れた機能を導入することが多々あり、人によって好き嫌いが出やすい部分だとは思いますが、気にいる人にはかなり刺さる特徴なのではないかと思います 例)
所感
個人的な好み
スクリプティングやCLIツールの開発における使い勝手や体験の良さ、Web標準への準拠など、私はDenoはとても気に入っています 特にスクリプティングにおいての体験が素晴らしく、定型的な作業の効率化などではとても便利だと思っています
どれを採用するのが良いか?
先程、自分はDenoをとても気に入っているとは書きましたが、現時点(2024年)では特別な理由が無い限り、業務ではまだNode.js一択だと個人的には思っています また、Node.jsも進化が止まっているわけではなく、継続的にそういった欠点などの改善も試みられています Node.jsは現状では最も安定性が高く、開発においてつまずく可能性も低い 例えば、以下の記事などでも言及されているように、プロダクトのコアに十分に検証していない技術を採用することには大きなリスクがあり、また当初期待していた程のメリットを得られない可能性もある (新しい技術を採用した結果、却ってそれが負債となってしまう可能性がある)
DenoやBunにはNode.jsにはないメリットが多くあることは事実だとは思うものの、業務におけるバックエンドやフロントエンドの開発においてはまだ時期尚早だと思う (2024年時点) 例えば、大規模なB2Bサービスの開発で採用することなどを考えた際に、DenoやBunが提供するメリットは、Node.jsが提供する安定性やシェア、情報量が豊富であることなどのメリットを現状では上回らない、というのが個人的な考えです (現状では正直、苦労することの方が多いと思います) また、Deno/Bun/Node.jsはどれも採用している言語が同じで かつ npmという同一のエコシステムにも依存していることもあり、ランタイムに関してあえてリスクを犯してまで新しいものに乗っかるメリットが正直そこまで大きくない、という事情もあります Node.jsも別にレガシーなプロダクトというわけではなく、現在でも積極的に新しいものが開発されています 新しい技術を採用したからといって、必ずしも既存の課題や問題が魔法のように解決するとは限らないです。Hype Driven Developmentに陥ってしまわないように注意するとよいでしょう。実際に採用するかどうかは、評判などだけで判断するのではなく、きちんと検証や調査を実施してから判断するのがよいと思います。 参考までにDenoの使用事例をまとめているため、よろしければこちらなども参照ください🙇♂️ また、Denoには開発初期のセットアップ作業がかなり楽になるというメリットはあるものの、実際のWeb開発においてはそう何度も初期セットアップを行うようなことはまれなはずなので、あまり恩恵はない (ただし、スクリプティングなどにおいてはこのメリットの恩恵は受けやすいはず) こういった機能はWeb開発ではなく、どちらかといえばスクリプティングなどの方が恩恵を受けやすいと思います
(2024年時点) Bunの場合も、もし採用するとしても、当面はCIでNode.jsとBunの両方で同じテストを実行しておき、何か問題があった際にすぐにNode.jsへロールバックできるようにしておくと安全かもしれません ただし、現時点では、そこまで苦労して移行する意義があるかどうかは正直なところ疑わしいとは思います
今後、Node.jsとの互換性は少しずつ改善されていくはずなので、もう少し待ってから移行をした方が、結果としてはよりスムーズに進めやすいのではないかと思っています また、数年後にはDenoとBunはどちらももNode.jsとの互換性がさらに改善されているはずなので、もしNode.jsからそれらへ移行をしたいというようなケースが出てきたとしても、将来的にはハードルは下がっている可能性が高いと思います ただし、スクリプティングやCLIツール、Vimプラグインなどの開発ではDenoやBunはかなり使い勝手が良く、この分野での採用はアリだと思います なので、もしDenoやBunの採用を考える場合は、このあたりから少しずつ進めていくのがよいと思っています これは用途や好みなどによって異なってくるのではないかと思っています
スクリプティングにおいては、どちらもそこまで差はないはず
CLIツールを作成したい場合も、そこまで差はないはず
フロントエンドでSPAを開発したいケースなどではBunの方が向いているのではないかと思っています 標準への準拠について
また、WinterCGでは各ランタイムでのAPIなどを標準化するための取り組みなどが行われています Node.jsでは (おそらくDenoやBunの影響もあって) パーミッションシステムの実装や単一実行可能ファイルの作成などのサポートが進められつつあります こういった動きもあり、将来的にはそれぞれのランタイム間の差異は徐々に縮まっていく可能性は比較的高いのではないかと思う
現時点では、できるだけこういった標準に準拠している または しやすい選択肢を採用しておくと、今後の変化に対応しやすいのではないかと思う (Remix, Honoなど) 関連ページ