迁移项目锁版本
老项目用 npm 跑了一年,团队决定迁移到 pnpm 以节省磁盘空间。但 package-lock.json 和 pnpm-lock.yaml 格式不同,手动翻译一个 install 命令容易漏掉 --save-dev 或 --global 参数。对照本工具,把 npm install -D eslint 直接翻译成 pnpm add -D eslint,避免因参数不对导致依赖版本错乱,迁移后 CI 一次性通过。
刚切换包管理器时,最头疼的不是新命令怎么拼,而是旧项目的 npm install 到了 pnpm 环境该换成什么。这个对照表把 npm、yarn、pnpm 三个管理器的常用命令按操作类型对齐排列——安装依赖、更新包、运行脚本、管理缓存,同一种操作看同一行。所有数据预置在页面中,不发起任何网络请求,离线环境也能查。
老项目用 npm 跑了一年,团队决定迁移到 pnpm 以节省磁盘空间。但 package-lock.json 和 pnpm-lock.yaml 格式不同,手动翻译一个 install 命令容易漏掉 --save-dev 或 --global 参数。对照本工具,把 npm install -D eslint 直接翻译成 pnpm add -D eslint,避免因参数不对导致依赖版本错乱,迁移后 CI 一次性通过。
刚毕业的前端实习生拿到公司 MacBook,要装 Vue 项目环境。教程里写 npm create vue@latest,但他之前自学用的是 yarn create vite。他不知道两个命令的 --template 参数是否等价。打开对照表,看到 npm create 对应 yarn create,且 pnpm create 也走同一套模板,直接选自己熟的 yarn 执行,省去半小时查文档的挫败感。
公司三个项目分别用 npm、yarn、pnpm,CI 配置文件里要写三条不同的 install 命令。运维同事想合并成一条通用脚本,但记不住 yarn 的 --frozen-lockfile 对应 npm 的 --package-lock-only。翻出对照表,发现 npm ci 等价于 yarn install --frozen-lockfile 和 pnpm install --frozen-lockfile,直接写进模板,后续新项目无需再改 CI 配置。
用 npm 安装的 monorepo 项目在本地跑得好,上测试环境后报模块未找到。老手怀疑是 npm 的扁平 node_modules 导致幽灵依赖被意外引用。需要快速确认 pnpm 的严格依赖模式能否复现问题。对照表里找到 npm ls 和 pnpm ls --depth=0 的差异,用 pnpm 重新安装后果然报错消失,定位到是依赖提升导致的兼容性问题。
客户内网服务器不能访问 npm registry,需要把开发机上的 node_modules 打包过去。但 npm pack 和 yarn pack 输出格式不同,同事用 npm pack 打的包在 pnpm add 时报错。对照表显示 pnpm 支持 --pack-destination 参数,且 yarn pack 输出的 .tgz 可以直接被 pnpm store add 读取,省去重新压缩的麻烦。
| 输入 | 输出 | 说明 |
|---|---|---|
| npm install lodash | npm install lodash yarn add lodash pnpm add lodash | 常规:最常用的安装依赖场景,验证三者的基本对应关系 |
| npm uninstall lodash | npm uninstall lodash yarn remove lodash pnpm remove lodash | 常规:卸载依赖,验证 remove 与 uninstall 的命名差异 |
| npm init | npm init yarn init pnpm init | 常规:初始化项目,三者命令完全一致,验证基础覆盖 |
| npm run build | npm run build yarn run build pnpm run build | 边界:run 命令在 yarn 中可省略为 yarn build,但本工具输出完整形式,避免用户误以为 yarn 不支持 run |
| npm install --global eslint | npm install -g eslint yarn global add eslint pnpm add -g eslint | 边界:全局安装,三者语法差异大(-g / global add / -g),易混淆 |
| npm ci | npm ci yarn install --frozen-lockfile pnpm install --frozen-lockfile | 易错:npm ci 是 CI 环境专用命令,yarn/pnpm 无直接对应,需用参数模拟,用户常误以为 yarn ci 存在 |
| npm outdated | npm outdated yarn outdated pnpm outdated | 易错:三者命令完全一致,但输出格式不同(npm 表格 vs yarn 列表),本工具仅对照命令名,不涉及输出格式差异 |
| npm audit fix | npm audit fix yarn audit fix pnpm audit fix | 边界:安全审计修复命令,pnpm 在 v7+ 才支持,低版本无此命令,用户需注意版本兼容 |
1.全局安装与项目安装命令混淆
npm install -g lodash // 本意是项目依赖npm install lodashnpm install -g 将包安装到全局 node_modules,项目里 require 找不到;项目依赖不加 -g 才写入当前目录的 node_modules 和 package.json。
2.yarn 运行脚本时漏掉 run
yarn dev // 假设 dev 是自定义脚本yarn run devyarn 对内置命令(如 add、install)可省略 run,但自定义脚本必须显式写 yarn run,否则 yarn 会尝试当作内置命令执行导致报错。
3.pnpm 下包版本范围写法不兼容
pnpm add react@^18.0.0pnpm add react@18.0.0 // 或 pnpm add react@latestpnpm add 默认锁定精确版本,^~ 前缀会被忽略并报错;需要范围版本时应在 package.json 中手动编辑,或使用 pnpm add react@18.0.0 --save-exact 明确行为。
4.npm ci 与 npm install 混用导致锁文件被改
npm ci // 在已有 node_modules 的目录运行先删除 node_modules 再 npm ci,或直接 npm installnpm ci 会删除 node_modules 并严格按 package-lock.json 安装,若锁文件与 package.json 不一致会报错;日常开发用 npm install 更灵活。
5.yarn resolutions 误写成 dependencies
"dependencies": { "lodash": "4.17.21" } // 想强制子依赖版本"resolutions": { "lodash": "4.17.21" }yarn resolutions 是顶层字段,用于覆盖子依赖版本;写在 dependencies 里只影响直接依赖,子依赖仍可能安装旧版。
6.pnpm workspace 中跨包引用路径错误
import { foo } from '../packages/utils' // 相对路径import { foo } from '@myorg/utils' // 包名pnpm workspace 通过软链接映射包名,应使用包名而非相对路径;否则 pnpm 不会触发依赖解析,导致版本不一致或构建失败。
7.npm outdated 与 npm update 的认知偏差
npm update // 期望更新到最新大版本npm install <包名>@latest // 或手动改 package.json 后 npm installnpm update 只更新到 package.json 中声明的范围上限(如 ^1.0.0 最多到 1.x.x),不会跨大版本;要升级大版本需显式指定 @latest。
8.yarn 2+ (Berry) 下 node_modules 不存在导致脚本失败
node scripts/build.js // 假设 node_modules 存在yarn node scripts/build.js // 或 yarn dlx ...yarn Berry 默认使用 PnP 模式,不生成 node_modules;直接 node 命令找不到依赖,必须用 yarn node 或启用 nodeLinker: node-modules 回退。
命令映射关系:npm <cmd> → yarn <cmd> → pnpm <cmd>
npm <cmd>npm 包管理器的命令yarn <cmd>Yarn 包管理器的对应命令pnpm <cmd>pnpm 包管理器的对应命令安装依赖:npm install → yarn add → pnpm add。例如安装 lodash:npm install lodash → yarn add lodash → pnpm add lodash,三者均将 lodash 写入 package.json 并下载到 node_modules。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。