John Resig 與 jQuery:DOM 操作的聖杯#
2006 年 1 月 14 日,紐約的 BarCamp NYC 會場,一個二十多歲的年輕人上台演示了他業餘寫的一個 JavaScript 函式庫。當時沒有人意識到,這個最初名叫 jSelect、後來改名 jQuery 的東西,將統治前端開發將近十年。這個人叫 John Resig。
Resig 的背景並非名校名企。他就讀羅徹斯特理工學院(RIT)電腦科學系,畢業後在當地一家公司做電腦視覺相關的工作。他對 JavaScript 的鑽研幾乎全是業餘的:他長期在部落格上寫深入的語言分析文章——閉包、原型繼承、方法重載的技巧——逐漸成為社群裡公認深懂這門語言的人。他之所以要寫函式庫,動機來自最普遍的痛苦:瀏覽器相容性地獄。
那是前端史上真正的黑暗十年。IE5/6、Firefox、Opera、Safari 各行其是:取得元素要用 document.getElementById,事件綁定在 IE 是 attachEvent、其他瀏覽器是 addEventListener,事件物件結構不同,CSS 選擇器查詢根本不存在(只能手工遞迴遍歷 DOM 樹),透明度要寫成 filter: alpha 與 opacity 兩套,連最簡單的 DOM 就緒時機都要為每家瀏覽器寫不同分支。開發者把大量生命花在 if-else 裡,寫的是「跨瀏覽器相容程式碼」而非產品邏輯。
jQuery 的理念濃縮成一句口號:「寫得少,做得多」(write less, do more)。它不是靠某一項黑科技,而是靠幾個環環相扣的設計決策。核心是把 CSS 選擇器當成查詢語言:$('div.foo') 一行就取得所有符合的元素——後來瀏覽器原生的 querySelectorAll 正是受它啟發而標準化的。第二是鏈式呼叫(chaining):因為每個操作都回傳同一個包裝集合,$('#menu').addClass('open').fadeIn().on('click', fn) 可以一路寫下去,程式碼讀起來像在描述意圖。第三是隱式迭代:你對「選取集」操作,函式庫自動對集合裡每個元素做同樣的事,開發者不必再寫 for 迴圈。第四、也是最艱難的一項,是把瀏覽器差異完整抽象掉:.on()、.css()、.ajax() 的底下,藏著 Resig 與社群用無數測試堆出來的相容性判定。整個黑暗時代的髒活,被裝進一個當時僅約 20KB 的檔案裡。
技術、文化與教育的匯流,造就了 jQuery 2006 到 2013 年的統治期。技術上,它幾乎是唯一同時做對選擇器、動畫、Ajax 與相容性的函式庫,Plugin 生態(lightbox 燈箱、表單驗證、輪播)讓新手「一行引入就有效果」。文化上,WordPress 的後台內建 jQuery、Bootstrap 的 JavaScript 元件以 jQuery 為基礎,無數公司網站與電商把它當成預設選擇;W3Techs 統計,2012 年前後全球過半網站使用 jQuery,巔峰時更高。教育上,它的意義或許最深遠:對整整一代前端工程師,jQuery 就是入門磚——許多人是先「用 jQuery 做出東西」,才回頭理解什麼是 DOM、事件與非同步。它把一門被嘲笑為「玩具」的語言的開發者體驗,拉到可用甚至愉快的水準。
所以說 jQuery「救了 JavaScript」,並不誇張。那正是 ECMAScript 停滯的年代:ES4 因社群分裂而流產(2008 年正式放棄),語言本身十年幾乎原地踏步。語言不動,函式庫就動——jQuery、Prototype、MooTools、Dojo 各自補足語言的欠債,而 jQuery 以最貼近 CSS 心智模型的方式勝出。可以說,在 JavaScript 長出肌肉之前,是 jQuery 替它撐住了整個應用時代的第一段路。
統治終有盡時。jQuery 的衰落不是失敗,而是它爭取來的勝利的後果。它最好的發明被瀏覽器吸收:querySelectorAll 讓選擇器成為原生能力,classList、fetch、addEventListener 的標準化、以及各瀏覽器(在 Evergreen 自動更新時代)趨同,抹平了它最大的價值——相容性抽象。更根本的是架構變遷:SPA 框架(Angular、React、Vue)主張「資料驅動畫面」,由框架維護狀態與 DOM 的對應,而 jQuery 的本質恰恰是手動操作 DOM——哲學上直接對立。逐漸地,jQuery 從新專案的預設變成維護遺留系統的工具。
Resig 本人則走向另一條路。他先是擔任 Mozilla 的 JavaScript 布道師,2011 年加入非營利的 Khan Academy 擔任電腦科學院長——一個耐人尋味的選擇:這位讓全世界的網頁動起來的人,把後半段心力放在讓全世界的孩子免費學習。2012 年他短暫在 Twitter(當時 JS 圈最熱鬧的環境)任職,同年出版對社群影響深遠的《Secrets of the JavaScript Ninja》(與 Bear Bibeault 合著)。他沒有創辦獨角獸,也沒有把 jQuery 變成公司——這個影響半個網際網路的函式庫,長期是開源社群的自願奉獻。這種「工具先於商業」的氣質,正是 jQuery 時代的精神底色:在平台與框架尚未圈地之前,前端曾有過一段由一個人的美好品味定義的時光。