我解释一下 yarn 和 pnpm 的主要区别,以及转换时需要注意的事项:
- 依赖安装机制的区别:
Yarn/npm 的方式(扁平化):
node_modules ├── A ├── B ├── C (B 的依赖) └── D (C 的依赖)
所有依赖都被提升到顶层,这意味着你的项目可能会访问到未在 package.json 中声明的依赖(幽灵依赖)。
pnpm 的方式(严格):
node_modules ├── .pnpm │ ├── A@1.0.0 │ ├── B@1.0.0 │ ├── C@1.0.0 │ └── D@1.0.0 ├── A -> .pnpm/A@1.0.0 └── B -> .pnpm/B@1.0.0
只有在 package.json 中声明的依赖才能被访问。
- 需要注意的事项:
显式声明所有依赖:
- 使用 yarn 时可能存在隐式依赖(没写在 package.json 但能用)
- 转到 pnpm 后,必须在 package.json 中明确声明所有使用的依赖
检查代码中的依赖引用:
// 这样的代码在 yarn 中可能正常工作 const somePackage = require('some-package'); // 包未在 package.json 中声明 // 使用 pnpm 后需要先安装依赖 npm install some-package // 或 pnpm add some-package
- 迁移步骤:
- 删除现有的 node_modules 和 yarn.lock
- 安装 pnpm:
npm install -g pnpm
- 运行
pnpm install
- 运行项目,检查是否有依赖相关错误
- 如果有错误,需要手动安装缺失的依赖:
pnpm add missing-package
- 常见问题解决:
如果遇到模块找不到的错误:
Error: Cannot find module 'some-package'
解决方案:
pnpm add some-package
- 兼容模式(如果必要):
如果项目暂时无法完全适应严格的依赖管理,可以在 .npmrc
中配置:
shamefully-hoist=true
这会使 pnpm 的行为更接近 yarn,但不推荐长期使用。
总结:
- pnpm 的依赖管理更严格,这实际上是好事,可以避免依赖混乱
- 主要工作是确保所有使用的依赖都正确声明在 package.json 中
- 遇到模块找不到的错误时,直接安装相应的依赖即可
- 推荐使用严格模式,这样可以保持更清晰的依赖关系
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。