我解释一下 yarn 和 pnpm 的主要区别,以及转换时需要注意的事项:

  1. 依赖安装机制的区别
  • 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 中声明的依赖才能被访问。

  1. 需要注意的事项
  • 显式声明所有依赖

    • 使用 yarn 时可能存在隐式依赖(没写在 package.json 但能用)
    • 转到 pnpm 后,必须在 package.json 中明确声明所有使用的依赖
  • 检查代码中的依赖引用

    // 这样的代码在 yarn 中可能正常工作
    const somePackage = require('some-package'); // 包未在 package.json 中声明
    
    // 使用 pnpm 后需要先安装依赖
    npm install some-package  // 或 pnpm add some-package
  1. 迁移步骤
  2. 删除现有的 node_modules 和 yarn.lock
  3. 安装 pnpm: npm install -g pnpm
  4. 运行 pnpm install
  5. 运行项目,检查是否有依赖相关错误
  6. 如果有错误,需要手动安装缺失的依赖:pnpm add missing-package
  7. 常见问题解决

如果遇到模块找不到的错误:

Error: Cannot find module 'some-package'

解决方案:

pnpm add some-package
  1. 兼容模式(如果必要):

如果项目暂时无法完全适应严格的依赖管理,可以在 .npmrc 中配置:

shamefully-hoist=true

这会使 pnpm 的行为更接近 yarn,但不推荐长期使用。

总结:

  • pnpm 的依赖管理更严格,这实际上是好事,可以避免依赖混乱
  • 主要工作是确保所有使用的依赖都正确声明在 package.json 中
  • 遇到模块找不到的错误时,直接安装相应的依赖即可
  • 推荐使用严格模式,这样可以保持更清晰的依赖关系

本文由mdnice多平台发布


心灵星图
1 声望0 粉丝

你好,我是心灵星图的运营者,很高兴能在这里与你相遇。我热爱探索人类心灵的奥秘,也乐于分享关于科技、心理、哲学的思考。让我们一起在知识的星空中,描绘出属于每个人的心灵地图。