npm發布了4.0.0版本,這是2015年發布npm 3之后的第一個語義化的主版本。
盡管依然是一個實驗性的發布版本,v4還是帶來了一些破壞性的變更,包括重寫的npm search、廢棄prepublish以及npm scripts行為的變化。
Kat Marchán是npm的軟件工程師,他在Github上分享了這次升級的消息,他提到npm之前的主版本更新曾經帶來過非常嚴重的影響,但4.0對開發人員日常使用所帶來的影響會小得多,它的變化主要局限在命令行接口上,對更大的生態系統的影響很小。
Marchán提到最新的這次發布也宣告一個時代的結束,npm 2.x和3.x將會進入維護狀態,“除了重要的缺陷修正和安全補丁”,它們將不會再進行更新。
關于npm search,Marchán這樣說到:
讓我們面對這一問題——npm search已經不能正常運行了。這些年隨著時間的推移,它變得越來越慢,除此之外,它已經到了一個臨界點,我們已經無法將整個注冊表元數據放到內存中了,試圖使用這個命令的人會看到node將提示一個非常恐怖的內存溢出崩潰。
為了提升開發人員的體驗,Marchán說要徹底修改npm search,不過這尚需一段時間,但是團隊已經重寫了之前的實現,以便“在運行過程中從搜索端點和本地緩存中得到結果。”
4.0還廢棄了npm中的prepublish生命周期腳本,將其替換為prepare腳本。Marchán告訴InfoQ:“新腳本的運行方式完全相同,會有一個新的 prepublishOnly事件,只有進行npm publish的時候,該事件才會執行。”
Marchán說,只有當個人用戶發布他們自己的包的新版本時,才會受到這個破壞性變化的影響,已經發布到npm注冊表上的包已經超過了350,000個,這個更大的生態系統并不會受此影響。
對于用戶來說,npm 4.0版本的發布也使得partial shrinkwraps成為了歷史,npm shrinkwrap允許用戶鎖定整個依賴樹,讓每個包使用特定的版本,這樣的話,兩個不同的人或者在兩個不同的時間點,能夠執行兩個不同的構建。
Marchán這樣說到:
如果在你的項目中有npm-shrinkwrap.json的話,那么npm將不會安裝任何沒有明確列出的包,除非它是devDependency。這為一些優化打開了方便之門,通過移除一些令人望而生畏的極端場景,npm shrinkwrap 的使用也會更加便利。如果你通過npm shrinkwrap --dev為shrinkwrap添加了devDependencies的話,我們會忽略package.json中的devDependency安裝。
npm最新的主版本不僅包含了破壞性的變更,在發出的請求中,npm還會發送Npm-Scope和Npm-In-CI頭信息,允許注冊表實現感知用戶/作用域的特性和服務。
4.0將會成為npm官方的最新發布版本,4.0.1版本很快也會推出,這個版本會包含一些小的功能提升。
npm團隊推薦開發人員將npm升級到最新版本,但是他們也會繼續維護一個版本,用于Node的默認分發。
查看英文原文:npm 4.0 Deprecates Prepublish Lifecycle Script