Try   HackMD

【JavaScript】npm & yarn & pnpm

此篇以npm為主來介紹,整理速度 pnpm > yarn > npm。


yarn

Yarn是一個新的套件管理工具,安裝速度比npm快很多,是 Facebook 自家團隊與 Exponent、 Google、Tilde 所合作開發的套件管理工具。

yarn v.s. npm

  1. yarn 不支援直接某個安裝/刪除套件
  2. yarn 移除套件不管套件是否安裝於開發環境
  3. yarn 依賴處理較簡單
    • npm依賴package.json來切換版本,重新安裝會有套件依賴問題
    • yarn從package.json安裝套件會記錄套件的依賴,當套件變更版本時會也會將依賴的套件一律做更新
npm yarn 功能
npm install yarn install 安裝 package 所有依賴
npm install save [package] yarn add [paakage] 安裝套件
npm install save-dev [package] yarn add [paakage] dev 安裝套件至開發環境
npm –g [package] yarn global add [package] 安裝全域套件
npm update –save yarn upgrade 升級套件版本
npm uninstall save [package] yarn remove [package] 移除套件
npm uninstall save-dev [package] yarn remove [package] 移除套件

安裝

方法一(沒有npm用這個方法):

macOS 的用戶要透過 brew 來安裝 yarn,Homebrew 是一款自由及開放原始碼的軟體套件管理系統,用以簡化 Mac OS X系統上的軟體安裝過程。

apt-get 是 Linux 上的一個重要的工具,很多軟件的安裝、卸載、更新都會用到它。Homebrew 就是 Mac 上的 apt-get。 但是,目前 Mac 上默認是沒有這個工具的。

  1. 安裝 Homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  1. 更新 brew brew update
  2. 安裝 yarn brew install yarn

方法二(間單):

  1. 使用npm安裝 npm install yarn --g

確認安裝成功:

yarn --version

yarn 優點:

  1. 離線模式
    yarn會有一個快取目錄,會快取以前安裝過的軟體包,再次安裝時就不必從網路下載了,大大加速安裝速度。

  2. 依賴關係確定性
    npm在執行安裝套件都會依賴別的套件版本,導致有重新安裝的問題,yarn在安裝時依賴結構是一致的

  3. 網路效能優化
    yarn在安裝套件時會優化請求順序。

  4. 網路回彈
    yarn在某個安裝包請求失敗時不會導致安裝失敗,它會自動去嘗試重新安裝。而npm則會毫不猶豫的失敗,導致得再來一次,耗費時間

  5. 扁平模式
    對於多個包依賴同一個子包的情況,yarn會盡量提取為同一個包,防止出現多處副本,浪費空間。比如1.2中,yarn會為babel-generator和babel-helper-define-map 建立同一個lodash子依賴,這樣就節約一份的空間。


pnpm

pnpm是一個新的套件管理工具(官網),安裝速度快、有效利用空間。

pnpm v.s. npm

npm yarn 功能
npm install pnpm install 安裝 package 所有依賴
npm install save [package] pnpm install [paakage] -S 安裝套件
npm install save-dev [package] pnpm install [paakage] -D 安裝套件至開發環境
npm install –g [package] pnpm install –g [package] 安裝全域套件
npm update –save pnpm update 升級套件版本
npm uninstall save [package] pnpm uninstall [package] 移除套件
npm uninstall save-dev [package] pnpm uninstall [package] 移除套件

安裝

使用 npm 安裝 npm i -g pnpm

優點

  1. 有效利用空間

    • 不會重複安裝同一個包:用npm/yarn的時候,如果100個項目都依賴lodash,那麼lodash 就被安裝了100次。使用pnpm實際只有一個地方寫入硬碟,再使用都會直接使用hardlink(硬鏈接)。
    • 複用不同版本間的程式碼:如果lodash有100個文件,更新版本之後多了一個文件,硬碟不會重新寫入101個文件,而是保留原來的100個文件的hardlink,只寫入那一个新增的文件。
  2. 支持monorepo

  3. 安全性高

    • 自創一套依賴管理方式,規避非法訪問依賴問題:
      npm/yarn的 node_module 結構扁平,如果A依賴B,B依賴C,那麼A當中可以直接使用C。
      問題是A當中並沒有聲明C這個依賴,因此會出現這種非法訪問的情況。