前端包管理和 corepack


長期以來,node 中自帶的包管理工具只有 npm, 作為官方指定工具,使用者眾多,從體驗上來講,卻是一般。

npm 的不足

  • 串行安裝,要等隊列中當前 package 安裝成功后才會繼續下一個package 的安裝
  • install 慢,無緩存,刪除node_modules 后重新 install 無法利用緩存
  • node_modules 依賴冗余過多

npm 下載慢的問題一個重要原因是因為包鏡像在國外,所以可以通過修改使用國內鏡像源來解決這個問題

// 查看當前鏡像源
npm config get registry

// 臨時修改
npm install 軟件名 --registry https://registry.npm.taobao.org

// 全局修改
npm config set registry https://registry.npm.taobao.org 

如果需要頻繁切換的話可以使用開源工具 nrm,更方便一些

npm install -g nrm

nrm ls // 列出可用的鏡像源
    npm -----  https://registry.npmjs.org/
    cnpm ----  http://r.cnpmjs.org/
    taobao --  https://registry.npm.taobao.org/
    nj ------  https://registry.nodejitsu.com/
    rednpm -- http://registry.mirror.cqupt.edu.cn
    skimdb -- https://skimdb.npmjs.com/registr
    
// 切換鏡像源
nrm use cnpm 

// 測試速度
nrm test taobao 

// 可以增加定制的源,特別適用於添加企業內部的私有源
nrm add <registry> <url>

// 刪除源
nrm del <registry>

搭建企業內網私有源的一種方案:cnpmjs架設

試試其它的吧

cnpm

cnpm 這個是國內淘寶鏡像,是為解決 npm 速度太慢的問題而產生的,控制台log 也清晰許多,但是它最大的問題是會忽視 package-lock.json 文件,也就是說 你無法鎖定小版本,可能會導致依賴版本不一致引起的 bug,防止這個隱患則需要在 package.json 中就鎖定版本,如下:

  • 符號^:表示主版本固定的情況下,可更新最新版。例如:vuex: "^3.1.3",3.1.3及其以上的3.x.x都是滿足的。
  • 符號~:表示次版本固定的情況下,可更新最新版。如:vuex: "~3.1.3",3.1.3及其以上的3.1.x都是滿足的。
  • 無符號:無符號表示固定版本號,例如:vuex: "3.1.3",此時一定是安裝3.1.3版本。

yarn(npm的升級替代品)

yarn 是 Facebook, Google, Exponent 和Tilde 開發的一款新的JavaScript 包管理工具
,是為了解決npm的缺點而產生的,Yarn 緩存了每個下載過的包,所以再次使用時無需重復下載,同時利用並行下載以最大化資源利用率,因此安裝速度更快。

特點:

  • 速度超快 Yarn 緩存了每個下載過的包,所以再次使用時無需重復下載。 同時利用並行下載以最大化資源利用率,因此安裝速度更快。
  • 超級安全 在執行代碼之前,Yarn 會通過算法校驗每個安裝包的完整性。
  • 超級可靠 使用詳細、簡潔的鎖文件格式和明確的安裝算法,Yarn 能夠保證在不同系統上無差異的工作。
  • 離線模式 如果你以前安裝過某個包,再次安裝時可以在沒有任何互聯網連接的情況下進行。
  • 確定性 不管安裝順序如何,相同的依賴關系將在每台機器上以相同的方式安裝。
  • 網絡性能 Yarn 有效地對請求進行排隊處理,避免發起的請求如瀑布般傾瀉,以便最大限度地利用網絡資源。
  • 相同的軟件包 從 npm 安裝軟件包並保持相同的包管理流程。
  • 網絡彈性 重試機制確保單個請求失敗並不會導致整個安裝失敗。
  • 扁平模式 將依賴包的不同版本歸結為單個版本,以避免創建多個副本。

常用指令:

// 全局安裝
npm install -g yarn

// 初始化一個項目
yarn init

// 添加依賴包
yarn add [package]

// 升級依賴包
yarn upgrade [package]

// 移除依賴包
yarn remove [package]

