
“隻要應用能用 JavaScript 編寫,那麼最後它就會用 JavaScript 編寫。”——Atwood 定律
浏覽器大戰
在 Android 裝置或 iPhone 流行之前,浏覽器大戰的戰場是桌面計算機平台。衆多公司投入了數十億美元投身這場戰役,而他們的出發點就是基于這樣的一個假設:誰統治了桌面浏覽器市場,誰就将統治整個網際網路。如今,所有網站的全部流量有将近一半來自移動裝置;但在 20 世紀 90 年代,網絡上的幾乎所有活動都是來自桌上型電腦的,而絕大多數台式電腦都運作着某個版本的微軟 Windows 作業系統。
Netscape 稱霸的歲月
在浏覽器領域,網景通訊公司(Netscape Communications Corporation)取得了先發優勢。他們建構了 Netscape Navigator 浏覽器,讓數以百萬計的使用者第一次邁入了網際網路世界的大門。Netscape 一度擁有超過 80%的市場佔有率,但他們也不乏競争對手。當時 IBM 有一個 OS/2 浏覽器,Oracle 則擁有與 Netscape 相容的 Powerbrowser,其中包含一種稱為資料庫标記語言的東西。當然,Netscape 的最大威脅來自占據全球桌上型電腦作業系統 80% 以上份額的企業:也就是微軟公司。
在戰略層面上,Netscape 意識到我們要跨越靜态網頁時代才能發揮 Web 的全部潛力。就算這些網頁是由 Web 伺服器上的 CGI 腳本動态建立的,但一旦它們到達浏覽器後頁面就不會改變了。如果你想要檢視頁面的修改版本,哪怕是一丁點改動也必須将請求發送回伺服器并等待響應。從複雜程度來說,Web 浏覽器感覺很像是一個連接配接到大型機的啞終端。Web 開發人員需要的是一種可以在浏覽器中運作的程式設計語言,利用桌上型電腦的處理能力為使用者提供更豐富的體驗。
是以在 1995 年微軟步步緊逼的背景之下,Netscape 決定邁向未來,創造開發人員需要的這種語言。Netscape 首席執行官 Jim Clark 召來了一位名叫 Brendan Eich 的天才程式員,後者的構想是在浏覽器中實作 Scheme 程式設計語言。Scheme 在學術界廣受歡迎,但在市場上并沒有太大的吸引力。Eich 認為它可能非常适合網頁程式設計。後來他将 Scheme 稱為“令我心動的那種美麗的研究語言”。
但事情還有點複雜:Netscape 已經從 Sun Microsystems 獲得了 Java 許可。彼時人們認為 Java 才應該是浏覽器使用的語言。不幸的是,Java 對于當時主流的低速網絡來說太沉重了。開發人員必須編譯他們的代碼,然後将代碼提供給浏覽器。如果你的代碼和使用者在其機器上使用的 Java 版本不一樣,那就自求多福吧。這意味着使用者需要耐心地通過在今天看來極為緩慢的連接配接下載下傳體積足有 10 MB 或更多(!)的 Java 虛拟機。那時一個網頁及其包含的所有非 Java 内容可能不超過幾百 KB;運作 Java 的開銷太大了。
相比之下,Eich、Netscape 的 Marc Andreessen 以及 Sun 的 Bill Joy 都認為這個世界需要一種類似 BASIC 的語言,這樣的語言非常适合連編譯器是什麼都不知道的開發人員。難道建立網頁的開發者必須了解 public static void main(String[] args) 的含義嗎?Eich 不這麼認為。
于是他們決定建立一種新的程式設計語言,并在 Netscape Navigator 2.0 中釋出。作出這個決定的那天離釋出隻剩十天了。Eich 隻用了 10 天時間就建立了 LiveScript,後來它改名為 JavaScript。(正如他多年後回憶的那樣,“我就沒睡過什麼覺。”)一夜之間,開發人員就可以為他們的網頁添加邏輯了。更棒的是這種語言直接與 Web 開發人員想要使用的東西(包括頁面 HTML 内容的文檔對象模型(DOM)和浏覽器視窗本身等對象)聯系在一起。如果你想浏覽并使用頁面的文檔結構,用 JavaScript 就可以輕松完成任務。如果你想調整視窗大小或移動視窗,或打開一個新視窗,JavaScript 都能輕松實作。
IE 為無名小卒
下面這段關于人類傲慢與自大的故事來自我個人的經曆:1996 年 3 月,我在舊金山參加第一屆Netscape 開發者大會。當時一位年輕的,穿着 Zegna 的百萬富翁(我記不住他的名字了)作了一次演講,告訴聽衆大家可以為 Netscape Navigator 寫代碼…“但如果你想照顧其他百分之三的網際網路使用者,那還可以考慮 Internet Explorer。”很多聽衆聽到這裡都笑了。
反敗為勝,IE 成主角
之後的一周時間裡,我留在舊金山參加微軟專業開發者大會,就是在那次會議上比爾蓋茨和他的微軟公司終于開始了解網際網路了。如果你有時間的話,請回蓋茨的主題演講。不誇張地說,那次演講真的改變了我們生活的世界。演講内容包括遊戲示範、虛拟現實和最先進的網頁設計等,所有内容看起來都很滑稽。還有一個示範最後在幾千人面前以藍色崩潰界面告終;但檔案裡好像沒記載這次失敗。(沒别的意思,我們都是程式員,也都見過這類事情。隻不過我們可能沒有過在史上最富有的老闆面前搞砸這種經曆。)
在那次展會上微軟宣布了一個全方位計劃,使其産品線中的所有内容都以某種形式支援網際網路。這是他們對 Netscape 商業模式持續打擊計劃的火力更新。1996 年底,Netscape Navigator 還有 80%的市場佔有率,維持 49 美元的定價。(是的,你必須付錢才能獲得浏覽器。請與你的爺爺奶奶讨論當時的情況。另外也可以問問他們“撥号”是什麼意思。)但微軟這邊,不僅 Windows 會附送免費的網絡浏覽器,而且微軟還免費提供了一款 Web 伺服器。不幸的是,到頭來 Internet Explorer 與 Netscape 等浏覽器并不能完全相容,其後果在長達 15 年或更久的時間内波及了地球上每一位 Web 開發人員。
不管怎麼說,我離開舊金山後就認為 Netscape 根本不知道自己面臨的是怎樣的威脅。同時我還确信 Virtual Bubble Wrap 這款基于 Flash,運作在 Netscape Navigator 中的遊戲是網際網路史上最出色的成果。我覺得這兩個判斷都是正确的。
小語言,做大事
20 多年過去了,Netscape 早已消逝在了曆史的長河中,那麼為什麼我們還在談論 JavaScript 呢?首先,它在用戶端取得了巨大成功。在 1996 年,如果你是一名想要編寫互動式網頁的 Web 開發人員,那麼你必須學習 JavaScript。在 2019 年,如果你是一名想要編寫互動式網頁的 Web 開發人員,那麼你還是必須要學習 JavaScript。然而,90 年代中期的第一個腳本網頁并不是創新的結束,相反它隻是一個開始。
随着谷歌地圖等應用發展出全新的互動需求,JavaScript 的影響力更加突出了。在過去,地圖網站向你展示的是一個靜态的世界觀。如果你想要檢視地圖的另一部分(縮小、放大、向北 / 向西 / 向南 / 向東移動等),就需要單擊按鈕并等待伺服器向你傳送其他地圖資料。相比之下,谷歌地圖使用 JavaScript 預取你可能想要檢視的其他地圖資料。如果你向某個方向滾動,地圖會立即自動顯示。靜态地圖需要在每次操作時同伺服器往返資料,是以很快就被淘汰了。
服務端 Node.js 的誕生鞏固了 JavaScript 的主導地位。最起碼,它使 Web 開發人員能夠将他們的 JavaScript 技能從用戶端帶到伺服器上。結合将函數作為對象(回調)傳遞的能力,Node.js 的事件循環推廣了一個全新的程式設計模型。一夜之間,你隻用幾行代碼就能編寫一個 Web 伺服器了。
随後 Node 包管理器(npm)崛起,開發者用 npm 來管理依賴關系意味着一個非常小的應用程式可以利用其他包來做非常複雜的事情。吹一下我自己的例子吧, Coderland Compile Driver 中的knative-proxy 包隻需要不到 40 行代碼就能處理 HTTP POST 和 OPTIONS 動作。我寫這個包才用了差不多半小時。
JavaScript 是一種簡潔而樸實無華的語言,它觸及了你生活的每個角落。隻要關掉浏覽器的 JavaScript,就能看到有多少 Web 内容無法正常工作了。(關于這是好事還是壞事的哲學争論就留給讀者思考了。)無論你在何處,以何種方式使用網際網路,Brendan Eich 在那 10 天裡不眠不休的工作成果都是計算史上最重要的一次沖刺。你不一定要喜歡 JavaScript,但如果你以 Web 開發為生就必須學習它。