node, deno, bunどうしてこんなに作られたのか

こんにちは!開発本部 SINIS for Instagram 開発チームのtenshin_yです。 今回は私が社内勉強会で話をした、JavaScript/TypeScriptランタイムの話をテックブログでもまとめようと思います。

話すこと

  1. サーバーサイドJS/TSの環境の話
  2. 歴史の話
  3. サーバーサイドJS/TSのこれから(遅報)

話さないこと

  • フロント/バックエンドのFWの話
  • ライブラリの話
  • パッケージマネージャーの話(npm, yarn, pnpm)
  • linterの話

ざっとおさらうサーバーサイドJS/TSのランタイム

Node.js

公式:https://nodejs.org/ja
一番歴史が長く、初回リリースは2009年。
テテマーチのプロダクト全てで使われている。

Deno

公式:https://deno.com/
Node.jsの作者が次に作ったランタイムがDeno。
v2が発表されて右のロゴに変更。
初回リリースは2018年。

Bun

公式:https://bun.sh/
当時急に現れた(筆者の主観です)饅頭
初回リリースは2021年で今回登場する中では最も後発のランタイム。

これらを踏まえて思うこと、なんかランタイム多くない?
これを理解するための歴史のお話です。

なんかランタイム多くね?

本当にそうか?という疑問を持って他の言語を見比べてみる。

PHP

Java(系)

こうして見ると、特定の動作環境(クラウドベンダー提供など)や商用ライセンスで枝分かれして複数あることは多い。 プログラミング言語ではないが、Ubuntu とかもそう。

ならJavaScriptは?

Node.js

  • ライセンス: MIT License
  • 特徴: 商用・非商用問わず自由に使用・改変・再配布が可能
  • 権利関係: OpenJS財団が管理しているが有償サポートのような体制はない

Deno

  • ライセンス: MIT License
  • 特徴: Node.jsと同じくMITライセンスを採用、ライセンス面での制約は基本的に同じ
  • 権利関係: Deno Land Inc.が開発・管理しているが有償サポートのような体制はない

Bun

  • ライセンス: MIT License
  • 特徴: 他の2つと同様にMITライセンスを採用し、自由な利用が可能
  • 権利関係: Oven(旧Bun)社が開発しているが、有償サポートのような体制はない

ならどういうことだろう?ということで、JavaScriptの歴史を見ていきます。

ブラウザの歴史とJavaScript / TypeScriptの歴史、JavaScriptエンジンの発展

1990年代初期:ブラウザ戦争の始まり

1993年9月 - 最初のWebブラウザNCSA Mosaic 1.0リリース

1994年12月 - 一時台を築いたNetscape Navigator リリース

1995年5月 - JavaScript誕生

1995年 - Internet Explorer登場

ECMAScript標準化の時代

1996年 - 標準化への動き

1997年6月 - ECMAScript 1 (ES1)

1998年 - ECMAScript 2 (ES2)

  • ISO/IEC 16262標準との整合性のための編集上の変更

1999年 - ECMAScript 3 (ES3)

  • do-while文、正規表現、新しい文字列メソッド、例外処理などを追加

2000年代:ブラウザ多様化とAjaxの時代

2002年 - Mozilla Firefox登場

2003年 - Apple Safari登場

2005年 - Ajax概念の確立

  • Jesse GarrettがAjaxという用語を作り出した白書を発表

2007年 - Netscape Navigator終了

V8とモダンJavaScriptエンジンの革命

2008年 - Google Chrome & V8エンジン登場

  • GoogleChromeブラウザをV8 JavaScriptエンジンとともにデビュー
  • Just-in-time compilation (JIT)が主要な革新、他のブラウザ、JavaScriptエンジンもJIT対応のためエンジンを全面改修する必要が生じた

2008年 - Oslo会議

  • 各ブラウザベンダーがオスロで会議、言語を前進させる合意形成

2009年末 - ECMAScript 5 (ES5)

  • 2009年に全ての仕様に対してブラウザベンダーや合意を経て、ECMAScript 5標準がリリース

サーバーサイドJavaScriptの時代:Node.js登場

ライアン・ダールによるNode.js開発

2009年1月 - Node.js開発開始

  • 2009年1月、サーバーサイドJavaScriptの実装作業を開始、これがNode.jsの誕生
  • 並行リクエスト処理の課題解決を目指す

2009年5月27日 - Node.js初回リリース

Node.jsの成長と課題

2012年1月 - ライアン・ダール引退表明

TypeScriptの誕生と発展

Microsoft内での開発

2010年頃 - TypeScript開発開始

  • Microsoftで大規模JavaScriptアプリケーション開発の課題から、TypeScriptプロジェクトが内部で開始

