当前位置: 首页 > news >正文

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

五、npmyarn 和 pnpm 的比较

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

基于这些特点:

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

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

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

六、npmyarn 和 pnpm 的常用命令对比

操作npmyarnpnpm
初始化项目npm inityarn initpnpm init
(-y为自动确认默认选项)npm init -yyarn init -ypnpm init -y
安装依赖npm installyarnpnpm 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> -Dyarn add <pkg> -Dpnpm add <pkg> -D
更新依赖npm update <pkg>yarn upgrade <pkg>pnpm update <pkg>
卸载依赖npm uninstall <pkg>yarn remove <pkg>pnpm remove <pkg>
查看已安装依赖npm listyarn listpnpm 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 --forceyarn cache cleanpnpm store prune
创建锁定文件package-lock.jsonyarn.lockpnpm-lock.yaml
列出全局包npm list -g --depth=0yarn global listpnpm 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):压缩的源码

相关文章:

  • C++11新特性_委托构造函数
  • Python全流程开发实战:基于IMAP协议安全下载个人Gmail邮箱内所有PDF附件
  • 表管理(约束)实验
  • 2025年五一数学建模A题【支路车流量推测】原创论文讲解(含完整python代码)
  • Python 基于 lstm,cnn 算法的网络舆情可视化系统
  • 【Hive入门】Hive性能调优:小文件问题与动态分区合并策略详解
  • C++负载均衡远程调用学习之消息队列与线程池
  • C++负载均衡远程调用学习之HOOK注册机制
  • QT中的QSS---界面美化
  • 蒙特卡罗方法(Monte Carlo Method)​​:基于随机采样的数值计算与模拟技术
  • 《Android 应用开发基础教程》——第十一章:Android 中的图片加载与缓存(Glide 使用详解)
  • 解决“‘mvn‘ 不是内部或外部命令,也不是可运行的程序”错误
  • 一条 SQL 查询语句是如何执行的(MySQL)
  • Redis怎么避免热点数据问题
  • 云原生后端架构的实践与挑战:探索现代后端开发的未来
  • JVM性能调优的基础知识 | JVM内部优化与运行时优化
  • SQL面试题——留存分析之使用bitmap 计算留存
  • d202552-sql
  • PostgreSQL常用函数
  • 个人健康中枢的多元化AI硬件革新与精准健康路径探析
  • 五一假期上海多个景点人流如织,警方多措并举确保秩序
  • 经济日报:仅退款应平衡各方权益
  • 国铁集团:5月1日全国铁路预计发送旅客2250万人次
  • 奥斯卡新规:评委必须看完影片再投票;网友:以前不是啊?
  • 韩国检方结束对尹锡悦私宅的扣押搜查
  • 体重管理门诊来了,瘦不下来的我们有救了?|健康有方FM