npm,yarn,pnpm,cnpm,nvm,npx包管理器常用命令

前端比较主流的包管理器主要有三个npm,yarn,pnpm

多层级依赖,通常发生在依赖之间存在复杂的版本要求时

一、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 (依赖 [email protected])
    └── package-B (依赖 [email protected])

    // Yarn 会创建这样的结构:
    node_modules/
    ├── package-A/
    │ └── node_modules/
    │ └── lodash -> ../../../lodash # 符号链接
    ├── package-B/
    │ └── node_modules/
    │ └── lodash -> ../../../lodash # 符号链接
    └── lodash/ # 实际文件

  • 版本冲突处理

    // 当存在版本冲突时:
    项目
    ├── package-A (依赖 [email protected])
    └── package-B (依赖 [email protected])

    // 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 是一个更现代化的包管理工具,旨在解决 npmyarn 的一些效率和资源管理问题

采用内容寻址存储系统,

pnpm 使用内容寻址(content-addressable storage)来存储依赖包。每个依赖包都会被哈希处理 ,并根据其内容生成唯一的存储地址。这样,即使多个项目依赖于相同版本的包,pnpm 也只需要存储一份,不会重复存储同样内容的文件

使用硬链接和符号链接共享依赖

pnpm 通过在 node_modules 中创建硬链接或符号链接(symlink),指向内容寻址存储中实际的依赖包。这样每个项目可以"共享"依赖,而不必为每个项目单独存储依赖包内容。

硬链接(Hard Link) :将文件内容链接到项目文件夹下,不占用额外磁盘空间。

符号链接(Symlink) :为特定版本的包创建路径映射,使项目代码能够准确找到每个依赖包版本的地址。

复制代码
npm install -g pnpm     // 通过 npm 安装 pnpm
npx pnpm add -g pnpm    // 通过 npx 安装 pnpm


  pnpm 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/
    │ ├── [email protected]/
    │ │ └── node_modules/
    │ │ ├── react/ # 实际文件(硬链接到 store)
    │ │ └── loose-envify/ # react 的依赖
    │ └── [email protected]/
    │ └── node_modules/
    │ └── lodash/ # 实际文件(硬链接到 store)
    ├── react -> .pnpm/[email protected]/node_modules/react # 符号链接
    └── lodash -> .pnpm/[email protected]/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

五、npmyarnpnpm 的比较

|--------------|--------------------------|---------------------|-------------------|
| 特性 | npm | yarn | pnpm |
| 依赖管理方式 | 扁平化管理,嵌套依赖树,可能重复安装 | 扁平化管理和符号链接,同版本只安装一次 | 基于硬链接和符号链接的内容寻址存储 |
| 安装速度 | 最慢 | 中等(并行安装) | 最快(得益于硬链接复用) |
| 磁盘空间占用 | 最大 | 中等 | 最小 |
| 依赖管理严格性 | 低(可能存在幽灵依赖) | 中等 | 高(严格的依赖树结构) |
| 锁文件格式 | package-lock.json | yarn.lock | pnpm-lock.yaml |
| 缓存机制 | 基础缓存 | 高效缓存 | 基于内容寻址的全局存储 |
| 并行安装能力 | 不支持 (npm5-) / 支持 (npm5+) | 支持 | 支持 |
| 依赖提升策略 | 部分提升 | 全量提升 | 不提升(严格按照依赖声明) |
| workspace 支持 | 有限支持 | 完整支持 | 完整支持 |

基于这些特点:

  • 如果项目体积较小,团队成员 Node.js 经验不同,推荐使用 npm

  • 如果需要更好的性能和可靠性,推荐使用 yarn

  • 如果需要最严格的依赖管理、最小的磁盘空间占用,推荐使用 pnpm

六、npmyarnpnpm 的常用命令对比

|-----------------|--------------------------------|-------------------------------------|-------------------------------------|
| 操作 | 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):压缩的源码
相关推荐
源码方舟12 分钟前
【HTML5】轮播图的实现方式一
前端·javascript·css·html·html5
源码方舟12 分钟前
【HTML5】老式放映机原理-实现图片无缝滚动
前端·javascript·css·html·css3·html5
梦想与想象-广州大智汇1 小时前
普通 html 项目引入 tailwindcss
前端·html·tailwindcss
lh_12544 小时前
前端 uni-app 初步使用指南
前端·arcgis·uni-app
患得患失9494 小时前
【前端】【面试】在 Nuxt.js SSR/SSG 应用开发的 SEO 优化方面,你采取了哪些具体措施来提高页面在搜索引擎中的排名?
前端·javascript·搜索引擎
layman05284 小时前
ES6/ES11知识点 续二
前端·ecmascript·es6
爱编程的鱼5 小时前
C# 运算符重载深度解析:从基础到高阶实践
前端·算法·c#
大道归简6 小时前
自动化实现web端Google SignUp——selenium
前端·selenium·自动化
普通young man7 小时前
QT | 常用控件
开发语言·前端·qt