JavaScript 簡史
今年,JavaScript 迎來了 30 歲生日。
image
在這三十年里,JavaScript 從一門僅用 10 天開發(fā)出來的“小眾腳本語言”,成長為全球最受歡迎的編程語言。讓我們通過歷史上的關鍵節(jié)點,回顧它的進化之路,展望它的未來方向。
1994 年 12 月
網(wǎng)景發(fā)布 Netscape Navigator 1.0
Netscape Navigator 1.0 堪稱網(wǎng)頁發(fā)展的里程碑https://www.naquan.com/。它迅速成為最受歡迎的瀏覽器——比 1993 年發(fā)布的 Mosaic 更快、更易用,擁有流暢的圖形界面(不同于早期的文本瀏覽器),還支持 HTML 2.0 等新興標準,最終為 JavaScript 的誕生埋下伏筆。
image
1995 年 5 月
Brendan Eich 創(chuàng)建 JavaScript 首個版本
當時的網(wǎng)頁主要由 HTML 編寫,網(wǎng)景希望為早期網(wǎng)頁增加交互能力。恰逢 Sun Microsystems 推出 Java,網(wǎng)景也獲得了 Java 在瀏覽器中的使用授權。但 Java 對網(wǎng)頁設計師而言過于復雜,于是網(wǎng)景讓 Brendan Eich 開發(fā)一門“看起來像 Java,但采用面向?qū)ο蠖穷惢O計”的腳本語言。短短 10 天,這門如今支撐互聯(lián)網(wǎng)大半江山的語言誕生了。出于營銷考慮,它被命名為“JavaScript”——當時 Java 正值熱潮,這個名字借勢提升了關注度。
1995 年 12 月
網(wǎng)景與 Sun 聯(lián)合宣布 JavaScript:面向企業(yè)網(wǎng)絡與互聯(lián)網(wǎng)的開放跨平臺面向?qū)ο竽_本語言
JavaScript 作為輕量易用的腳本語言被推出,用于為 HTML 添加交互能力。在此次宣布中,網(wǎng)景與 Sun 描繪了新網(wǎng)頁愿景:Java 對象傳輸?shù)娇蛻舳撕?,可通過 JavaScript 腳本修改。值得一提的是,當時有 28 家科技公司(從美國在線到東芝)表示支持。
1996 年 3 月
微軟在 IE 3 中推出 JScript 以競爭 Netscape Navigator
為避開“Java”的版權問題,微軟將其 JavaScript 實現(xiàn)命名為 JScript。與網(wǎng)景的 JavaScript 不同,JScript 可與 Windows 的 ActiveXObject 交互,例如開發(fā)者能通過 IE 連接 Excel 表格:
var ExcelSheet;
ExcelSheet = new ActiveXObject("Excel.Sheet");
// 通過Application對象讓Excel可見
ExcelSheet.Application.Visible = true;
// 在表格第一單元格插入文本
ExcelSheet.ActiveSheet.Cells(1,1).Value = "這是A列,第1行";
// 保存表格
ExcelSheet.SaveAs("C:TEST.XLS");
// 通過Application對象的Quit方法關閉Excel
ExcelSheet.Application.Quit();
// 釋放對象變量
ExcelSheet = "";
1996 年 3 月
Netscape Navigator 2.0 發(fā)布,內(nèi)置 JavaScript 1.0
這是 JavaScript 的正式亮相,隨 Netscape Navigator 2.0 進入數(shù)百萬用戶家中。JavaScript 1.0 帶來了另一項關鍵創(chuàng)新——文檔對象模型(DOM),它后來成為網(wǎng)頁的基礎模型。
image
1997 年 6 月
網(wǎng)景將 JavaScript 提交至 ECMA 國際
為避免 JavaScript 與微軟 JScript 導致瀏覽器生態(tài)分裂,網(wǎng)景將 JavaScript 提交給 ECMA 國際,旨在打造一種廠商中立的標準化語言。該標準規(guī)范名為 ECMA-262,語言被命名為“ECMAScript”(因商標問題未沿用 JavaScript),而 JavaScript 和 JScript 則成為其方言。此外,由網(wǎng)景、微軟、Sun Microsystems 等公司代表組成的技術委員會 TC39 成立,負責 ECMAScript 的演進管理。
1998 年 1 月
市場份額下滑之際,網(wǎng)景開源 Navigator,催生 Mozilla 項目
由于微軟將 IE 與 Windows 捆綁,Netscape Navigator 市場份額急劇下降。為挽救公司并與微軟競爭,網(wǎng)景大膽開源瀏覽器代碼“Mozilla”(內(nèi)部代號,由“Mosaic”和“killer”組合而成),讓社區(qū)參與開發(fā)更先進、更符合標準的瀏覽器。次日,網(wǎng)景的 Jamie Zawinksi 注冊了 mozilla.org。Mozilla 項目催生了多項影響深遠的技術和產(chǎn)品:Firefox、標簽頁瀏覽、瀏覽器擴展,以及編程語言 Rust。
image
1998 年 9 月
首個 ECMAScript 語言規(guī)范正式發(fā)布(ECMAScript 2)
盡管未添加新特性,但該版本確保規(guī)范簡潔、一致且標準化,為后續(xù)所有版本奠定了基礎。
image
1999 年 3 月
微軟發(fā)布 IE 5,采用了比以往更多的專有技術
更重要的是,微軟引入了XMLHttpRequest——這是首個通過 JavaScript 發(fā)送 HTTP 請求的實用方式:
// IE5中發(fā)送HTTP請求的方式
<script type="text/javascript">
? function makeRequest() {
? ? // 創(chuàng)建ActiveXObject(專為IE5/IE6設計)
? ? var xhr = new ActiveXObject("Microsoft.XMLHTTP");
? ? // 發(fā)起GET請求(異步=true)
? ? xhr.open("GET", "https://example.com/data.txt", true);
? ? // 定義響應就緒時的回調(diào)函數(shù)
? ? xhr.onreadystatechange = function() {
? ? ? if (xhr.readyState === 4 && xhr.status === 200) {
? ? ? ? alert("收到響應:" + xhr.responseText);
? ? ? }
? ? };
? ? // 發(fā)送請求
? ? xhr.send();
? }
</script>
<button onclick="makeRequest()">發(fā)送HTTP請求</button>
1999 年 4 月
JSDoc 問世
JSDoc 松散借鑒了 Java 的 Javadoc,為 JavaScript 引入了結構化文檔規(guī)范。它為語言注入了專業(yè)性,為 IDE 支持奠定基礎,還支持文檔生成(如今支撐deno doc及 jsr.io 上的模塊文檔生成)。
/**
* 將兩個數(shù)字相加并返回結果
* @param {number} value1 第一個數(shù)值
* @param {number} value2 第二個數(shù)值
*/
function addNumbers(value1, value2) {
? return value1 + value2;
}
1999 年 12 月
ECMAScript 3 發(fā)布,新增do-while、正則表達式、字符串新方法(concat、match、replace、slice、split)、異常處理等特性
ECMAScript 3 是 JavaScript 早期的重要里程碑,將其從“玩具腳本語言”轉(zhuǎn)變?yōu)閲烂C的編程工具。它成為未來十余年瀏覽器腳本的基準版本,被廣泛認為是定義網(wǎng)頁 JavaScript 的關鍵版本。
2001 年 4 月
首條 JSON 消息發(fā)送
消息格式大致如下:
<html><head><script>
? ? document.domain = 'fudco';
? ? parent.session.receive(
? ? ? ? { to: "session", do: "test",
? ? ? ? ? text: "Hello world" }
? ? )
</script></head></html>
2002 年 6 月
JSLint 問世,被譽為“所有 JavaScript 語法檢查工具的鼻祖”
由 Douglas Crockford 創(chuàng)建的 JSLint 是首個主流 JavaScript 靜態(tài)代碼分析工具。當時 JavaScript 雖被廣泛使用,但開發(fā)者對其理解不深,代碼編寫缺乏規(guī)范。JSLint 致力于提升代碼質(zhì)量,其強硬的規(guī)范主張也為 Crockford 的著作《JavaScript:好的部分》提供了靈感。
2002 年 9 月
Mozilla 發(fā)布 Phoenix 0.1,F(xiàn)irefox 的前身,旨在與 IE 競爭
因不滿 Mozilla 應用套件的臃腫緩慢,一小隊開發(fā)者打造了極簡瀏覽器 Phoenix(象征從網(wǎng)景和 Mozilla 套件的“灰燼”中重生)。當時 IE 占據(jù) 90%市場份額,創(chuàng)新停滯,而 Phoenix 帶來了速度、簡潔界面、標簽頁瀏覽和彈窗攔截等新體驗。這標志著以用戶為中心的開源瀏覽器重生,打破了微軟的瀏覽器壟斷,為 Firefox 奠定基礎。
image
2003 年 1 月
蘋果推出 Safari 與 WebKit
蘋果 CEO 史蒂夫·喬布斯宣布 Safari 為“Mac OS X 的極速瀏覽器”。最重要的是,它終結了蘋果對微軟的依賴——此前 Mac 用戶依賴 IE for Mac。此外,這為幾年后 iPhone 的 Mobile Safari 鋪平了道路。Safari 基于 WebKit,而 WebKit 源自 KHTML 瀏覽器引擎的內(nèi)部分支。
image
2004 年 4 月
Gmail beta 版發(fā)布,采用全新異步 JavaScript 協(xié)議“AJAX”
Gmail 的推出是網(wǎng)頁開發(fā)的轉(zhuǎn)折點。AJAX 讓 Gmail 實現(xiàn)了前所未有的響應式交互體驗,開啟了 Web 2.0 時代的網(wǎng)頁應用新篇章。
image
2005 年 2 月
Jesse James Garrett 在白皮書《Ajax:Web 應用新方法》中創(chuàng)造“AJAX”一詞
AJAX(異步 JavaScript 和 XML 的縮寫)是一套客戶端技術,能讓網(wǎng)頁應用在不刷新頁面的情況下異步與服務器交換數(shù)據(jù)。這催生了全新類別的網(wǎng)頁應用和框架,帶來豐富流暢的用戶體驗:
<script type="text/javascript">
? function createXHR() {
? ? if (window.XMLHttpRequest) {
? ? ? // 現(xiàn)代瀏覽器(Mozilla、Safari、IE7+)
? ? ? return new XMLHttpRequest();
? ? } else if (window.ActiveXObject) {
? ? ? // 舊版IE(IE5、IE6)
? ? ? try {
? ? ? ? return new ActiveXObject("Msxml2.XMLHTTP");
? ? ? } catch (e) {
? ? ? ? try {
? ? ? ? ? return new ActiveXObject("Microsoft.XMLHTTP");
? ? ? ? } catch (e) {
? ? ? ? ? alert("您的瀏覽器不支持AJAX。");
? ? ? ? ? return null;
? ? ? ? }
? ? ? }
? ? }
? ? return null;
? }
? function loadData() {
? ? var xhr = createXHR();
? ? if (!xhr) return;
? ? xhr.onreadystatechange = function() {
? ? ? if (xhr.readyState === 4) {
? ? ? ? if (xhr.status === 200) {
? ? ? ? ? document.getElementById("result").innerHTML = xhr.responseText;
? ? ? ? } else {
? ? ? ? ? alert("請求失敗:" + xhr.status);
? ? ? ? }
? ? ? }
? ? };
? ? xhr.open("GET", "/messages/latest", true); // 模擬Gmail風格的接口
? ? xhr.send(null);
? }
</script>
<button onclick="loadData()">加載最新消息</button>
<div id="result">等待響應...</div>
2005 年 3 月
Mozilla 公司推出 DevMo,后演變?yōu)?MDN
Mozilla 推出 DevMo(后更名為 Mozilla 開發(fā)者網(wǎng)絡 MDN),提供準確、中立、基于標準的文檔,成為學習網(wǎng)頁標準的核心平臺。當時瀏覽器兼容性是主要痛點,文檔分散、過時且不一致,MDN 迅速成為開發(fā)者首選資源,為開發(fā)者文檔樹立新標準。
image
2006 年 3 月
John Resig 向名為 jQuery 的項目提交首行代碼
jQuery 是簡化 HTML DOM 遍歷、事件處理、AJAX 等操作的 JavaScript 庫,旨在解決令人頭疼的跨瀏覽器兼容問題。它提供了文檔完善的簡潔 API,重新定義了開發(fā)者體驗,至今仍是頁面加載量最高的 JavaScript 庫:
<script src="https://code.jquery.com/jquery-1.0.0.min.js"></script>
<script type="text/javascript">
? function sendRequest() {
? ? $.ajax({
? ? ? ? url: "https://example.com/data",
? ? ? ? type: 'GET',
? ? ? ? success: function(res) {
? ? ? ? ? document.getElementById("result").innerHTML = res;
? ? ? ? },
? ? ? ? error: function(xhr, status, error) {
? ? ? ? ? alert("請求失敗:" + status);
? ? ? ? }
? ? });
? }
</script>
<button onclick="sendRequest()">獲取數(shù)據(jù)</button>
<div id="result">等待響應...</div>
2007 年 1 月
首款蘋果 iPhone 發(fā)布,其 Mobile Safari 不支持 Flash
不支持 Flash 的決定當時頗具爭議——那時 90%的交互式多媒體依賴 Flash。但史蒂夫·喬布斯反對 Flash,因其資源消耗高、易崩潰且具有專有性。開發(fā)者從中意識到,移動網(wǎng)頁內(nèi)容的未來不再依賴 Flash。
image
2008 年 2 月
Netscape Navigator 落幕,標志“第一次瀏覽器戰(zhàn)爭”結束
AOL 正式終止 Netscape Navigator,這款 90 年代曾占據(jù) 90%以上市場份額的瀏覽器退出舞臺。它被 IE 超越的部分原因是微軟將 IE 與 Windows 捆綁,這引發(fā)了針對微軟的里程碑式反壟斷訴訟,重塑了科技監(jiān)管格局。
image
2008 年 5 月
Douglas Crockford 出版《JavaScript:好的部分》
該書重新定義了 JavaScript 的形象——此前它因設計缺陷和混亂行為遭嘲諷,而本書挖掘了其卓越之處。
image
2008 年 9 月
谷歌發(fā)布 Chrome 瀏覽器(當時最快的網(wǎng)頁瀏覽器)及 V8 引擎
當時 IE、Firefox、Safari 等瀏覽器速度較慢,對 JavaScript 執(zhí)行效率關注不足。Chrome 以速度為核心設計,搭載全新 V8 JavaScript 引擎。V8 的創(chuàng)新在于:執(zhí)行前將 JavaScript 編譯為原生機器碼、實現(xiàn)即時編譯、通過垃圾回收更高效地管理內(nèi)存。谷歌隨后開源 V8,供開發(fā)者二次開發(fā),其中最著名的便是 Node.js 項目。
image
2009 年 1 月
CommonJS 規(guī)范誕生(最初名為 ServerJS),規(guī)范 JavaScript 代碼共享方式
此時 JavaScript 開始跳出瀏覽器,向服務器端拓展。大型項目涌現(xiàn),JavaScript 需要更好的方式管理大量源代碼,模塊化成為剛需。
2009 年 3 月
Ryan Dahl 啟動 Node.js 項目
Node.js 是跨平臺開源 JavaScript 運行時,讓 JavaScript 能在瀏覽器外執(zhí)行。它讓開發(fā)者能用 JavaScript 構建網(wǎng)頁服務器乃至全棧應用。如今,約 3.5%的已知服務器網(wǎng)站使用 Node.js,它仍是網(wǎng)頁開發(fā)的主流技術。
image
2009 年 4 月
甲骨文收購 Sun Microsystems,獲得 JavaScript 商標
甲骨文通過收購強化了企業(yè)技術市場地位,同時獲得 Java 所有權。作為交易一部分,甲骨文取得 JavaScript 商標,為該語言的未來埋下困惑伏筆。
image
2009 年 6 月
Express.js 首行代碼提交
Express.js 是輕量靈活的 Node.js Web 框架,以模塊化中間件架構和 RESTful API 構建能力著稱,是生態(tài)中使用最廣泛的框架之一。它啟發(fā)了 Koa、Nest、Fastify 等眾多框架。雖曾一度停滯更新,但如今已迭代至 5.x 版本,持續(xù)維護。
image
2009 年 12 月
ECMAScript 5 發(fā)布,新增strict mode、getter/setter、數(shù)組新方法、JSON 支持、string.trim()、對象字面量尾逗號等特性
這是語言 10 年來的首次重大更新,讓 JavaScript 更強大、安全且易維護。
2009 年 12 月
CoffeeScript 項目啟動
CoffeeScript 因簡潔語法(更少樣板代碼)、箭頭函數(shù)(早于 ES6)、解構賦值(早于 ES6)等特性迅速流行,提升了開發(fā)體驗。
image
2010 年 1 月
npm 1.0 發(fā)布
作為 Node 和 JavaScript 的包 registry,npm 徹底改變了 JavaScript 的共享方式。如今它是全球最大的開源 registry,擁有超 300 萬個包。
image
2010 年 5 月
JetBrains 發(fā)布 WebStorm 1.0,首款 JavaScript 專用 IDE
此前文本編輯器對 JavaScript 支持有限,而 WebStorm 是首個提供高級特性的專用 IDE:代碼分析、錯誤檢測、JS/HTML/CSS 代碼補全、JavaScript 專屬調(diào)試工具。
2010 年 10 月
AngularJS 與 Backbone.js 發(fā)布
隨著 JavaScript 不斷完善,開發(fā)者渴望更高效地構建復雜服務器和應用,兩款全棧框架應運而生并走紅:Angular 聲明式且 opinionated,Backbone 命令式且輕量。這也標志著現(xiàn)代單頁應用(SPA)和“框架更迭”時代的開端——此后大量 JavaScript 框架快速興起又淡出。
image
2011 年 6 月
微軟與 Joyent 將 Node.js 移植到 Windows
2011 年,Joyent 的 Ryan Dahl 與 Deno 聯(lián)合創(chuàng)始人/CTO Bert Belder 完成移植,突破 Unix 系統(tǒng)限制。此次工作催生了 libuv 庫,為 Linux、OSX、Windows 提供統(tǒng)一的異步網(wǎng)絡接口。這不僅加速了 Node.js 發(fā)展,還為微軟開源戰(zhàn)略鋪路,最終重塑其開發(fā)者生態(tài),為 TypeScript、VS Code、Azure 云集成等奠定基礎。
image
2012 年 3 月
Webpack 模塊打包工具問世
Webpack 讓開發(fā)者能將任何資源引入客戶端,最終成為 React、Angular、Vue 等框架的核心構建系統(tǒng),為 Rollup、Parcel、Vite、esbuild 等工具奠定基礎。
image
2012 年 10 月
微軟發(fā)布 TypeScript 0.8 公測版
2010 年,C#和 Turbo Pascal 之父 Anders Heljsberg 開始開發(fā) TypeScript——JavaScript 的靜態(tài)類型超集,旨在簡化大規(guī)模 JavaScript 的開發(fā)與維護。2012 年公開后,它為 JavaScript 生態(tài)帶來企業(yè)級開發(fā)能力,影響 ECMAScript 設計,改變大型應用的構建方式:
function add(x: number, y: number): number {
? return x + y;
}
2013 年 2 月
Mozilla 發(fā)布 asm.js
asm.js 是 JavaScript 的嚴格子集,旨在為網(wǎng)頁帶來接近原生的性能。此前 JavaScript 難以勝任 3D 游戲、視頻處理等 CPU 密集型應用,而開發(fā)者可將 C/C++代碼轉(zhuǎn)換為 asm.js,讓原生應用在瀏覽器運行。它為幾年后的 WebAssembly 鋪平了道路:
(function Module(stdlib, foreign, heap) {
? "use asm";
? function add(x, y) {
? ? x = x | 0;
? ? y = y | 0;
? ? return (x + y) | 0;
? }
? return { add: add };
})(this, {}, new ArrayBuffer(1024));
console.log(Module.add(10, 20)); // 輸出:30
2013 年 3 月
Atom Shell(后更名 Electron)首行代碼提交
Electron 降低了跨平臺桌面應用的開發(fā)門檻——基于 HTML、CSS、JavaScript 等網(wǎng)頁技術,結合 Node.js 和 Chromium,讓開發(fā)者能訪問文件系統(tǒng)、網(wǎng)絡和原生 OS API。它最初為 GitHub 的 Atom 編輯器開發(fā)(2014 年 4 月公開測試),早期知名用戶包括 Slack。Electron 驗證了網(wǎng)頁技術開發(fā)桌面應用的可行性,讓開發(fā)者將文本編輯器從工具重新定義為平臺,啟發(fā)了 VS Code 等現(xiàn)代可擴展網(wǎng)頁驅(qū)動工具。
image
2013 年 4 月
Valeri Karpov 提出“MEAN”棧概念
MEAN 棧代表全棧 JavaScript 框架,包含 MongoDB、Express.js、AngularJS 和 Node.js,深刻影響了現(xiàn)代 JavaScript 網(wǎng)頁開發(fā)。
image
2013 年 5 月
Facebook 發(fā)布 React
由 Meta(原 Facebook)工程師 Jordan Walke 創(chuàng)建的 React 是聲明式 UI 庫,2011 年首次用于 Facebook 新聞流,2013 年在 JSConf US 開源。其組件化開發(fā)模式鞏固了現(xiàn)代應用的聲明式 UI 范式。
image
2013 年 6 月
ESLint 啟動開發(fā)
知名 JavaScript 開發(fā)者、前雅虎 YUI 庫負責人 Nicholas C。 Zakas 開始開發(fā) ESLint——可插件化、可配置的代碼檢查工具,用于識別和修復 JavaScript 問題。ESLint 迅速成為開發(fā)者必備工具,彌補了現(xiàn)有 lint 工具的不足,樹立代碼質(zhì)量與一致性新標準。
image
2013 年 7 月
Gulp 發(fā)布
Eric Schoffstall 推出 Gulp.js,這是用于自動化網(wǎng)頁開發(fā)任務的流式構建系統(tǒng)。Gulp 通過簡潔的代碼驅(qū)動方式處理壓縮、編譯、 linting、測試等重復任務,迅速成為 Grunt(配置繁重)的有力替代者,影響了現(xiàn)代構建工具的演進。
image
2014 年 2 月
Vue.js 發(fā)布
前谷歌工程師尤雨溪推出 Vue.js,這是漸進式 UI 框架,以易上手、可增量采用、高性能著稱,成為現(xiàn)代 JavaScript 生態(tài)最受歡迎的框架之一。
image
2014 年 7 月
StrongLoop 收購開源框架 Express
專注企業(yè)級 Node.js 解決方案的 StrongLoop(Deno 聯(lián)合創(chuàng)始人 Bert Belder 聯(lián)合創(chuàng)立)收購 Express.js,旨在將其整合到 API 和微服務工具套件中。社區(qū)擔心 Express 獨立性受損,催生了 Koa 等框架。2015 年 IBM 收購 StrongLoop,2019 年 Express.js 加入 OpenJS 基金會,確保治理與長期可持續(xù)性。歷經(jīng) 10 年 4.x 版本后,Express 5 于 2024 年 10 月發(fā)布。
image
2014 年 9 月
Babel.js 首行代碼提交
原名 6to5 的 Babel.js 是 JavaScript 編譯器,讓開發(fā)者能編寫現(xiàn)代 JavaScript 并兼容舊瀏覽器/引擎。它迅速成為生態(tài)標準工具,集成到 React、Vue、Angular 等框架及 Webpack、Rollup、Parcel 等打包工具中。
image
2014 年 10 月
Meteor 1.0 發(fā)布
Meteor 以極簡方式構建實時全棧 JavaScript 應用而轟動開發(fā)社區(qū),深刻影響了開發(fā)者對現(xiàn)代響應式實時網(wǎng)頁應用的理解。盡管后期熱度下降,但其理念在 React、Redux、Firebase、GraphQL 等技術中可見一斑。
image
2014 年 11 月
Facebook 推出 Flow,JavaScript 靜態(tài)類型檢查器
Flow 幫助開發(fā)者在開發(fā)階段捕獲 bug 和類型錯誤,用于維護 Facebook 龐大代碼庫并提升效率。但 2010 年代后期 TypeScript 成為主流,F(xiàn)low 逐漸衰落。
image
2014 年 11 月
亞馬遜宣布 AWS Lambda,由 Node.js 驅(qū)動
作為云計算領導者的 AWS 推出無服務器范式 Lambda,開發(fā)者可上傳代碼并響應事件運行,無需管理基礎設施。Lambda 首發(fā)僅支持 Node.js,因其事件驅(qū)動、非阻塞模型適配無狀態(tài)短執(zhí)行場景。AWS Lambda 催生函數(shù)即服務(FaaS)概念,開啟無服務器計算浪潮,谷歌、微軟隨后跟進。
image
2015 年
Matt Biilmann(Netlify CEO)創(chuàng)造“Jamstack”一詞
Jamstack(JavaScript、API、Markup 的縮寫)是前端開發(fā)架構模式,提供更好的性能、可擴展性和開發(fā)者體驗,標志著網(wǎng)頁開發(fā)從 SPA 架構向 SSR/SSG 轉(zhuǎn)變的新時代。
image
2015 年 2 月
Node.js 基金會成立
在 Linux 基金會旗下,Node.js 基金會旨在通過解決項目碎片化問題,推動 Node.js 的開發(fā)與 adoption。當時知名分支 io.js(由前 Node.js 貢獻者主導,追求更快更新和更好治理)于 2015 年 6 月合并回 Node.js?;饡玫?IBM、微軟、PayPal、英特爾、Fidelity、Joyent、Linux 基金會等企業(yè)支持。
image
2015 年 6 月
GraphQL 發(fā)布
Facebook 2012 年開始開發(fā)的 GraphQL 是聲明式 API 查詢語言,實現(xiàn)更少請求獲取所需數(shù)據(jù),并支持強類型。
image
2015 年 6 月
Redux 發(fā)布
隨著 React 應用增多,狀態(tài)管理需求凸顯。Redux 作為可預測狀態(tài)容器應運而生,如今可適配多種 JavaScript 框架。
image
2015 年 6 月
WebAssembly 發(fā)布
WebAssembly 旨在解決瀏覽器中 JavaScript 的性能局限,支持游戲、視頻編輯等高性能應用,還為 C/C++等語言提供網(wǎng)頁運行的便攜安全方案。
image
2015 年 6 月
Atom“可編程”文本編輯器發(fā)布
Atom 是首批基于網(wǎng)頁技術的高可擴展桌面編輯器,強調(diào)深度定制——開發(fā)者可通過插件和主題調(diào)整從 UI 到核心行為的所有細節(jié)。它驗證了 Electron 作為跨平臺桌面應用框架的價值,將文本編輯器從工具重新定義為平臺,啟發(fā)了 VS Code 等工具。
image
image
2015 年 7 月
ECMAScript 6(ES2015)發(fā)布
ES6 帶來了開發(fā)者期待已久的特性:fetch API、import/export原生模塊系統(tǒng)等:
<script type="text/javascript">
? ? function getData() {
? ? ? fetch("https://api.example.com/data")
? ? ? ? .then(response => {
? ? ? ? ? if (!response.ok) {
? ? ? ? ? ? throw new Error("網(wǎng)絡響應異常:" + response.status);
? ? ? ? ? }
? ? ? ? ? return response.text(); // JSON API可用response.json()
? ? ? ? })
? ? ? ? .then(data => {
? ? ? ? ? document.getElementById("result").textContent = data;
? ? ? ? })
? ? ? ? .catch(error => {
? ? ? ? ? console.error("Fetch錯誤:", error);
? ? ? ? ? alert("數(shù)據(jù)獲取失敗。");
? ? ? ? });
? ? }
}
<button onclick="getData()">獲取數(shù)據(jù)</button>
2015 年 9 月
Node.js v4.0 發(fā)布,合并 Node.js v0.12 與 io.js
這是兩大項目的成果結晶,終結了社區(qū)分裂——此前大量 npm 模塊因兼容問題無法跨 runtime 使用。合并后確立長期支持計劃和語義化版本方案,彰顯開放治理與社區(qū)協(xié)作的力量。
2016 年 1 月
微軟開源 Edge 的 Chakra JavaScript 引擎
微軟希望吸引外部貢獻者并擴大 Edge 引擎應用范圍,甚至推出基于 Chakra 的 Node.js 版本。但 V8 憑借龐大社區(qū)和工具生態(tài)仍是主流,2021 年微軟宣布終止 Chakra 開發(fā),轉(zhuǎn)向基于 Chromium 的 Edge(搭載 V8)。
2016 年 3 月
Azer Koculu 從 npm 移除 Leftpad,引發(fā)影響數(shù)百萬用戶的供應鏈攻擊
因與 Kik Messenger 糾紛,Azer 移除left-pad包,導致數(shù)千依賴項目(包括 React、Babel)無法構建/安裝,影響 Meta、Netflix、Spotify 等企業(yè),暴露了 JavaScript 生態(tài)供應鏈脆弱性。此后 npm 調(diào)整政策,限制包移除權限。
2016 年 4 月
微軟發(fā)布 VS Code 1.0——輕量快速的跨平臺 IDE
它基于 Electron 和 TypeScript 構建,提供一流 JavaScript/TypeScript 支持,迅速顛覆 Sublime Text、Atom 等編輯器和傳統(tǒng) IDE。
image
2016 年 6 月
ECMAScript 2016 發(fā)布,新增指數(shù)運算符(**)和array.includes()方法。
2016 年 9 月
Angular(Angular2)發(fā)布
作為 AngularJS 的徹底重寫,它用組件樹替代 MVC,采用 TypeScript 提升工具支持,通過預編譯增強性能與安全性,成為大型企業(yè)應用的首選框架。
image
2016 年 10 月
Next.js 1.0 發(fā)布
Next.js 最初是基于 React、Webpack、Babel 的服務端渲染通用 JavaScript 框架,簡化了 React 服務端渲染,讓開發(fā)者能用 React 構建內(nèi)容密集、SEO 友好的網(wǎng)站。它最終成為生產(chǎn)級 React 應用的默認框架。
image
2017 年 3 月
Temporal 提案啟動
該提案旨在解決 JavaScript 內(nèi)置Date對象的長期問題:不可變性缺失、時區(qū)/夏令時支持不足、解析不一致等。2021 年 Temporal 提案獲準加入 ECMAScript 標準,但目前僅 Firefox Nightly 和 Deno 支持該 API。
2017 年 4 月
Prettier 1.0 發(fā)布
Prettier 是 opinionated 代碼格式化工具,通過解析代碼并按自身規(guī)則重印,消除代碼審查中的格式爭議。ESLint 等工具聚焦問題檢測,而 Prettier 自動修復格式,推廣“先寫后格式化”工作流,提升代碼質(zhì)量與協(xié)作效率。其影響遠超 JavaScript:Python 采用 Black,Rust 將格式化工具納入工具鏈,視格式化為必備構建步驟。
image
2017 年 6 月
ECMAScript 2017 發(fā)布,新增字符串填充、Object.entries()、Object.values()、異步函數(shù)等特性
2017 年,現(xiàn)代瀏覽器已廣泛支持fetch()(除 IE11),許多開發(fā)者開始使用async/await(無論是否通過 Babel):
<script>
? async function getData() {
? ? try {
? ? ? const response = await fetch("https://api.example.com/data");
? ? ? if (!response.ok) {
? ? ? ? throw new Error("HTTP錯誤 " + response.status);
? ? ? }
? ? ? const data = await response.text(); // JSON可用response.json()
? ? ? document.getElementById("result").textContent = data;
? ? } catch (error) {
? ? ? console.error("Fetch失?。?, error);
? ? ? alert("出錯了!");
? ? }
? }
</script>
<button onclick="getData()">加載數(shù)據(jù)</button>
<pre id="result">等待響應...</pre>
2017 年 9 月
Facebook 推出 Yarn 包管理器
Yarn 旨在解決當時 npm 的痛點:速度、可靠性和一致性,引入yarn.lock確定性依賴解析、自動緩存、并行安裝等特性。
在這里插入圖片描述
2017 年 9 月
Cloudflare 推出 Cloudflare Workers,讓開發(fā)者在邊緣節(jié)點運行 JavaScript
Cloudflare Workers 開啟現(xiàn)代無服務器邊緣計算時代,結合無服務器理念與邊緣分發(fā)(當時約 100 個數(shù)據(jù)中心,現(xiàn)超 300 個),實現(xiàn)低延遲與可擴展隔離。邊緣分發(fā)意味著無服務器代碼在用戶附近執(zhí)行,冷啟動時間極短(基于輕量 V8 隔離而非容器/微 VM)。它讓 Cloudflare 從 CDN 轉(zhuǎn)型為全棧網(wǎng)頁應用平臺,啟發(fā) Netlify、Vercel、Deno Deploy 等推出類似邊緣函數(shù)服務。
image
2018 年 1 月
谷歌發(fā)布 Puppeteer 1.0,瀏覽器自動化工具迎來里程碑
與支持多語言綁定的 Selenium 不同,Puppeteer 專為 Node.js 設計,提供現(xiàn)代 JavaScript 優(yōu)先的 API 控制無頭 Chrome。它確立了 Chromium 在自動化領域的地位,導致 PhantomJS 衰落,影響 Playwright、Cypress 等框架開發(fā)。
image
2018 年 3 月
TensorFlow.js 發(fā)布
2015 年谷歌推出的 TensorFlow 是開源機器學習框架,而 TensorFlow.js 讓網(wǎng)頁開發(fā)者無需 Python 即可實現(xiàn)機器學習,將模型嵌入網(wǎng)頁應用,解鎖實時預測與瀏覽器端 AI 應用。
image
2018 年 6 月
ECMA TC39 通過將flatten重命名為flat解決“Smooshgate”事件
2018 年 TC39 提議為數(shù)組新增flatten方法扁平化嵌套數(shù)組,但該名稱與流行庫 MooTools 的現(xiàn)有方法沖突(實現(xiàn)不兼容)。TC39 成員開玩笑建議 rename 為smoosh,雖非認真提議卻引發(fā)熱議和 memes,最終更名為flat。
image
2018 年 10 月
ECMAScript 2018 發(fā)布,新增剩余/擴展屬性、異步迭代、promise.finally()等特性。
2019 年 3 月
JavaScript 基金會與 Node.js 基金會合并為 OpenJS 基金會
當時 JavaScript 開源生態(tài)分散:Node.js 基金會聚焦服務端,JavaScript 基金會(前身為 jQuery 基金會)管理 jQuery、ESLint、Lodash 等客戶端庫。隨著 Node.js 成為后端事實標準、前端庫蓬勃發(fā)展,合并旨在統(tǒng)一治理,全面支持 JavaScript 生態(tài)。
image
2019 年 4 月
Node.js v12.0.0 實驗性支持 ECMAScript 模塊
隨著 JavaScript 采用 ES 模塊作為代碼模塊化與共享標準,Node.js 逐步跟進,引入.mjs擴展名、package.json的type字段及 CommonJS 互操作機制。
2019 年 7 月
ECMAScript 2019 發(fā)布,新增Object.fromEntries()、String.prototype.trimStart()等特性。
2019 年 11 月
Node.js v13.2.0 穩(wěn)定支持 ECMAScript 模塊
這是 Node.js 生態(tài)的重要里程碑,使其與現(xiàn)代 JavaScript 模塊系統(tǒng)對齊,開發(fā)者可原生使用標準化import/export語法。
2020 年 5 月
JavaScript 隨 SpaceX Dragon 進入太空
下圖的觸摸屏界面基于 Chromium 開發(fā),完全用 JavaScript 編寫。SpaceX 軟件工程師在 AMA 中表示,選擇 Chromium 是因為能招募大量熟悉該技術的程序員。
image
2020 年 5 月
Deno 1.0 發(fā)布
Ryan Dahl 宣布 Deno 首個 major 版本,這是“ batteries-included”的現(xiàn)代 JavaScript 全工具鏈,以單可執(zhí)行文件形式發(fā)布,原生支持 TypeScript、采用按需權限模型和 HTTP 導入。
在這里插入圖片描述
2020 年 12 月
Adobe 終止 Flash 支持,終結視頻與游戲的互聯(lián)網(wǎng)文化時代
為懷舊者,互聯(lián)網(wǎng)檔案館保存了 Flash 游戲和動畫。
image
2022 年 6 月
Deno 加入 TC39,彰顯其擁抱服務器端 JavaScript 標準的愿景。
2022 年 6 月
IE11 退役
IE11 的終結標志著長達 20 年的 IE 時代落幕——它曾是全球使用最廣的瀏覽器。因其眾多安全漏洞和標準缺失,退役成為推動網(wǎng)頁生態(tài)走向標準化、安全化、高性能的關鍵一步。
image
2022 年
ECMAScript 2022 發(fā)布,新增頂層await、類新元素、類內(nèi)靜態(tài)塊等特性。
2023 年 9 月
Bun 1.0 發(fā)布
另一款服務端 JavaScript 運行時(用 Zig 編寫)登場,號稱性能最佳的 Node.js 替代品。
image
2024 年 2 月
Node.js 通過設計競賽選定 Rocket Turtle 為吉祥物
Node.js 社區(qū)討論吉祥物多年,2023 年 Matteo Collina 在 GitHub 發(fā)起議題,最終通過 Twitter 設計競賽,2 月選定“火箭龜”為最終形象。
image
2024 年 3 月
JSR 發(fā)布,現(xiàn)代開源 JavaScript registry
Deno 團隊推出的 JSR 旨在優(yōu)化 JavaScript 安裝與發(fā)布體驗,僅支持 ECMAScript 模塊,原生理解 TypeScript,兼容 npm,支持 Deno、Bun、workerd 等多運行時。
image
2024 年 6 月
ECMAScript 2024 發(fā)布,新增toWellFormed()方法(返回合規(guī) Unicode 字符串)等特性。
2024 年 9 月
針對甲骨文的#FreeJavaScript 法律戰(zhàn)打響
Ryan Dahl 博客呼吁甲骨文釋放 JavaScript 商標未獲回應后,Deno 團隊致公開信,向 USPTO 提交商標撤銷申請,主張甲骨文已放棄該商標。公開信獲近 2 萬簽名,包括 Brendan Eich、Isaac Z。 Schlueter 等知名人士,案件目前仍在進行中。
image
2025 年 3 月
TypeScript 將移植到 Go
最初用 TypeScript/JavaScript 實現(xiàn)的 TypeScript,隨項目規(guī)模擴大面臨性能挑戰(zhàn)。Anders Hejlsberg 實驗性地將其移植到 Go,早期基準測試顯示速度提升約 10 倍,團隊計劃在功能與 JavaScript 版本對齊后,以 TypeScript 7.0 推出 Go 移植版“tsgo”。
image
2025 年 5 月
微軟宣布開源 VS Code 的 Copilot Chat 擴展
隨著 AI 輔助編程工具興起,微軟宣布以 MIT 許可證開源 GitHub Copilot Chat 擴展,目標是將 VS Code 打造成開源 AI 編輯器。此舉鼓勵社區(qū)優(yōu)化跨編輯器 AI 交互,提升全工具鏈的智能編程體驗。
JavaScript 的 30 年旅程波瀾壯闊:從簡陋的腳本語言成長為現(xiàn)代網(wǎng)頁開發(fā)的支柱,支撐動態(tài)前端、全棧應用、原生應用乃至 AI 工具。它的進化源于開源精神、熱情社區(qū)、蓬勃生態(tài)與持續(xù)創(chuàng)新。在慶祝三十周年之際,我們對未來同樣滿懷期待:更快的運行時、更智能的工具、更易用、強大、富有創(chuàng)造力的網(wǎng)頁世界。致敬下一個 30 年的邊界突破!