npm,yarn,pnpm,cnpm,nvm,npx包管理器常用命令
前端比较主流的包管理器主要有三个npm,yarn,pnpm
多层级依赖,通常发生在依赖之间存在复杂的版本要求时
-
包
A
依赖于包B@1.0.0
-
包
B
依赖于包C@2.0.0
-
另一个包
D
也依赖于C@3.0.0
一、NPM (Node Package Manager)
https://www.npmjs.cn/
npm
是 Node.js 默认的包管理工具,最早由 Node 社区开发并捆绑到 Node.js 中,因此使用最为广泛
-
npm v7+, 改进了扁平化管理,引入peer dependencies 处理
-
自动安装 peer dependencies
-
更严格的版本锁定
-
改进了依赖解析算法
-
workspaces 支持
-
node_modules
├── package-A
├── package-B
├── lodash // 主版本
└── .package-lock.json // 更严格的版本锁定
(1)npm install的时候巨慢。特别是新的项目拉下来要等半天,删除node_modules,重新install的时候依旧如此。
(2)同一个项目,安装的时候无法保持一致性。由于package.json文件中版本号的特点,下面三个版本号在安装的时候代表不同的含义。 “5.0.3”表示安装指定的5.0.3版本,“~5.0.3”表示安装5.0.X中最新的版本,“^5.0.3”表示安装5.X.X中最新的版本。这就麻烦了,常常会出现同一个项目,有的同事是OK的,有的同事会由于安装的版本不一致出现bug。
"5.0.3",
"~5.0.3",
"^5.0.3"
二、cnpm
(1) cnpm跟npm用法完全一致,只是在执行命令时将npm改为cnpm。
(2) npm安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果npm的服务器在中国就好了,于是淘宝团队干了这事。来自官网:“这是一个完整 npmjs.org镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。
npm install -g cnpm --registry=https://registry.npm.taobao.org
三、Yarn
https://www.yarnpkg.cn/
CLI Reference | Yarn
npm install -g yarn
Yarn
是一个 JavaScript 包管理工具,最早由 Facebook 推出,主要用于管理项目中的依赖包。和 npm
类似,yarn
解决了在 JavaScript 项目中下载、安装和管理依赖的需求,并在一定程度上改进了 npm
的一些缺点,比如性能、稳定性和安全性
-
优点:
-
采用扁平化优先 + 符号链接(符号链接是一个特殊的文件,它包含对另一个文件或目录的引用路径)的组合策略
-
相同版本的包会被提升并复用
-
不同版本通过符号链接保持正确的引用关系
-
-
基本结构
node_modules/
├── package-A/ # 实际文件
├── package-B/ # 实际文件
├── lodash/ # 提升到顶层的共享包
└── .bin/ # 可执行文件的符号链接
-
依赖共享案例
// 假设有以下依赖关系:
项目
├── package-A (依赖 lodash@4.0.0)
└── package-B (依赖 lodash@4.0.0)// Yarn 会创建这样的结构:
node_modules/
├── package-A/
│ └── node_modules/
│ └── lodash -> ../../../lodash # 符号链接
├── package-B/
│ └── node_modules/
│ └── lodash -> ../../../lodash # 符号链接
└── lodash/ # 实际文件
-
版本冲突处理
// 当存在版本冲突时:
项目
├── package-A (依赖 lodash@4.0.0)
└── package-B (依赖 lodash@3.0.0)// Yarn 会这样处理:
node_modules/
├── package-A/
│ └── node_modules/
│ └── lodash -> ../../../lodash # 指向4.0.0
├── package-B/
│ └── node_modules/
│ └── lodash/ # 本地安装3.0.0
└── lodash/ # 4.0.0版本在顶层
四、PNPM(Performant NPM)
https://www.pnpm.cn/
pnpm
是一个更现代化的包管理工具,旨在解决 npm
和 yarn
的一些效率和资源管理问题
采用内容寻址存储系统,
pnpm
使用内容寻址(content-addressable storage)来存储依赖包。每个依赖包都会被哈希处理,并根据其内容生成唯一的存储地址。这样,即使多个项目依赖于相同版本的包,pnpm
也只需要存储一份,不会重复存储同样内容的文件
使用硬链接和符号链接共享依赖
pnpm 通过在 node_modules 中创建硬链接或符号链接(symlink),指向内容寻址存储中实际的依赖包。这样每个项目可以“共享”依赖,而不必为每个项目单独存储依赖包内容。
硬链接(Hard Link) :将文件内容链接到项目文件夹下,不占用额外磁盘空间。
符号链接(Symlink) :为特定版本的包创建路径映射,使项目代码能够准确找到每个依赖包版本的地址。
npm install -g pnpm // 通过 npm 安装 pnpm
npx pnpm add -g pnpm // 通过 npx 安装 pnpmpnpm add -g pnpm
-
优点:
-
显著节省磁盘空间
-
安装速度快
-
更严格的依赖管理
-
pnpm-lock.yaml 确保依赖版本一致
-
-
缺点:
不兼容一些使用传统 node_modules 结构的工具和插件:
在 pnpm 中,每个依赖都有自己的隔离路径,某些工具、插件或构建系统可能会假设 node_modules 目录是扁平的,这可能导致兼容性问题。
与本地开发和测试环境的潜在不兼容:
有些项目依赖于本地 node_modules 结构,或者需要直接访问 node_modules 中的文件。在 pnpm 使用内容寻址和符号链接时,这可能会导致某些工具无法正常运行
-
内容寻址存储
.pnpm-store/
└── v3/└── files/├── 00/ # 前两位哈希值作为目录名│ └── deadbeef... # 包内容的哈希值└── ff/└── cafebabe... # 另一个包的哈希值
-
依赖结构
node_modules/
├── .pnpm/
│ ├── react@17.0.2/
│ │ └── node_modules/
│ │ ├── react/ # 实际文件(硬链接到 store)
│ │ └── loose-envify/ # react 的依赖
│ └── lodash@4.17.21/
│ └── node_modules/
│ └── lodash/ # 实际文件(硬链接到 store)
├── react -> .pnpm/react@17.0.2/node_modules/react # 符号链接
└── lodash -> .pnpm/lodash@4.17.21/node_modules/lodash # 符号链接
npm 与 yarn 及 pnpm常用命令
npm常用命令
// 查看 npm 全局安装过的包
npm list -g --depth 0
// 全局安装
npm install <package> -g
// 安装项目所有依赖
npm install
// 安装指定版本
npm install <package>@1.2.3
// 安装最新版本
npm i <package>@latest
// 删除全局的包
npm uninstall -g <package>
// 删除 node_modules 目录下面的包
npm uninstall <package>
// 更新指定包
npm update <package>
// 更新指定全局包
npm update -g <package>
// 更新本地安装的包
// 在 package.json 文件所在的目录中执行 npm update 命令
// 执行 npm outdated 命令。不应该有任何输出。
yarn 常用命令
// 查看 yarn 全局安装过的包
yarn global list --depth=0
// 全局安装
yarn global add <package>
// 安装所有依赖
yarn
// 安装指定版本
yarn add <package>@<version>
// 安装最新版本
yarn add <package>
// 删除包,会更新package.json和yarn.lock
yarn remove <package>
// 更新包
yarn upgrade
// 更新指定的包
yarn upgrade <package>
// 获取可更新的包列表选择更新
yarn upgrade-interactive --latest
// 更新全局依赖
yarn global upgrade --latest
// 更新全局依赖,有交互
yarn global upgrade-interactive --latest
// 列出已缓存的包
yarn cache list
// 查找缓存包的路径
yarn cache dir
// 清除缓存的包
yarn cache clean
五、npm
、yarn
和 pnpm
的比较
特性 | npm | yarn | pnpm |
依赖管理方式 | 扁平化管理,嵌套依赖树,可能重复安装 | 扁平化管理和符号链接,同版本只安装一次 | 基于硬链接和符号链接的内容寻址存储 |
安装速度 | 最慢 | 中等(并行安装) | 最快(得益于硬链接复用) |
磁盘空间占用 | 最大 | 中等 | 最小 |
依赖管理严格性 | 低(可能存在幽灵依赖) | 中等 | 高(严格的依赖树结构) |
锁文件格式 | package-lock.json | yarn.lock | pnpm-lock.yaml |
缓存机制 | 基础缓存 | 高效缓存 | 基于内容寻址的全局存储 |
并行安装能力 | 不支持 (npm5-) / 支持 (npm5+) | 支持 | 支持 |
依赖提升策略 | 部分提升 | 全量提升 | 不提升(严格按照依赖声明) |
workspace 支持 | 有限支持 | 完整支持 | 完整支持 |
基于这些特点:
-
如果项目体积较小,团队成员 Node.js 经验不同,推荐使用 npm
-
如果需要更好的性能和可靠性,推荐使用 yarn
-
如果需要最严格的依赖管理、最小的磁盘空间占用,推荐使用 pnpm
六、npm
、yarn
和 pnpm
的常用命令对比
操作 | npm | yarn | pnpm |
初始化项目 | npm init | yarn init | pnpm init |
(-y为自动确认默认选项) | npm init -y | yarn init -y | pnpm init -y |
安装依赖 | npm install | yarn | pnpm install |
安装单个依赖 | npm install <pkg> | yarn add <pkg> | pnpm add <pkg> |
安装特定版本 | npm install <pkg>@<ver> | yarn add <pkg>@<ver> | pnpm add <pkg>@<ver> |
全局安装依赖 | npm install -g <pkg> | yarn global add <pkg> | pnpm add -g <pkg> |
安装开发依赖 | npm install <pkg> -D | yarn add <pkg> -D | pnpm add <pkg> -D |
更新依赖 | npm update <pkg> | yarn upgrade <pkg> | pnpm update <pkg> |
卸载依赖 | npm uninstall <pkg> | yarn remove <pkg> | pnpm remove <pkg> |
查看已安装依赖 | npm list | yarn list | pnpm list |
执行脚本 | npm run <script> | yarn <script> | pnpm run <script> |
装指定注册源 | npm install --registry <url> | yarn add <pkg> --registry <url> | pnpm add <pkg> --registry <url> |
清理缓存 | npm cache clean --force | yarn cache clean | pnpm store prune |
创建锁定文件 | package-lock.json | yarn.lock | pnpm-lock.yaml |
列出全局包 | npm list -g --depth=0 | yarn global list | pnpm list -g --depth=0 |
七、npx
npx 是 npm 5.2.0 版本引入的一个命令行工具。它允许你在不全局安装包的情况下运行命令行工具。npx 可以直接运行安装在项目中的依赖包,而不需要手动设置环境变量或全局安装
八、nvm
Node Version Manager):nvm 是一个用于管理多个 Node.js 版本的工具。它允许你在同一台机器上安装和切换不同的 Node.js 版本。nvm 可以帮助开发人员在不同的项目中使用不同的 Node.js 版本,以适应项目的需求。
nvm install 8.10.0 //安装ndoe 8.10.0为node版本
nvm list //查看nvm管理的node版本列表,正在使用的版本在列表前有星号标记
nvm use 8.10.0 //使用node指定版本
nvm uninstall 8.10.0 //卸载指定node版本nvm-setup.zip 一个安装包,下载之后点击安装,连续点击下一步,无需任何配置,推荐
nvm-noinstall.zip 绿色免安装,使用之前需要配置,不推荐
Source code(zip):压缩的源码