不可錯過的包管理工具 - yarn

快速、可靠、安全的依賴管理工具前端

Nodejs 嫡系包管理工具

隨着前端工程化體系的不斷完善和"大前端"概念的豐富和發展,僅前端開發用到 Nodejs 的地方也愈來愈多,各大前端團隊基於 Nodejs 的工具鏈建設也不斷推進着前端開發走向新的高度;說到 Nodejs,天然離不開其官方的包管理工具 npm;目前,npm 已經成爲世界上最大的包管理器,在其倉庫中託管着超過 100 萬個包,且還不包括企業內部的 npm 私服;node

npm5 之前,npm CLI 在使用功能及體驗上存在一些不盡如人意的地方,好比不太好用的版本鎖定功能、安裝速度慢、沒有離線緩存功能等;直到 npm5 之後,借鑑 Yarn 的優點使得 npm 的使用體驗獲得大幅提高,好比:算法

  1. 引入 package-lock.json,鎖定當前項目安裝包的版本,避免同一個項目在不一樣地方安裝會出現版本衝突的問題;
  2. 安裝包時默認指定 --save
  3. 改進緩存系統和離線安裝能力,即使是在無網絡的環境下,也能夠經過本地緩存安裝已安裝過的包;

不只如此,npm 安裝的速度也有大幅提高,而且加強了安全性能,一系列的優化和改進促使如今最新的 npm 更加好用和易用;npm

異軍突起的 Yarn

npm CLI 一家獨大的大環境下,爲何只有 Yarn 可以異軍突起呢?json

Yarnfacebook 開源的一個快速、可靠、安全的依賴管理工具,用其官網上的話說是:它及其快速,安裝速度之快史無前例!因爲 Yarn 可以緩存已下載過的包,使得下次安裝時無需重複下載,即使後續在無網絡的環境下也可以安裝成功,而且能夠並行化操做,所謂「天下武功,惟快不破!」,光這一點就可以俘獲大多數用戶的心;加上 Yarn 會在每一個安裝包執行前校驗其完整性,從而避免了潛在的一些安全風險;經過 lockfile 和肯定性算法來安裝依賴,以確保安裝過的包在不一樣系統之間可以表現一致;能夠看出來,Yarn 團隊深深識意到了 npm CLI 的痛點,而且試圖從新設計一個 npm 客戶端:windows

  1. 從根本上改寫包的安裝方式,展示穩定性與速度優點;
  2. 簡化經常使用命令,優化使用體驗;
  3. 自動化管理 lockfile,避免版本衝突與系統間的不肯定性;

既生瑜何生亮?

非也!前端工程化

首先,沒必要擔憂 npmyarn 的兼容問題,由於 Yarn 自己不具備侵入性,幾乎能夠無縫從 npm 切換到 Yarn,固然,你依然能夠同時使用 npm,畢竟 Yarn 沒有實現 npm 全部的命令,可是平常用到的絕大多數均可以經過 Yarn 更加高效的完成;緩存

其次,兩者都是遵循同一個 package.json 文件,即使 Yarn 會重組 node_modules 裏的文件,但也是和 npm 的方式是兼容的,在項目裏初次運行 yarn( install) 後,就會生成 yarn.lock 文件,只需提交該文件,團隊之間便可無差異的使用相同的軟件包,若是以前使用了 npm-shrinkwrap.jsonpackage-lock.json,那麼鎖定的版本可能依然存在衝突的可能,這時須要團隊之間同時切換到 Yarn安全

再者,npmNodejs 官方的包管理工具,而且不斷的改進和發展,不少實際標準仍是得以 npm 爲準,因此 Yarn 應該能夠說是 npm 的階段性補充,雖然到目前爲止,Yarn 在某些方面依然具備優點;網絡

安裝及使用

通常狀況下可使用 npm i -g yarn 的方式安裝,可是 npm 安裝是非肯定性的,程序包沒有簽名,而且 npm 除了作了基本的 SHA1 哈希以外不執行任何完整性檢查,這給安裝系統程序帶來了安全風險;因此推薦使用安裝系統軟件的方式安裝 Yarn,好比你是 mac 用戶,可使用 brew install yarn --without-node 來安裝 Yarn,或者你是 windows 用戶,能夠直接下載 msi 文件來安裝 Yarn,而後配置好環境變量便可開始使用了;

Yarn CLI 介紹

  1. 對於常常用到的項目初始化,對包的安裝、卸載、升級、發佈等操做,Yarn 都提供了豐富而簡潔的命令:
    • yarn add <package...> [option]:爲當前正在開發的包新增一個依賴包,默認添加到 dependencies 中;
    • yarn global <add/bin/list/remove/upgrade> [--prefix]:yarn global 注意,這兩個詞總體做爲一個命令前綴;
    • yarn init:交互式建立或更新 package.json 文件;
    • yarn [install]:安裝 package.json 文件裏定義的全部依賴包;
    • yarn publish:發佈一個包到包管理器;
    • yarn remove:從當前包裏移除一個未使用的包;
  2. 當咱們在 package.json 中自定義 scripts 時,使用 npm 時,咱們須要 npm run script 來執行,一樣,Yarn 也支持該方式,同時 run 能夠省略,直接 yarn script,很是方便;
  3. 經過設置環境變量 process.env.CHILD_CONCURRENCY= number,控制並行執行的子進程數以構建節點模塊,能夠避免在 Windows 中使用 node-gyp 時出現連接器錯誤;
  4. yarn link 使用系統連接的方式連接本地包,而非拷貝文件的方式,很是快;
  5. 支持以工做區(workspace)的方式來管理項目

劃重點的功能:workspace

工做區是設置你的軟件包體系結構的一種新方式,它容許你可使用這種方式安裝多個軟件包。

對於大型代碼庫,咱們通常會將某些獨立的功能抽離出去單獨開發,並做爲獨立的包來發布和管理,一方面便於平常維護,另外一方面也方便模塊間的依賴與引用;Yarn1.0 開始支持引 入工做區的方式來管理軟件包;

  1. 使用 workspace 的好處:

    • 在工做區範圍內連接全部的包,包括工做區內的代碼庫及其依賴包,因此,未發佈的包也能跟發佈後同樣直接調用;
    • 工做區內全部的代碼庫及其依賴統一安裝到根目錄的 node_modules 裏,而且只生成一份 yarn.lock,下降版本衝突的風險;
    • 代碼結構更加清晰、易於維護,減小不一樣模塊之間沒必要要的共同依賴;
  2. 如何開始使用:

    • 首先咱們來新建工做區目錄,並在該目錄中添加 package.json,必須包含 private: true (確保工做區不被髮布出去)和 workspace 兩個字段;
    • 而後在工做區中分別建立 workspace-aworkspace-b 兩個項目目錄,並使用 yarn init 初始化生成相應項目的 package.json
    • 最後,咱們即可以 開始在相應項目下開始工做了,跟通常的時候同樣執行安裝、升級、刪除、發佈相關操做;
  3. 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 壓縮包下載到該目錄,供離線安裝時使用;

pnp

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 在實際使用的某些方面是依然具備優點的,因此,還等什麼呢?

相關文章
相關標籤/搜索