Facebook在官方網(wǎng)站上正式發(fā)布了JavaScript包管理器Yarn 1.0。在從Yarn誕生之日起至今的11個月時間里,Yarn擁有了大批的追隨者。GitHub上有175,000個項目在使用Yarn,許多大大小小的公司和廣大開源社區(qū)也在使用Yarn,每個月通過Yarn下載的包數(shù)量接近30億個。Yarn為廣大用戶節(jié)省了大量的時間。Twitter和微軟說他們的包安裝速度因此提升了5倍,Expo、Kenzan和Sentry表示性能和穩(wěn)定性的提升加快了他們的代碼交付速度。Yarn現(xiàn)在已經(jīng)成為主流持續(xù)集成平臺的預(yù)安裝項,如CircleCI、Travis CI和AppVeyor。
Yarn在Facebook內(nèi)部也得到了廣泛的采用,包括Facebook主應(yīng)用、Instagram、Oculus和WhatsApp。Yarn具有極佳的伸縮性,可以支持成千上萬個直接或間接的包依賴。Yarn的設(shè)計初衷就是要保證、穩(wěn)定性、彈性和高性能。基于這些原則,Yarn 1.0帶來了更多的新特性,希望能夠幫助Yarn社區(qū)更快地發(fā)展,構(gòu)建更好的項目。
Yarn 1.0新特性
1. Yarn工作區(qū)(workspace)
單體倉庫(mono repository)模式(方便跨項目共享代碼,同時避免依賴同步問題)如今已經(jīng)被大型的科技公司所采用,也正逐漸蔓延到開源社區(qū)和一些小型公司。為了讓人們更方便地采用該模式,Yarn增加了一個新特性——工作區(qū)。工作區(qū)可以自動從多個package.json中收集所有的依賴,然后一次性把它們安裝完畢。項目根目錄下會生成yarn.lock來鎖住這些文件。如果多個工作區(qū)之間存在依賴,Yarn會為它們創(chuàng)建鏈接,這樣所有的項目就可以共享最新的代碼。
2. yarn.lock自動合并
多個開發(fā)者在開發(fā)同一個項目時,有可能會更新包依賴,導(dǎo)致yarn.lock文件出現(xiàn)沖突。如果只有一兩個沖突,那么完全可以通過手動來解決,但如果沖突數(shù)量眾多,解決沖突就會變成一件很麻煩的事情。Yarn為此提供了自動合并yarn.lock文件的功能。通過運行yarn install命令可以觸發(fā)合并動作,如果合并成功,新的yarn.lock就會被保存到磁盤上。
3. 可選擇依賴版本(selective version resolution)
有時候,你的項目間接依賴了其他項目的包,而這些依賴包有了新版本,你急需使用依賴包的新功能。這個時候你要么等待其他項目更新這些依賴包,要么給其他項目拉一個分支,然后更新依賴包。但這些都不是最理想的方式。Yarn提供了可選擇依賴版本的新特性,通過在package.json文件里定義resolutions字段來告訴Yarn該使用哪個版本的依賴包。下圖就是一個通過該特性限定使用某個async模塊版本的例子。
需要指出的是,該特性完全由社區(qū)設(shè)計和實現(xiàn),Victor No l提交了RFC和驗收測試,并由Kaylie Kwon負(fù)責(zé)實現(xiàn)。
問題修復(fù)和其他方面的改進(jìn)
更好的交互式升級體驗更快的文件完整性檢查提供了一個獨立的yarn.lock文件解析模塊Yarn版本的一致性保證社區(qū)的參與情況
項目在啟動后就引入了RFC流程,鼓勵社區(qū)參與項目的討論。有很多特性都來自社區(qū)的貢獻(xiàn),僅在2017年,就有超過40位貢獻(xiàn)者為Yarn貢獻(xiàn)了他們的力量。
未來的計劃
發(fā)布一個新包通常需要創(chuàng)建變更日志、執(zhí)行版本語義、同步相關(guān)項目的版本,還需要手動或通過腳本完成其他很多步驟。如果Yarn能夠為包發(fā)布者完成這些事情那豈不妙哉?另外,在添加或升級新包時,包的安全性也是一個很重要的考慮點。Yarn將會在包安全方面扮演一個重要的角色,Yarn將會與npm合作,將雙因子認(rèn)證帶到Y(jié)arn上。