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