XMLHttpRequest 與 AJAX 奇蹟#
改變 Web 命運的那個物件,最初是為了 Outlook 而生。1990 年代末,微軟 Exchange 團隊負責 Outlook Web Access(OWA)——讓使用者在瀏覽器裡收發郵件。問題是:每次點「收信」或「開信」,整頁都要重新載入,體驗支離破碎。工程師 Alex Hopmann 回憶,團隊(包括 Thomas Reardon 等人構想的基礎)在 1998 年前後為 IE5 實作了一個 ActiveX 控件,最初叫 XMLHTTP:讓頁面裡的腳本在不重載整頁的前提下,向伺服器發出 HTTP 請求並取回 XML 資料。1999 年 3 月,IE5 隨這個控件出貨。它原本只是 OWA 的內部工具,一個為了把 Outlook 搬進瀏覽器而打造的權宜之計——微軟沒有公開宣傳,文件寥寥,彷彿藏在一間閣樓裡的發動機。
接下來的幾年,這台發動機被別人悄悄裝上了車。Mozilla 在 Netscape 之後的開源瀏覽器裡以原生 XMLHttpRequest 的名義實作了同等功能(2000 年代初),Safari 與 Opera 跟進。但分散在各瀏覽器裡的 API 沒有名字、沒有運動、沒有身分,多數開發者根本不知道它的存在。真正點火的另有其人。
第一個大聲示範的是 Google。2004 年 4 月 1 日,Gmail 上線:一個在瀏覽器裡持續運作、搜尋即時、信件列表不整頁刷新的郵件服務——容量還標著不斷增長的「1GB 起」,讓當時以 MB 計的 Hotmail 相形失色。人們第一次隱約感覺到:網頁可以像桌面應用一樣流暢。同年稍晚的 Google Suggest,在你打字的瞬間即時下拉建議,背後正是那個無名的請求物件。
給這一切命名的,是 Adaptive Path 的資訊架構師 Jesse James Garrett。2005 年 2 月 18 日,他發表文章〈Ajax: A New Approach to Web Applications〉。Garrett 需要一個詞向客戶解釋這種新做法,於是把技術拼圖縮寫成 Ajax——Asynchronous JavaScript + XML。他清晰列出拼圖的組成:XHTML 與 CSS 做呈現、DOM 做動態互動與顯示、XMLHttpRequest 做非同步通訊、JavaScript 把一切綁在一起。他寫道,關鍵的轉變是一種中介層——使用者介面與伺服器通訊之間多了一層 Ajax 引擎,使用者的動作不再直接產生 HTTP 請求,而是交給引擎判斷:需要跟伺服器拿資料就用非同步呼叫,否則自己處理畫面更新。「不要打斷使用者」(eliminate wait, don't interrupt the user)成為這套互動哲學的核心。
這篇文章的威力在於命名。技術早已存在,但「Ajax」給了它一個能寫在提案、履歷與創投簡報上的名字。2005 年 2 月,Google Maps 上線並大量使用這種技術(後文詳述),Flickr 的照片管理也以 Ajax 聞名,37signals 的專案管理工具 Basecamp 展示了小型團隊能用它做出精緻產品。Ajax 一詞引爆了開發社群:一夜之間,履歷上多了「Ajax 工程師」這個頭銜,書籍與研討會蜂擁而至。這是科技史上一個典型的模式——技術的擴散往往不靠發明,而靠命名與敘事。
Garrett 的縮寫裡有個日後顯得諷刺的成分:XML。其實許多早期 Ajax 應用偷偷用的是純文字甚至 HTML 片段,因為 XML 太繁瑣——標籤冗長、解析費事。早在 2001 年,Douglas Crockford 就發明了 JSON:一種直接借自 JavaScript 物件字面語法的資料格式,他稱之為「人類可讀的資料交換格式」——不需要 schema、不需要解析器函式庫,eval 一行就能用(安全的 JSON.parse 後來才標準化)。Crockford 常說 JSON 並不是他「設計」的,而是「發現」的,因為它本來就在 JavaScript 語言裡。到了 2000 年代末,JSON 已實質取代 XML,成為 Web API 的事實標準;Yahoo 在 2005 年底讓 JSON 成為其 API 的正式選項,Twitter 等新服務乾脆只供 JSON。這是 Ajax 故事的續章:名字裡的 X 活了下來,實質的 X 悄悄退場。
更深遠的衝擊在開發模式。此前的 Web 開發是「頁面思維」:一個 URL 對應一頁 HTML,伺服器渲染一切,狀態藏在表單與 cookie 裡。Ajax 之後是「應用思維」:一個頁面是常駐的程式,狀態活在瀏覽器記憶體裡,畫面由腳本動態改寫,伺服器退居為資料服務。這個轉變的代價立刻顯現:瀏覽器的前進/後退鍵失靈、書籤失去意義、程式碼規模暴增——這些痛苦將催生後續的模組化、路由與框架革命。但在 2005 年,開發者只感受到解放:原來瀏覽器不只是文檔檢視器,它可以跑真正的應用。
回望這段歷史,角色分配頗具戲劇性:微軟為了 Outlook 的企業需求發明了引擎,Mozilla 等把它標準化,Google 用 Gmail 與 Maps 證明了威力,Garrett 用一篇文章命名了運動。而這一切的前提,是 1995 年 Brendan Eich 十天趕工出來的 JavaScript——一門當年被視為玩具的語言,終於在十年後成為 Web 應用時代的作業系統。Ajax 不是一項新技術,而是一次重新發現:發現瀏覽器裡早已埋著的火種,只差一個名字去點燃它。