一個單行代碼的 npm 庫,居然讓數百萬個 JavaScript 項目崩潰了...

javascript.png

技術編輯:徐九丨發自 北京
SegmentFault 思否報道丨公衆號:SegmentFaultjavascript


上週六,一個 JavaScript 庫的更新讓近乎整個 JavaScript 生態系統陷入了混亂,據分析機構粗略統計,數百萬個項目都受到了影響。前端

最讓人意想不到的是,調用形成混亂的這個庫,只須要一行代碼...java

一行代碼的威力

致使問題的庫名稱爲「is-promise。這個庫由兩行原始代碼組成,開發者能夠經過單行調用在項目中使用它。它的功能也很簡單,是讓開發者測試一個 JavaScript 對象是不是「Promise」,在項目中使用時,函數會返回一個是或不是的布爾結果(「 true」或「 false」)node

儘管只有兩行執行代碼,但「is-promise」庫已是當今最流行的 JavaScript npm 庫之一。根據 GitHub 的數據顯示,該庫目前已經被 340 萬個項目調用過,並被 766 個其餘 JavaScript 庫做爲依賴庫使用。npm

clipboard.png

此次新版本最主要的更新內容,是使其能夠做爲 ES 模塊(JavaScript 語言使用的標準化模塊系統)。然而,這個最新版本並無遵照正確的 ES 模塊使用標準。更新後,在構建鏈中使用「is-promise」的項目會不正確的 ES 模塊支持而報錯。segmentfault

這個錯誤形成的影響是很是迅速和巨大的,甚至不少大型的 JavaScript 項目都受到了影響。其中包括 Facebook 的 Create React App(建立React應用的標準模板)、Google 的 Angular.js 框架和 Firebasse-tools、Amazon 的 AWS Serverless CLI、Nuxt.js、AVA 等。promise

clipboard.png

對此,「is-promise」團隊迅速響應發佈了一次更新,但並無設法去修復這個問題,而是在 v2.2.2.2 版本中回滾了對 ES 的模塊支持。框架

2016 年的「前車可鑑」

JavaScript.png

這實際上是第二個 JavaScript 生態系統中,「千里之堤毀於蟻穴」的事故了。早在 2016 年,就有過前車可鑑。less

2016 年 3 月,一個僅有 17 行代碼的 JavaScript 庫做者忽然決定取消發佈這個工具庫,進而致使成千上萬的相關項目受到了影響,當時在各大論壇和社區引發了開發者們的普遍討論。模塊化

和 2016 年同樣,這次「is-promise」事件也引起了開發者圈內的熱議,並引起了對於生態系統中是否須要單行庫的討論。

有一派認爲,當開發者建立的庫只佔幾行代碼,但卻用於很瑣碎的操做時,模塊化有一些不太必要。

但還有一種觀點認爲,這類項目的模塊化是必要的,由於經過這種方式,某一項任務能夠在一個通用的模塊內管理,而不是讓成千上萬的開發人員在本身的項目中以不一樣的方式處理。

關於模塊化的討論已經有好幾年了,但至今也沒有答案。

其實,如今的軟件開發中不使用第三方開發者提供的現成組件是根本不可能的。當前前端比較流行的幾大框架,核心思想都離不開組件化,也只有這樣,才能大大的提升項目開發速度。但這也致使了不少的不可控風險,就像此次的事故。

對此,你怎麼看?你以爲應該如何規避相似的風險?

特約評論員:祁寧@joyqi

成也 npm 敗也 npm,我已經記不清這是 npm 第幾回發生相似的事情了。node 包的靈活性讓它蓬勃發展,你所須要的任何功能基本都能找到相應的包去實現,這就讓開發者愈來愈懶,哪怕這個功能如此簡單。開發者認爲全部的包都獲得了精心的維護,但當一個系統中引入的不肯定性越多,它崩潰的可能性就越高。因此奉勸每一個開發者在 npm install 的時候多想一想你是否真的須要它吧。


參考資料:

ZDNet:《Another one-line npm package breaks the JavaScript
ecosystem》rossaprimavera:《Upgrading the popular library in JavaScript
has crashed millions of projects》

clipboard.png

相關文章
相關標籤/搜索