こんにちは!開発本部 SINIS for Instagram 開発チームのtenshin_yです。
今回は私が社内勉強会で話をした、JavaScript/TypeScriptランタイムの話をテックブログでもまとめようと思います。
- 話すこと
- 話さないこと
- ざっとおさらうサーバーサイドJS/TSのランタイム
- そして2024年末…
話すこと
- サーバーサイドJS/TSの環境の話
- 歴史の話
- サーバーサイド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
- Zend Engine(https://www.php.net/): 最も一般的なPHPランタイム。ラスマス・ラードフが公式実装。
- PHP-FPM(https://www.php.net/manual/ja/install.fpm.php): ランタイムではなく、PHPプロセスを効率的に管理するFastCGI実装。
Java(系)
- OpenJDK(https://openjdk.org/): オープンソースのJava実装、多くのディストリビューションのベースになる。
- Oracle JDK(https://www.oracle.com/java/): Oracle公式のJava開発キット、LTSバージョンの商用利用は有償となる。
- Red Hat OpenJDK(https://developers.redhat.com/products/openjdk): Red Hat提供のエンタープライズ向けOpenJDK。
こうして見ると、特定の動作環境(クラウドベンダー提供など)や商用ライセンスで枝分かれして複数あることは多い。 プログラミング言語ではないが、Ubuntu とかもそう。
ならJavaScriptは?
Node.js
- ライセンス: MIT License
- 特徴: 商用・非商用問わず自由に使用・改変・再配布が可能
- 権利関係: OpenJS財団が管理しているが有償サポートのような体制はない
Deno
- ライセンス: MIT License
- 特徴: Node.jsと同じくMITライセンスを採用、ライセンス面での制約は基本的に同じ
- 権利関係: Deno Land Inc.が開発・管理しているが有償サポートのような体制はない
- Deno Deployのホスティングサービスと融資が資金源
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誕生
- Brendan Eichが1995年にNetscape Navigator用に最初のJavaScriptエンジンを作成
1995年 - Internet Explorer登場
- ChakraをJavaScriptエンジンとする
- NetscapeとMicrosoftの間でブラウザ戦争が勃発
ECMAScript標準化の時代
1996年 - 標準化への動き
- TC39技術委員会が言語開発のために設立される
- https://tc39.es/ja/
1997年6月 - ECMAScript 1 (ES1)
- ECMA-262 Edition 1がリリース
- https://ecma-international.org/publications-and-standards/standards/ecma-262/
- Internet Explorer 4がES1をサポートする最初のブラウザ
1998年 - ECMAScript 2 (ES2)
- ISO/IEC 16262標準との整合性のための編集上の変更
1999年 - ECMAScript 3 (ES3)
- do-while文、正規表現、新しい文字列メソッド、例外処理などを追加
2000年代:ブラウザ多様化とAjaxの時代
2002年 - Mozilla Firefox登場
- SpiderMonkeyをJavaScriptエンジンとする
- WebKitのJavaScript CoreエンジンをJavaScriptエンジンとする
2005年 - Ajax概念の確立
- Jesse GarrettがAjaxという用語を作り出した白書を発表
2007年 - Netscape Navigator終了
- AOLがNetscape Navigatorを正式に終了、90年代に90%以上の市場シェアを誇った時代の終焉
- http://blog.command-f.com/?eid=708657
V8とモダンJavaScriptエンジンの革命
2008年 - Google Chrome & V8エンジン登場
- GoogleがChromeブラウザを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の誕生
- 並行リクエスト処理の課題解決を目指す
- https://www.publickey1.jp/blog/11/nodejs.html
- サンプルにもあるように
setTimeout()のような非同期処理が強い言語。 - こういうことをサーバーでもやりたい!
2009年5月27日 - Node.js初回リリース
Node.jsの成長と課題
2012年1月 - ライアン・ダール引退表明
- 3年間のNode.js開発後、日常的なバグ修正から離れ、研究プロジェクトに専念すると発表
- https://www.publickey1.jp/blog/12/nodejs_2.html
TypeScriptの誕生と発展
Microsoft内での開発
2010年頃 - TypeScript開発開始
- Microsoftで大規模JavaScriptアプリケーション開発の課題から、TypeScriptプロジェクトが内部で開始
2012年10月 - TypeScript公開発表
- 2年間の内部開発を経て、2012年10月にバージョン0.8でTypeScriptが一般公開
- TypeScriptはMicrosoftの最初からオープンソースプロジェクトの一つ
- https://www.zdnet.com/article/microsoft-typescript-can-the-father-of-c-save-us-from-the-tyranny-of-javascript/
ライアン・ダールの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の技術的特徴:
- Zigで一から構築、Node.jsの完全置換として設計
- Node.jsとDenoがV8エンジンを使用するのに対し、WebKitのJavaScriptCoreを使用
- バンドラー、テストランナー、Node.js互換パッケージマネージャーを内蔵
- 独自の組み込みAPIを多数備える
- 例として、JavaScriptがモジュールで実現してきた以下のような機能を内蔵
- SQLをたたく
- ファイルストレージにアクセスする
2023年9月8日 - Bun 1.0リリース
- 本格的なプロダクション向け1.0バージョンをリリース
Deno :v2登場
2024年10月9日: 4年半ぶりのメジャーアップデート
- Nodejsとの互換性を強化
package.json,node_modulesに対応- 後発のBunがDeno以上に使われ、注目された結果から互換性を強化
- 一方でnpmを取り込んだら結局セキュリティが….という懸念や理想から遠ざかったといった声も
- JSRの登場
- パッケージのレジストリ、これもTypeScript製で、内部でDenoを使った型チェックとかnpmにないエコシステムを強化してTypeScriptファースト
- https://deno.com/blog/std-on-jsr
現在への影響と今後の展望
2019年 - OpenJS Foundation設立
- Node.js FoundationとJS Foundationが合併してOpenJS Foundation設立
- JavaScript・ウェブ生態系の健全な成長促進というミッション
そして2024年末…
WinterTC爆誕
サーバーサイドJavaScriptの技術標準を策定する委員会、WinterTCが誕生しました。
ECMAScript(JavaScriptの国際規格)を決めるECMAがいるように。
サーバーサイドJSにどんなAPIを生やすのか、ブラウザありきでうごくWeb APIを叩いた時にどんな挙動をさせるのかなども共通仕様として定義させていこうという団体です。
現在の着地点
全てのモダンランタイムが目指している共通要素:
- セキュリティ強化: サンドボックス化とパーミッションベースアクセス制御
- TypeScript統合: ネイティブTypeScriptサポート
- パフォーマンス最適化: より高速な起動時間と実行性能
- 開発者体験向上: 統合ツールチェーンと設定の簡素化
- ウェブ標準準拠: ブラウザとサーバーサイドの一貫性
全ては、ライアン・ダールのNode.jsへの後悔から始まった創造と破壊、技術競争の歴史がサーバサイドJSのランタイムの歴史だったのだ(個人の主観です)。
もし、今から選ぶなら
最後に、自分だったらどうランタイムを選ぶのかをシチュエーションを交えて考えてみようと思います。
1.スタートアップで0→1の立ち上げ
この状況ならNode.jsを選びます。
これから先仲間を増やすことも考えた時に、一番歴史が長く経験者も多いというのは後から覆されることのない強みかなと思います。
2.個人開発
Denoを使います。
linter、formatter、テストといったライブラリがそもそもあるというのは手軽に踏み出せて良いですし
- 設定不要で使えるTypeScriptの体験が最高
- セキュリティ機能が本当に安心
なのは他2つにはないメリットかなと思います。
参考
- TECH I.S. Guide JavaScriptの歴史 JSチュートリアル https://techis.jp/guide/js/js_history
- インターネット黎明期に登場したウェブブラウザ「Mosaic」と「Netscape」の生みの親が開発当時を振り返る GIGAZINE https://gigazine.net/news/20240702-origin-mosaic-netscape/
- @nao-United92 JavaScriptの起源と歴史を振り返ります!Qiita https://qiita.com/nao-United92/items/dbd9a4fcc66d2ee8aa79
- ANTEZ [基礎知識]JavaScriptの歴史 Zenn https://zenn.dev/antez/books/568dd4d86562a1/viewer/bc8ac9
- Allen Wirfs-Brock, Brendan Eich JavaScript: The First 20 Years https://dl.acm.org/doi/pdf/10.1145/3386327