Node.js, Deno, Bunの比較 - どれを使うべきか?
はじめに
Denoや
Bunなどの登場により、どのランタイムを使うべきなのかに関する意見や疑問などを見かける機会が増えてきたような気がしました
このページでは、各ランタイムへの個人的な印象や意見などについてまとめてみます
私の考えとして、以下のような立場で意見をまとめています
サーバーサイドランタイムとしての
Node.jsには概ね満足していて、大きな不満は特にない
スクリプティングランタイムとしての
Denoはかなり気に入っている
TL;DR
最初に結論だけ書いてしまうと、現時点(2024年)では、業務における
フロントエンド・バックエンド開発においては、
DenoやBunの採用はまだ早いと思っています (将来的には
Denoと
Bunのどちらも
Node.jsとの互換性がより改善され、いずれにしても移行も楽になると思われるので、現状では
Node.jsを使って様子見しておくのが安全ではないかと思っています)
もし現時点で
Denoや
Bunを業務におけるフロントエンド・バックエンド開発に採用したいという場合は、
まずはリスクの低い箇所(スクリプティング、社内システム/ツール、Slackなどのチャットボット、Faasにおける特定のFunctionなど)に対して局所的に採用して評価や検討をした上で、段階的に採用を進めていくのが個人的には良いと思います
それぞれのよい点について
(2024年時点) 誕生から15年近く経過しており、大規模なサービスなどでの使用実績も豊富にあり、最も高い安定性が期待できる
(2024年時点) 基本的にフロントエンドのエコシステムの多くは
Node.jsを想定して開発されているため、最新のツールなども安定して動かしやすい
Denoや
Bunで導入された独自の機能についても少しずつ導入または検討が進められています
パーミッションシステム
ただ現状では多くの場合、 deno run -A
で実行されるケースが比較的多いのではないかとも思うので、パーミッションシステムの存在が他のランタイムと比較したときに、どれほどメリットになるのかは正直わからないです
元々、
DenoはWeb標準への準拠を重視していたこともあり、この分野では
Denoが一番優位だと思う (2024年時点)
(2024年時点) 最初から
Node.jsとの互換性を念頭において設計・開発されている分、この点では
Bunの方が有利だと思う
自分はスクリプティングでの体験の良さを気に入って
Denoを使い始めたので、これが個人的には一番よい点だと思う
ただし、
Denoとは異なり、型チェックについては別途、
tscを使う必要あり
(2024年時点) フロントエンド開発で使用するなら個人的には
Denoよりも
Bunの方が有利だと思う
(おそらく意図的なものなのだとは思いますが)
Bunは標準などから大きく外れた独自機能を導入することが多々あり、人によって好き嫌いが分かれやすい部分だとは思いますが、
気にいる人にはかなり刺さる特徴なのではないかと思います
例)
所感
個人的な好み
スクリプティングやCLIツールの開発における使い勝手や体験の良さ、Web標準への準拠など、私は
Denoはとても気に入っています
特にスクリプティングにおいての体験が素晴らしく、定型的な作業の効率化などではとても便利だと思っています
どれを採用するのが良いか?
先程、自分は
Denoをとても気に入っているとは書きましたが、
現時点(2024年)では、業務でのWeb開発においては、まだNode.jsを使うべきだと個人的には思っています
また、
Node.jsも進化が止まっているわけではなく、継続的にそういった欠点などの改善も試みられています
Node.jsは現状では最も安定性が高く、開発においてつまずく可能性も低い
私個人の印象として、
Node.jsはエコシステムがやや乱立しがち※であり、労力などが分散してしまう分、個々の
ORMやフルスタックフレームワークなどのバックエンド開発において必要となるライブラリの成熟度では、
Railsや
Java,
C#あたりと比較するとどうしてもやや低くなりがちな印象があります。ただでさえそのあたりでのリスクがある上でWeb開発において
Denoや
Bunなどを採用するのは、現状では正直かなりリスキーであると個人的には思います
※乱立しがちであるというのは選択肢が多いというメリットとも考えられるため、一概に悪いことであるとは言えないとも思います
例えば、以下の記事などでも言及されているように、プロダクトのコアに十分に検証していない技術を採用することには大きなリスクがあり、また当初期待していた程のメリットを得られない可能性もある (新しい技術を採用した結果、却ってそれが負債となってしまう可能性がある)
Denoや
Bunが強みとして打ち出している様々な要素は実際に魅力的であるとは思うものの、もし採用を検討する際は、まず事前にきちんと検証や調査などをしてから採用を判断すると安全だと思います
現時点で
Denoや
BunをWeb開発で本格的に使おうとする場合、「〜の
npmパッケージが動かない」「
Node.jsと異なる振る舞いをする」「〜を実現するライブラリがまだない」「アップデートしたら〜の
npmパッケージが動かなくなった」などといったリスクがまだまだ発生すると思います。どちらもBetter
Node.jsとして使うには、まだ安定性は足りていないと個人的には思っています
Denoや
Bunには
Node.jsにはないメリットが多くあることは事実だとは思うものの、業務におけるバックエンドやフロントエンドの開発においてはまだ時期尚早だと思う (2024年時点)
例えば、大規模なB2Bサービスの開発で採用することなどを考えた際に、
Denoや
Bunが提供するメリットは、
Node.jsが提供する安定性やシェア、情報量が豊富であることなどのメリットを現状では上回らない、というのが個人的な考えです (現状では正直、苦労することの方が多いと思います)
また、
Deno Deployが提供する
Deno KVは、キャッシュや
Pub/Sub、メッセージングなどの選択肢の一つとしては悪くはないとは思うものの、
大規模なサービスにおける永続化層として全面的に採用するには正直やや心許ないというのが個人的な印象です。(特に数百〜数千以上ものテーブルが必要となるような大規模なB2Bサービスの開発などにおいては、例えば
関係データベースが提供するリレーションやトランザクション、行レベルセキュリティなどの仕組みは非常に有用だと思っています)
このあたりは各種
NewSQLであったり
Tursoなどの技術が発達していくと改善されていく可能性はあるのかもしれないですが、正直どうなるのかはちょっとまだわからないです
永続化レイヤーはコンピューティングレイヤーと比較して、
リファクタリングなどに膨大なコストがかかってしまうケースが多いと思うので、意思決定は慎重に行うと安全ではないかと思っています
現時点では、もし採用する場合は、
Deno KVに適していると思われる小規模なアプリでの採用や部分的な採用がよいのではないかと思っています
Node.jsも別にレガシーなプロダクトというわけではなく、現在でも積極的に新しいものが開発されています
新しい技術を採用したからといって、必ずしも既存の課題や問題が魔法のように解決するとは限らないです。
Hype Driven Developmentに陥ってしまわないように注意するとよいでしょう。
実際に採用するかどうかは、評判などだけで判断するのではなく、きちんと検証や調査を実施してから判断するのがよいと思います。
参考までに
Denoの使用事例をまとめているため、よろしければこちらなども参照ください🙇♂️
また、
Denoには開発初期のセットアップ作業がかなり楽になるというメリットはあるものの、実際のWeb開発においてはそう何度も初期セットアップを行うようなことはまれなはずなので、そこまで恩恵はないと思われます (ただし、スクリプティングなどにおいてはこのメリットの恩恵は受けやすいはず)
こういった機能はWeb開発ではなく、どちらかといえばスクリプティングなどの方が恩恵を受けやすいと思います
ESLintにおける数々の有用なプラグインによって提供される価値は、
deno lintが提供するパフォーマンス上の優位性よりも上回ると個人的に考えています
また、数年後には
Denoと
Bunはどちらもも
Node.jsとの互換性がさらに改善されているはずなので、もし
Node.jsからそれらへ移行をしたいというようなケースが出てきたとしても、将来的にはハードルは下がっている可能性が高いと思います
ただし、スクリプティングやCLIツール、
Vimプラグインなどの開発では
Denoや
Bunはかなり使い勝手が良く、この分野での採用は現状でも十分にアリだと思います
なので、もし
Denoや
Bunの採用を考える場合は、このあたりから少しずつ進めていくのがよいと思っています
Denoには他にもパーミッションシステムなどの機能はあるものの、この機能は
Node.jsにおいても実装が進みつつあるため、差別化要素としてはやや弱めと見ています
具体的には、永続化に関する要件が厳しくなく、
Deno KVでも十分にワークするようなケースなど (小規模なプロダクトや社内プロダクト、Webサイトなど)
ただ、もし採用するとしても、当面は
CIで
Node.jsと
Bunの両方で同じテストなどを実行しておき、何か問題があった際にすぐに
Node.jsへロールバックできるようにしておくと安全ではないかと思います
これは用途や好みなどによって異なってくるのではないかと思っています
スクリプティングにおいては、やや
Denoが有利ではないかと思っています
CLIツールを作成したい場合は、双方にメリットがあり、どちらにもそこまで差はないと思います
Denoは
https:
や
npm:
などによるライブラリの
import
や動的なダウンロードなどの機能があります。この仕組みにはプラグインシステムを備えたアプリケーションを開発したい場合、外部ライブラリに依存したプラグインを開発・配布しやすいというメリットがあると考えられます。
こういったプラグインシステムを提供するCLIアプリなどを開発する場合、Denoはとても相性が良いのではないかと思います (実際に
denops.vimではその仕組みが活用されています)
フロントエンドでSPAを開発したいケースなどでは
Bunの方が向いているのではないかと思っています
標準への準拠について
また、
WinterCGでは各ランタイムでのAPIなどを標準化するための取り組みが行われています
Node.jsでは (おそらく
Denoや
Bunの影響もあって) パーミッションシステムの実装や単一実行可能ファイルの作成などのサポートが進められつつあります
こういった動きもあり、将来的にはそれぞれのランタイム間の差異は徐々に縮まっていく可能性は比較的高いのではないかと思う
現時点では、できるだけこういった標準に準拠している または しやすい選択肢を採用しておくと、今後の変化に対応しやすいのではないかと思う (
Remix,
Honoなど)
終わりに
私の意見としては、バックエンドやフロントエンドの開発において
Node.jsではなく
Denoや
Bunを採用するのは現時点ではまだリスキーであると思っています (ただし、CLIやスクリプティングなどにおける
Denoや
Bunの部分的な採用は現時点でもありだと思っています)
ただし、どのランタイムもWeb標準への対応は少しずつ改善されつつあります。また、
Honoや
RemixなどのWeb標準を意識したフレームワークも登場しています。
これから相互運用性が少しずつ改善されていけば、各ランタイムの移行や併用などはしやすくなってくると思っており、それまでは本格的な採用は見送る方が安全なのではないかと個人的には思っています
正直、今後、どれが最も人気になるのかはわからないですが、少なくとも
Node.jsの需要が完全になくなってしまうということは考えにくいのではないかと思っています
Denoも
Bunも
Node.js互換性の改善にはかなり力が入れられているので、今、急いで採用や移行などをしなくとも、数年後にはよりスムーズに移行や採用などがしやすくなるはずです
少し批判的な内容も書いてしまいましたが、
Denoも
Bunもかなり注目は浴びており、コミュニティなども活発に見えるため、個人的にはどちらもかなり期待しています
私は
Denoをスクリプティングの用途で日々使っていて、とても使い勝手がよく感じています。
Denoにせよ
Bunにせよ、現時点ではWeb開発への採用は少しリスキーではあると思うので、もし興味がある際は、まずはスクリプティングなどの小さな部分から少しずつ採用していくと良いのではないかと思っています
関連ページ