2012年10月 - TypeScript公開発表

ライアン・ダールのNode.jsへの後悔とDeno誕生

2018年:Node.jsへの後悔表明

2018年6月6日 - JSConf EU 2018「10 Things I Regret About Node.js」

  • 2009年のNode.js発表から9年後、ベルリンで再び登壇
  • Node.jsの10の後悔を発表:Promise放棄、セキュリティ欠如、GYPビルドシステム、package.json、node_modules、require()等

    「時にNode.jsは黒板を爪で引っ掻くような感じ。もっと良くできたはずだった」

  • わかりやすい日本語に翻訳されたブログ:https://yosuke-furukawa.hatenablog.com/entry/2018/06/07/080335

主要な後悔点:

  • 2009年6月にPromiseを追加したが2010年2月に削除、async/await開発が遅れた
  • セキュリティがV8に委任され、デフォルトでコンピューターとネットワークにフルアクセス

Denoプロジェクト発表

2018年6月6日 - Deno発表

  • JSConf EU 2018講演の最後10分で「より良いNode」のプロトタイプとしてDenoを紹介
  • ライアン・ダール(Node.js創設者)がJsConf EU 2018で「10 Things I Regret About Node.js」講演中にDenoを発表

Denoの設計思想:

  • セキュア・バイ・デフォルト:すべてのコードをセキュアサンドボックスで実行、npmでマイニングコードが実行されるような強力なパーミッションをdeno側がデフォルトで制限している(ファイル書き込みなど)
  • TypeScriptをトランスパイルなしで扱える
  • パッケージマネージャーの代わりにURL経由での直接インポート

2020年5月13日 - Deno 1.0リリース

  • 2018年の発表から2年後、Deno v1.0が正式リリース
  • Rust(もともとはGo)とV8をベースとしたTypeScript/JavaScriptランタイム
  • 一方でnodeで動いていたファイルをそのまま移植することはできなかった(importの違いなどが理由)

Bun:新世代のJavaScriptランタイム

Bun開発とOven設立

2021年3月 - Oven設立

  • Jarred SumnerがOvenの創設者兼CEOとして活動開始

2022年7月5日 - Bun 0.1発表

  • Bun 0.1を正式発表、大きな注目を集める

Bunの技術的特徴:

2023年9月8日 - Bun 1.0リリース

  • 本格的なプロダクション向け1.0バージョンをリリース

Deno :v2登場

2024年10月9日: 4年半ぶりのメジャーアップデート

  • Nodejsとの互換性を強化
    • package.json , node_modules に対応
    • 後発のBunがDeno以上に使われ、注目された結果から互換性を強化
    • 一方でnpmを取り込んだら結局セキュリティが….という懸念や理想から遠ざかったといった声も
  • JSRの登場

現在への影響と今後の展望

2019年 - OpenJS Foundation設立

  • Node.js FoundationとJS Foundationが合併してOpenJS Foundation設立
  • JavaScript・ウェブ生態系の健全な成長促進というミッション

そして2024年末…

WinterTC爆誕

サーバーサイドJavaScriptの技術標準を策定する委員会、WinterTCが誕生しました。

ECMAScriptJavaScriptの国際規格)を決めるECMAがいるように。

サーバーサイドJSにどんなAPIを生やすのか、ブラウザありきでうごくWeb APIを叩いた時にどんな挙動をさせるのかなども共通仕様として定義させていこうという団体です。

現在の着地点

全てのモダンランタイムが目指している共通要素:

  1. セキュリティ強化: サンドボックス化とパーミッションベースアクセス制御
  2. TypeScript統合: ネイティブTypeScriptサポート
  3. パフォーマンス最適化: より高速な起動時間と実行性能
  4. 開発者体験向上: 統合ツールチェーンと設定の簡素化
  5. ウェブ標準準拠: ブラウザとサーバーサイドの一貫性

全ては、ライアン・ダールのNode.jsへの後悔から始まった創造と破壊、技術競争の歴史がサーバサイドJSのランタイムの歴史だったのだ(個人の主観です)。

もし、今から選ぶなら

最後に、自分だったらどうランタイムを選ぶのかをシチュエーションを交えて考えてみようと思います。

1.スタートアップで0→1の立ち上げ

この状況ならNode.jsを選びます。
これから先仲間を増やすことも考えた時に、一番歴史が長く経験者も多いというのは後から覆されることのない強みかなと思います。

2.個人開発

Denoを使います。
linter、formatter、テストといったライブラリがそもそもあるというのは手軽に踏み出せて良いですし

  • 設定不要で使えるTypeScriptの体験が最高
  • セキュリティ機能が本当に安心

なのは他2つにはないメリットかなと思います。

参考