一個單行代碼 npm 包使得 JavaScript 生態(tài)系統(tǒng)陷入混亂
上周六,一個很小的 JavaScript 庫的更新使得大部分 JavaScript 生態(tài)系統(tǒng)陷入了混亂。據 ZDNet 指出,大約有數(shù)百萬個項目在這一事件中受到了影響。
而令人感到震驚地是,引起整個混亂的僅僅是一個“單行代碼(one-liner) ” 的 JavaScript 庫。這也是第二次發(fā)生由小型 JavaScript 項目引起廣泛問題的情況。第一次是發(fā)生在 2016 年 3 月,當時 left-pad JavaScript 庫的作者(一個總共只有 17 行代碼的項目)突然決定取消發(fā)布該庫,以類似的方式破壞了數(shù)千個項目。
而上周末導致一系列問題的這個軟件包名為 is-promise,該庫由兩行原始源代碼組成,開發(fā)人員可以通過單行調用在自己的項目中使用它。其目的是讓開發(fā)人員測試 JavaScript 對象是否為“Promise”函數(shù):用于生產環(huán)境中時,該函數(shù)返回 yes 或 no 的布爾值。
然而,盡管只是兩行執(zhí)行基本檢查的代碼,is-promise 庫仍是當今最受歡迎的 JavaScript npm 軟件包(庫)之一。根據 GitHub 的說法,該庫是超過 340 萬個項目的一部分,并被 766 個其他 JavaScript 庫用作依賴項。
上周末,is-promise 庫進行了更新,以獲取作為 ES 模塊(JavaScript 語言使用的標準化模塊系統(tǒng))的支持。但是,is-promise v.2.2.0 版本卻未遵循正確的 ES 模塊標準。因此更新發(fā)布后,由于其不正確的 ES 模塊支持 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ,在各自的構建鏈(build chain)中使用 is-promise 的眾多項目紛紛開始出現(xiàn)問題。
該錯誤迅速地引發(fā)了一連串的影響,范圍涵蓋至封閉源 JavaScript 代碼庫和 JavaScript 生態(tài)系統(tǒng)中一些最大的項目。其中包括有:Facebook 的 Create React App(用于創(chuàng)建 React 應用程序的標準模板)、谷歌的 Angular.js 框架、谷歌的 Firebasse-tools、亞馬遜的 AWS Serverless CLI、Nuxt.js 和 AVA 等。
So this just happened.Is-Promise just made a little change and it broke multiple packages.So far as I've read its broken Firebase-tools, angular cli, aws serveless cli, create react app, possibly more.https://t.co/3ZZofevWNR— Preet? (@TmPreet) April 25, 2020
該 bug 并沒有導致現(xiàn)有項目崩潰,因此沒有出現(xiàn)實際的停運故障,但其確實害得廣大開發(fā)人員無法編譯各自項目的新版本。
之后,is-promise 團隊發(fā)布了一個更新,但并未能解決該問題,最終還是在 v2.2.2 版本中撤回了支持 ES 模塊的功能。
與 2016 年的情況一樣,is-promise 事件引發(fā)了人們的疑問,大家開始討論 JavaScript 生態(tài)系統(tǒng)中是不是真的需要單行代碼庫。就像 2016 年以及多年前其他編程語言的生態(tài)系統(tǒng)所提出的那樣,同樣的觀點再次被提了出來。
有人認為,如果開發(fā)人員創(chuàng)建的庫只有短短幾行代碼,對于最無關緊要的操作而言,模塊化做得過頭了,毫無必要。還有人認為,需要對這些項目進行模塊化,因為以這種方式,“任務 A”可以在一個模塊中進行管理,而不是讓成千上萬的開發(fā)人員在自己的項目中以不同的方式來處理它。
事實上,有關模塊化的討論已經存在了多年,因此在短期時間內可能也得不出什么結論。