pnpm学习备忘

31 阅读3分钟

特点

  • 节省磁盘空间:多个项目依赖同一个依赖包,仅在全局存储一份文件
  • 提升安装速度:
      1. 依赖解析。 仓库中没有的依赖都被识别并获取到仓库。
      1. 目录结构计算。 node_modules 目录结构是根据依赖计算出来的。
      1. 链接依赖项。 所有以前安装过的依赖项都会直接从存储区中获取并链接到 node_modules
  • 创建一个非扁平的node_modules目录
  1. 硬链接用于“全局存储” :PNPM将下载的每个包的一个版本,在全局存储(~/.pnpm-store)里只保存一份物理文件。当某个项目需要这个包时,PNPM并不复制文件,而是在项目的 .pnpm 目录中为它创建一个硬链接。这保证了磁盘空间的高效利用,所有项目共享同一份物理文件。
  2. 软链接用于构建“依赖树” :项目的根 node_modules 下的直接依赖,以及 .pnpm 目录内包自己的 node_modules 下的依赖,都是软链接。它们像快捷方式一样,指向 .pnpm 中那些具体的、带有版本号的硬链接文件。这使得依赖结构清晰,且可以灵活地指向不同版本。
packages:
  - 'packages/*'
  - 'packages-private/*'

catalog:
  '@babel/parser': ^7.28.5
  '@babel/types': ^7.28.5
  'estree-walker': ^2.0.2
  'magic-string': ^0.30.21
  'source-map-js': ^1.2.1
  'vite': ^5.4.15
  '@vitejs/plugin-vue': ^6.0.1

onlyBuiltDependencies:
  - '@swc/core'
  - 'esbuild'
  - 'puppeteer'
  - 'simple-git-hooks'
  - 'unrs-resolver'

peerDependencyRules:
  allowedVersions:
    'typescript-eslint>eslint': '^9.0.0'
    '@typescript-eslint/eslint-plugin>eslint': '^9.0.0'
    '@typescript-eslint/parser>eslint': '^9.0.0'
    '@typescript-eslint/type-utils>eslint': '^9.0.0'
    '@typescript-eslint/utils>eslint': '^9.0.0'

1. packages

packages:

  • 'packages/*'
  • 'packages-private/*'

作用: 定义工作区中包含哪些包

  • 告诉 pnpm 哪些目录是独立的包
  • packages/* 包括所有公共包(如 vuereactivitycompiler-core 等)
  • packages-private/* 包括私有包(如测试工具、playground 等)
  • 这些包可以相互引用,pnpm 会自动链接它们

2. catalog

catalog: '@babel/parser': ^7.28.5 '@babel/types': ^7.28.5 ...

作用: 依赖版本目录 (Dependency Catalog)

  • 集中管理多个包共享的依赖版本

  • 各个子包可以通过 catalog: 协议引用这些版本

  • 好处:

    • 确保所有包使用相同版本的依赖
    • 只需在一处更新版本
    • 避免版本冲突

3. onlyBuiltDependencies

onlyBuiltDependencies:

  • '@swc/core'
  • 'esbuild'
  • 'puppeteer'
  • 'simple-git-hooks'

作用: 仅构建依赖

  • 列出的依赖在安装时仅会运行安装脚本pnpm install 的时候,只有名单里这些包(比如 esbuild@swc/core)被允许去执行它们自带的安装脚本(postinstall 等),用来下载/编译二进制之类的东西。)
  • 防止这些包在每次 pnpm install 时重复构建
  • 主要用于包含原生代码的依赖(需要编译的二进制模块)
  • 提高安装速度,避免不必要的重复构建

4. peerDependencyRules.allowedVersions

peerDependencyRules: allowedVersions: 'typescript-eslint>eslint': '^9.0.0' '@typescript-eslint/eslint-plugin>eslint': '^9.0.0' ...

作用: 对等依赖版本规则

  • 覆盖默认的 peer dependency 版本检查

  • 格式: 包名>对等依赖名: 允许的版本

  • 用途:

    • 解决 peer dependency 版本冲突警告
    • 允许使用特定版本的对等依赖,即使它与声明的不完全匹配
    • 这里允许 TypeScript ESLint 相关包使用 ESLint ^9.0.0