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