快速、可靠、安全的依賴管理工具前端
隨着前端工程化體系的不斷完善和"大前端"概念的豐富和發展,僅前端開發用到 Nodejs
的地方也愈來愈多,各大前端團隊基於 Nodejs
的工具鏈建設也不斷推進着前端開發走向新的高度;說到 Nodejs
,天然離不開其官方的包管理工具 npm
;目前,npm
已經成爲世界上最大的包管理器,在其倉庫中託管着超過 100
萬個包,且還不包括企業內部的 npm
私服;node
在 npm5
之前,npm CLI
在使用功能及體驗上存在一些不盡如人意的地方,好比不太好用的版本鎖定功能、安裝速度慢、沒有離線緩存功能等;直到 npm5
之後,借鑑 Yarn
的優點使得 npm
的使用體驗獲得大幅提高,好比:算法
package-lock.json
,鎖定當前項目安裝包的版本,避免同一個項目在不一樣地方安裝會出現版本衝突的問題;--save
;不只如此,npm
安裝的速度也有大幅提高,而且加強了安全性能,一系列的優化和改進促使如今最新的 npm
更加好用和易用;npm
在 npm CLI
一家獨大的大環境下,爲何只有 Yarn
可以異軍突起呢?json
Yarn
是 facebook
開源的一個快速、可靠、安全的依賴管理工具,用其官網上的話說是:它及其快速,安裝速度之快史無前例!因爲 Yarn
可以緩存已下載過的包,使得下次安裝時無需重複下載,即使後續在無網絡的環境下也可以安裝成功,而且能夠並行化操做,所謂「天下武功,惟快不破!」,光這一點就可以俘獲大多數用戶的心;加上 Yarn
會在每一個安裝包執行前校驗其完整性,從而避免了潛在的一些安全風險;經過 lockfile
和肯定性算法來安裝依賴,以確保安裝過的包在不一樣系統之間可以表現一致;能夠看出來,Yarn
團隊深深識意到了 npm CLI
的痛點,而且試圖從新設計一個 npm
客戶端:windows
lockfile
,避免版本衝突與系統間的不肯定性;非也!前端工程化
首先,沒必要擔憂 npm
與 yarn
的兼容問題,由於 Yarn
自己不具備侵入性,幾乎能夠無縫從 npm
切換到 Yarn
,固然,你依然能夠同時使用 npm
,畢竟 Yarn
沒有實現 npm
全部的命令,可是平常用到的絕大多數均可以經過 Yarn
更加高效的完成;緩存
其次,兩者都是遵循同一個 package.json
文件,即使 Yarn
會重組 node_modules
裏的文件,但也是和 npm
的方式是兼容的,在項目裏初次運行 yarn( install)
後,就會生成 yarn.lock
文件,只需提交該文件,團隊之間便可無差異的使用相同的軟件包,若是以前使用了 npm-shrinkwrap.json
或 package-lock.json
,那麼鎖定的版本可能依然存在衝突的可能,這時須要團隊之間同時切換到 Yarn
;安全
再者,npm
是 Nodejs
官方的包管理工具,而且不斷的改進和發展,不少實際標準仍是得以 npm
爲準,因此 Yarn
應該能夠說是 npm
的階段性補充,雖然到目前爲止,Yarn
在某些方面依然具備優點;網絡
通常狀況下可使用 npm i -g yarn
的方式安裝,可是 npm
安裝是非肯定性的,程序包沒有簽名,而且 npm
除了作了基本的 SHA1
哈希以外不執行任何完整性檢查,這給安裝系統程序帶來了安全風險;因此推薦使用安裝系統軟件的方式安裝 Yarn
,好比你是 mac
用戶,可使用 brew install yarn --without-node
來安裝 Yarn
,或者你是 windows
用戶,能夠直接下載 msi
文件來安裝 Yarn
,而後配置好環境變量便可開始使用了;
Yarn
都提供了豐富而簡潔的命令:
dependencies
中;yarn global
注意,這兩個詞總體做爲一個命令前綴;package.json
文件;package.json
文件裏定義的全部依賴包;package.json
中自定義 scripts
時,使用 npm
時,咱們須要 npm run script
來執行,一樣,Yarn
也支持該方式,同時 run
能夠省略,直接 yarn script
,很是方便;process.env.CHILD_CONCURRENCY= number
,控制並行執行的子進程數以構建節點模塊,能夠避免在 Windows
中使用 node-gyp
時出現連接器錯誤;yarn link
使用系統連接的方式連接本地包,而非拷貝文件的方式,很是快;workspace
)的方式來管理項目工做區是設置你的軟件包體系結構的一種新方式,它容許你可使用這種方式安裝多個軟件包。
對於大型代碼庫,咱們通常會將某些獨立的功能抽離出去單獨開發,並做爲獨立的包來發布和管理,一方面便於平常維護,另外一方面也方便模塊間的依賴與引用;Yarn
從 1.0
開始支持引 入工做區的方式來管理軟件包;
使用 workspace
的好處:
node_modules
裏,而且只生成一份 yarn.lock
,下降版本衝突的風險;如何開始使用:
package.json
,必須包含 private: true
(確保工做區不被髮布出去)和 workspace
兩個字段;workspace-a
和 workspace-b
兩個項目目錄,並使用 yarn init
初始化生成相應項目的 package.json
;Yarn
只提供工做區相關的基礎功能,而且提供了其餘工具使用的底層實現機制,關於工做區的高級功能使用能夠關注 Lerna
;
yarn workspace
的目錄結構圖:
當你安裝某個包時,Yarn
會將其緩存下來,下次再安裝這個包時無需重複下載;
--offline
從本地緩存中安裝某個包,沒有可用的則會報錯;--prefer-offline
優先從本地緩存安裝某個包,沒有可用的則從從新下載最新的;yarn cache [ls|list|clean|dir] [flags]
經過 yarn cache
咱們能夠進行設置緩存目錄、清除緩存、查看已緩存的包等操做;yarn config set yarn-offline-mirror ./npm-packages-offline-cache
經過該命令咱們能夠設置離線鏡像的目錄, 爲了保持該目錄的及時更新,咱們還須要設置一下,yarn config set yarn-offline-mirror-pruning true
,之後安裝某個包時便會將該包的 .tar.gz
壓縮包下載到該目錄,供離線安裝時使用;warning Plug'n'Play on Windows doesn't support the cache and project to be kept on separate drives
Plug'n'Play
簡稱 pnp
,是爲了提供一種更加高效的模塊查找機制,消除了項目中的 node_modules
目錄,取而代之的是 .pnp
目錄和 .pnp.js
,在該模式下,yarn
會將全部的包緩存到一個目錄裏面,經過 .pnp.js
告訴 node
在沒有 node_modules
的狀況下如何去查找模塊;咱們試想一下,我們的項目裏之後不會出現 node_modules
了,而且全部的依賴包都在一個公共的目錄裏面,即使同一個包的多個版本也能安然無事的並存,那麼當咱們安裝項目時,速度將大大提高;同時經過 .pnp.js
告訴 node
依賴包的具體位置,那麼引用查詢模塊的效率也將大大提高,而且少了不少可能的文件查找過程;
目前仍是實驗性特性,而且還不支持 windows
,從1.12之後的版本開始,咱們可使用 --pnp
或 --enable-pnp
來體驗該特性;
因爲該機制改變了原來 node
查找依賴模塊的方式,因此一些開源項目在未適配該機制時可能會出先找不到模塊的錯誤,能夠在 npm
上查詢 pnp
找相應的適配包來解決;
以上,咱們對 Yarn
的使用體驗及速度優點有了初步瞭解,在實際工做中,咱們能夠根據實際狀況靈活的選擇使用 npm
命令仍是 yarn
命令;在我看來,至少目前來講,Yarn
在實際使用的某些方面是依然具備優點的,因此,還等什麼呢?