黎明の CGI から、Next.js の覇権、
そして WASM・MoonBit による次代の革命まで。
Webアプリケーションの歴史は、単なる技術の進歩ではない。それは「開発者のエゴ」と「ユーザーのリアル」、そして「プラットフォームの制約」という、三つ巴のボトルネックを解消するための抽象化のドラマである。
新世代の覇権フレームワークは、常に「それまで開発者が当たり前として耐えていた苦痛」を、新しい抽象化レイヤーで消し去ることで誕生してきた。
書きやすさ(DX)を求める開発者。実行速度(UX)を求めるユーザー。セキュリティと標準化を強いるプラットフォーム。
この三角形のどの辺をも譲らない緊張が、Web史を貫く唯一の主題である。本書は、その三方を一度に解こうとした挑戦者たちの血統書である。
最初のWebは、ただの静的な学術文書だった。GETというたった一つのコマンドで、サーバーはファイルを返すだけの完全な「死んだ空間」だった。
Webの起源は、情報をリンクで繋ぐハイパーテキストの構想にあった。それは半世紀以上前から胎動していた、人類の集合記憶への執着である。
ヴァネヴァー・ブッシュが提唱した、個人の記憶を拡張する情報検索のビジョン。
テッド・ネルソンによる、双方向リンクと著作権管理を備えた壮大なネットワーク構想。
ティム・バーナーズ=リーがWWWを実装。コマンドは GET ひとつのみ、サーバーはファイルを返すだけ。
NCSAのロブ・マクールらが定義。サーバーが外部プログラムを起動し、その出力をHTMLとして返す。SSRの原始的な祖先。
「ユーザーの入力に応じて画面を変えたい」「データベースをブラウザから操作したい」という欲求から、サーバーは初めて外部プログラムへのバイパスを開けた。リクエストを受け取ったWebサーバーが、ファイルを直接返すのではなく、別のプロセスを起動して結果のHTMLを返す。
これは現代のサーバーサイドレンダリング(SSR)の最も原始的な祖先であり、Webが「文書の倉庫」から「計算する機械」へと変容した瞬間でもある。
CGIの実行プログラムとして、当時はC言語、シェルスクリプト、そしてPerlなどが競合した。しかし最終的にPerlが圧倒的支持を得て「Webの母」となる。理由はただ一つ ―― 言語構造に完全に溶け込んだ強力な正規表現である。
char[])とポインタ操作で泥臭くメモリを管理。HTMLを1行結合するだけでもバッファオーバーフローの危険が常に付きまとった。sed や awk などの外部コマンドをパイプで繋ぐ必要があったが、複雑な条件分岐を安全かつ高速に処理する表現力が不十分だった。=~(マッチ)や s/検索/置換/ といった演算子が言語レベルで提供され、PCRE(Perl互換正規表現)の仕様は現代のほぼ全言語の祖となった。この「HTMLという不規則で汚いテキストを、最も安全に、最も短いコードで、バグなく切り貼りできる」という圧倒的な実利が、PerlをWeb創世記の唯一王に押し上げた。
PerlによるCGIはWebに双方向性をもたらしたが、根本的に「アクセスのたびにOSがゼロからPerlプロセスを起動(Fork)する」という構造的な欠陥を抱えていた。
掲示板やフォームが頻繁にダウンする原因となったこの「プロセスのフォークコスト」を避けるために、のちにプログラムをサーバー(Apache)に常駐させる mod_perl や mod_php が生まれ、サーバーサイド言語の常駐化モデルへと繋がっていく。
オープンソースが結託し、表現力に飢えたクリエイターが立ち上がり、Webは「専門家のもの」から「みんなのもの」へと墜ちていった。
1990年代後半、オープンソースの強力なエコシステムが結託し、現代Webのインフラ基盤となるLAMPが誕生する。
特にPHPは、「HTMLの中に直接 <?php ... ?> と記述するだけでプログラムが動く」という圧倒的な直感性と、個人のPCで簡単に開発環境を構築できるMAMP/WAMPの普及により、Web開発のハードルを地面まで引き下げた。WordPressなどの誕生を支え、Webの民主化を成し遂げた。
大規模化するとロジックとHTMLが泥沼のように混ざり合い、メンテナンス不能な悲劇を量産する結果となった。
当時のHTML/CSSの表現力は貧弱極まりなかった。そこに彗星のごとく現れたのがAdobe Flashである。ベクターグラフィックス、タイムラインアニメーション、サウンド、動画の完全な統合。Flash Playerプラグインさえあれば、OSを問わず寸分違わぬ動作を保証(Write Once, Run Anywhere)した。
プラットフォーム(ブラウザ/OS)がコントロールできない「クローズドな独自プラグイン」だったため、最終的にスティーブ・ジョブズによるiPhoneでのFlash排除(セキュリティ、重さ、バッテリー消費を理由とする)が決定打となった。
独自の重量ランタイムは、オープンな標準規格の進化に最終的に敗北する ―― これがWebの鉄則として刻まれた。
2004年、DHHが提唱したRuby on Railsは、Web開発の進め方を根本から変えた。設定より規約(CoC)、DRY(Don't Repeat Yourself)、そしてMVCモデルの標準化。スタートアップが1秒でも早くプロダクトをローンチするための「DX(開発体験)」の概念を、初めて確立した。
スマホ時代(モバイルファースト)の到来とともに、サーバーサイドでページ全体を生成して返す「MPA」の画面遷移(白画面)が、ユーザー体験の新たなボトルネックとなった。
画面遷移という「白い無」から逃れたい。その執念が、Webを一度「魔法」のように見せ、再び「混沌」へと引き戻した。
2005年、Google Mapsの登場は「白画面を挟まないWeb体験」を世に提示し、世界に衝撃を与えた。Ajax(Asynchronous JavaScript and XML)は、ページ遷移を行わずにバックグラウンドでサーバーと通信し、画面の一部だけを書き換えた。
翌2006年、jQueryは狂暴なほどバラバラだった各ブラウザ(特にInternet Explorer)のDOM操作APIや非同期通信を、たった1つの統一的な書き方で吸収した。
UIが複雑化するにつれ、「ボタンAを押したら、要素Bを隠して、要素Cを活性化して、データをサーバーに送って…」という命令的なコードが絡み合い、メンテ不能なスパゲッティへ回帰した。
2010年、Googleが放ったAngularJSは、JS側のデータ(Model)と画面(View)を同期させる「双方向データバインディング」という魔法の仕組みを提示した。どちらかが変われば自動でもう一方も変わる。理想的な世界だった。
画面の要素が増え、データフローが複雑化すると「何が原因でデータが変わったのか」を追跡することが不可能になり、ループや深刻なパフォーマンス低下を引き起こした。
「JSの中にHTMLを書くなんて汚い」と大炎上したReactが、わずか数年でWebのデフォルトを完全に書き換えた。これはコペルニクス的転回だった。
Facebook(当時)が放ったReactは、これまでのすべての「データバインディング」や「DOM操作」の常識を破壊した。単方向データフロー。データは上から下へ流れるだけ。状態(State)が変われば、UIはそれを投影して「再描画」される。
宣言的UI ― 「状態Aのとき、画面はこうあるべきだ」という最終結果だけを記述する。仮想DOM ― メモリ上に仮想のDOMツリーを作成し、変更前後の差分だけを実DOMに適用する。
覇権獲得の鍵は2つあった。第一に、Facebook/Instagramという動かぬ証拠。第二に、React Nativeの「Learn Once, Write Anywhere」が経営層に刺さる強烈なコスト削減アピールとして機能したことだ。
React、Vue、Angular2+によるSPAは、リッチなデスクトップアプリのような体験をもたらしたが、新たなトレードオフに衝突した。
ブラウザが巨大なJavaScript(bundle.js)をダウンロードし、パースして実行し終えるまで画面に何も映らない。真っ白な画面。
クローラーがJSを実行できない場合、中身が空っぽのサイトと判定され、検索順位やSNSシェアの表示で絶望的な不利益を被った。
「すべてを詰め込んだモンスター」となった結果、現代の開発者は再び、見えない苦痛に耐えることを強いられている。
ZEIT(現Vercel)が開発したNext.jsは、SPAの「滑らかなUX」と、PHP/Railsのような「サーバーサイドの利点」を合体させた。Zero ConfigでJS疲弊から開発者を救い、SSG/SSR/ISRのハイブリッドレンダリングを提供し、git pushするだけのVercelデプロイで開発・公開フローを一本化した。
すべてを詰め込んだ結果、現代の開発者は再び、「見えない苦痛」に耐えることを強いられている。
サーバーでレンダリングしたHTMLを送っても、そのままではボタン一つ動かない。裏で巨大なJSをDL・実行し、構造を「合体(Hydration)」させる必要がある。サーバーとクライアントで全く同じ計算を2回回す、リソースの無駄。
App Router以降は4つの独立したキャッシュ層(Request Memoization, Data Cache, Full Route Cache, Router Cache)を持つ。Revalidationのタイミングが極めて不透明で、「コードを変えたのに画面が更新されない」バグのデバッグに開発者は膨大な時間を奪われる。
ISR、画像最適化、エッジミドルウェアなどは、Vercelのインフラで動かすことを前提に最適化されている。AWSやGCPでのセルフホストは著しく難しく、価格改定や仕様変更に依存せざるを得ない構造的依存が強まっている。
「このコードはサーバーで動くのか、クライアントで動くのか」を常に脳内デバッグし、'use client'と'use server'の境界線を綱渡りしなければならない。「手軽にWebを作る」という初心からの著しい逸脱。
Next.js一強に対する不満を抱えた天才たちが、それぞれに異なる哲学を掲げて挑んだ。しかし、Reactという巨大な惑星の重力は、誰も振り切ることができなかった。
Loader & Action の美しさ。ブラウザ標準 <form> と HTTP の POST/GET でデータミューテーションが完結し、Redux などの状態管理ライブラリが不要に。完璧なNested Routingは Next.js App Router の土台となった。
Vercelの莫大な投資と広告宣伝の前に、初期有料ライセンスのRemixはコミュニティ拡大スピードで敗北。Shopify買収後、React Router (v7+) へ合流する形で看板を下ろした。
let count = 0 と書くだけで状態になる驚異的なシンプルさ。コンパイル時に純粋な命令的JSへ変換し、ブラウザに送るJSサイズは劇的に小さく、実行速度も爆速。
npmに存在する何百万ものReactコンポーネント、デザインシステム、チャートライブラリのエコシステムの壁。Svelte 5の「Runes」導入が、初期の「究極のシンプルさ」を愛していた層に揺らぎをもたらした。
サーバーで実行したJSの実行状態をHTMLにシリアライズして埋め込む。ブラウザは1バイトもJSを動かさずに即座にインタラクティブ。初期JSダウンロード量は実質「0」。
コンパイラがJSを細切れにするため、関数を $(() => ...) という特殊な記号で囲み続ける必要がある。脳に強烈な違和感(メンタルモデルの乖離)。Qwik Reactでブリッジしても結局Hydrationが発生し、本来の恩恵が相殺された。
見た目はReactそのものでJSX採用。だが内部は仮想DOMを使わず、Signalが変わった箇所「だけ」をピンポイントで書き換える。「Reactの皮を被った超高速エンジン」。
Reactでは「関数が毎回再実行される」のに対し、Solidは「関数は1回しか実行されない」。普通のJSのクロージャやオブジェクトのデストラクトでリアクティブ性が失われる。「そっくりなのに原理が真逆」という致命的なギャップ。
「Reactエコシステムを敵に回すと、どんなに優れていても勝てない」という歴史の教訓から、「既存のReactを敵に回さず自社に吸い込む(BYOF)」という賢利な戦略で大成功。ページ全体は「JS 0バイト」の軽量HTMLとして出力し、動的な部分だけを「島」として部分的にハイドレーション。
Next.jsの「勝手に色々やってくれるブラックボックス」への疲弊に対し、「すべて開発者が明示的にコントロールする、完璧な型安全と疎結合」を掲げて急成長。TanStack StartはViteベースで特定インフラにロックインされず、Next.jsの複雑さに疲れた層を吸収中。
現代のWeb開発のもう一つの暗部が、「最小特権の原則の欠如」によるサプライチェーン攻撃である。
Node.js環境下では、npm install した文字数カウント用のささやかなライブラリですら、デフォルトであなたのサーバーのファイルシステム、ネットワーク、環境変数(APIキーやDBパスワード)へのフルアクセス権限を持ってしまう。構造的脆弱性が日増しに深刻化している。
Next.jsが「Node.jsとReactの統合」だったとすれば、次のパラダイムは「ユニバーサルなポータブル実行環境」と「WASM特化言語」による、真のゼロトラスト・超軽量フレームワークである。
WASMはブラウザやエッジで動く高速なバイナリ形式である。これまでのNode.jsのセキュリティ限界を根本から解決する。
デフォルトでは、ファイル・ネットワーク・メモリ外へのアクセス権限が「0」。明示的に与えなければ何もできない。
スマホアプリのように「このWASMには特定のフォルダ読込みだけを許可」といった、厳密な最小特権管理が可能。
Cloudflare Workers、Fastly、自前サーバー、AWS。インフラを問わず100%同じ動作を保証。ベンダーロックインの完全崩壊。
従来のWASM開発(C++、Rust、Go)はコンパイル後のバイナリが肥大化し、Webで使うには重すぎた。MoonBitは、最初から「WASM(およびWasmGC)」のためにゼロから設計された新世代言語である。
Rustのようなモダンな型安全性を持ちながら、所有権やライフタイムのような「難解さ」を排除し、TypeScriptのようにサクサク書ける。
コンパイル速度はミリ秒単位。出力されるWASMバイナリは従来言語より劇的に小さく、Webのロード速度を阻害しない。
WASMだけでなくJSやNativeへのコンパイルも可能。Luna UI、Rabbita、SolなどのフロントFW・SSRフレームワークの実験が既に開始。
「Next.jsの次」のフレームワークがキャズムを越え、デフォルトになるための現実的な道。それはAstroの戦略をWASM上に移植した「マルチランタイム」である。
これにより、開発者は既存のコードを捨てるリスクを一切負わずに、セキュリティが重要で高頻度アクセスな部分から、段階的に「WASMの島」へ移行していくことができる。
Webの進化の振り子は、「記述を楽にする(Rails / React)」と「実行を速く・安全にする(CGI / WASM)」の間を往復し続けている。Next.jsが「Reactを延命させるための巨大な設定の塊」になった今、振り子は再び「実行時のシンプルさと安全性」へと揺り戻り始めている。