一個(gè)單行代碼 npm 包使得 JavaScript 生態(tài)系統(tǒng)陷入混亂
掃描二維碼
隨時(shí)隨地手機(jī)看文章
上周六,一個(gè)很小的 JavaScript 庫的更新使得大部分 JavaScript 生態(tài)系統(tǒng)陷入了混亂。據(jù) ZDNet 指出,大約有數(shù)百萬個(gè)項(xiàng)目在這一事件中受到了影響。
而令人感到震驚地是,引起整個(gè)混亂的僅僅是一個(gè)“單行代碼(one-liner) ” 的 JavaScript 庫。這也是第二次發(fā)生由小型 JavaScript 項(xiàng)目引起廣泛問題的情況。第一次是發(fā)生在 2016 年 3 月,當(dāng)時(shí) left-pad JavaScript 庫的作者(一個(gè)總共只有 17 行代碼的項(xiàng)目)突然決定取消發(fā)布該庫,以類似的方式破壞了數(shù)千個(gè)項(xiàng)目。
而上周末導(dǎo)致一系列問題的這個(gè)軟件包名為 is-promise,該庫由兩行原始源代碼組成,開發(fā)人員可以通過單行調(diào)用在自己的項(xiàng)目中使用它。其目的是讓開發(fā)人員測試 JavaScript 對象是否為“Promise”函數(shù):用于生產(chǎn)環(huán)境中時(shí),該函數(shù)返回 yes 或 no 的布爾值。
然而,盡管只是兩行執(zhí)行基本檢查的代碼,is-promise 庫仍是當(dāng)今最受歡迎的 JavaScript npm 軟件包(庫)之一。根據(jù) GitHub 的說法,該庫是超過 340 萬個(gè)項(xiàng)目的一部分,并被 766 個(gè)其他 JavaScript 庫用作依賴項(xiàng)。
上周末,is-promise 庫進(jìn)行了更新,以獲取作為 ES 模塊(JavaScript 語言使用的標(biāo)準(zhǔn)化模塊系統(tǒng))的支持。但是,is-promise v.2.2.0 版本卻未遵循正確的 ES 模塊標(biāo)準(zhǔn)。因此更新發(fā)布后,由于其不正確的 ES 模塊支持 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ,在各自的構(gòu)建鏈(build chain)中使用 is-promise 的眾多項(xiàng)目紛紛開始出現(xiàn)問題。
該錯(cuò)誤迅速地引發(fā)了一連串的影響,范圍涵蓋至封閉源 JavaScript 代碼庫和 JavaScript 生態(tài)系統(tǒng)中一些最大的項(xiàng)目。其中包括有:Facebook 的 Create React App(用于創(chuàng)建 React 應(yīng)用程序的標(biāo)準(zhǔn)模板)、谷歌的 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 并沒有導(dǎo)致現(xiàn)有項(xiàng)目崩潰,因此沒有出現(xiàn)實(shí)際的停運(yùn)故障,但其確實(shí)害得廣大開發(fā)人員無法編譯各自項(xiàng)目的新版本。
之后,is-promise 團(tuán)隊(duì)發(fā)布了一個(gè)更新,但并未能解決該問題,最終還是在 v2.2.2 版本中撤回了支持 ES 模塊的功能。
與 2016 年的情況一樣,is-promise 事件引發(fā)了人們的疑問,大家開始討論 JavaScript 生態(tài)系統(tǒng)中是不是真的需要單行代碼庫。就像 2016 年以及多年前其他編程語言的生態(tài)系統(tǒng)所提出的那樣,同樣的觀點(diǎn)再次被提了出來。
有人認(rèn)為,如果開發(fā)人員創(chuàng)建的庫只有短短幾行代碼,對于最無關(guān)緊要的操作而言,模塊化做得過頭了,毫無必要。還有人認(rèn)為,需要對這些項(xiàng)目進(jìn)行模塊化,因?yàn)橐赃@種方式,“任務(wù) A”可以在一個(gè)模塊中進(jìn)行管理,而不是讓成千上萬的開發(fā)人員在自己的項(xiàng)目中以不同的方式來處理它。
事實(shí)上,有關(guān)模塊化的討論已經(jīng)存在了多年,因此在短期時(shí)間內(nèi)可能也得不出什么結(jié)論。