// 安裝全部依賴
yarn install (或者 yarn)

使用文檔:https://yarn.bootcss.com

pnpm (新一代包管理工具)

當使用 npm 或 Yarn 時,如果你有100個項目使用了某個依賴(dependency),就會有100份該依賴的副本保存在硬盤上。 而在使用 pnpm 時,依賴會被存儲在內容可尋址的存儲中,所以,如果你用到了某依賴項的不同版本,那么只會將有差異的文件添加到倉庫。 例如,如果某個包有100個文件,而它的新版本只改變了其中1個文件。那么 pnpm update 時只會向存儲中心額外添加1個新文件,而不會因為僅僅一個文件的改變復制整新版本包的內容。
摘自:https://pnpm.io/zh/motivation

pnpm 的項目初衷是節約磁盤空間並提升安裝速度

原理

所有文件都會存儲在硬盤上的某一位置。 當軟件包被被安裝時,包里的文件會硬鏈接到這一位置,而不會占用額外的磁盤空間。這允許你跨項目地共享同一版本的依賴,因此,您在磁盤上節省了大量空間,這與項目和依賴項的數量成正比,並且安裝速度要快得多。

pnpm 支持npm yarn corepack等多種安裝使用方式,比如

npm install -g pnpm
pnpm add -g pnpm // 用來升級版本

| npm 命令 | pnpm 等效 |
| npm install | pnpm install |
| npm i <pkg> | pnpm add <pkg> |
| npm run <cmd> | pnpm <cmd> |

使用文檔:https://pnpm.io/zh/pnpm-cli

Corepack「管理包管理器的管理器」

Corepack is a zero-runtime-dependency Node.js script that acts as a bridge between Node.js projects and the package managers they are intended to be used with during development. In practical terms, Corepack will let you use Yarn and pnpm without having to install them - just like what currently happens with npm, which is shipped by Node.js by default.
摘自:https://github.com/nodejs/corepack

Corepack是一個實驗性工具,在 Node.js v16.13 版本中引入,它可以指定項目使用的包管理器以及版本, 簡單來說,Corepack 會成為 Node.js 官方的內置 CLI,用來管理『包管理工具(npm、yarn、pnpm、cnpm)』,用戶無需手動安裝,即『包管理器的管理器』。

主要作用:

  • 不再需要專門全局安裝 yarn pnpm 等工具。
  • 可以強制團隊項目中使用他特定的包管理器版本,而無需他們在每次需要進行更新時手動同步它,如果不符合配置將在控制台進行錯誤提示。

corepack 用法

由於corepack 是一個實驗性工具,所以默認是沒有啟動的,需要顯式啟用,需要運行指令 corepack enable 進行啟動;在項目package.json 文件中新增屬性 "packageManager",比如

"packageManager": "yarn@1.22.15"

代表當前項目只允許使用yarn 包管理器並指定1.22.15版本

// 當前應用激活
corepack enable

// 定義包管理器
packageManager": "yarn@1.22.15"

// 聲明的包管理器,會自動下載對應的 yarn,然后執行
yarn install

// 用非聲明的包管理器,會自動攔截報錯
pnpm install
Usage Error: This project is configured to use yarn

因為在試驗階段,目前還有些問題待解決:

  • 目前僅支持 pnpm 和 yarn,cnpm 也是不支持的
  • 兼容性還有些問題,npm 還無法攔截也就是說 即便配置了 packageManager 使用 yarn,但是依然可以調用全局 npm 安裝

總結

The full npm package wouldn't be included out of the box anymore (this might be an incremental move, with first a major version shipping pmm + npm, and the next one discarding npm)
npm 將慢慢從 Node.js 內置包中移除,預計在下一個大版本啟動

雖然npm 是現在node的默認包管理器,但是由於它多年來的不思進取,及種種缺陷,corepack 的出現可以說是大快人心,其最大的意義是讓 npm 不再成為唯一的官方指定工具,這將使各種包管理器在一個更公平的地位上進行競爭,相信對開發者來說也是一件很好的事情。

參考鏈接:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM