特点
- 节省磁盘空间:多个项目依赖同一个依赖包,仅在全局存储一份文件
- 提升安装速度:
-
- 依赖解析。 仓库中没有的依赖都被识别并获取到仓库。
-
- 目录结构计算。
node_modules目录结构是根据依赖计算出来的。
- 目录结构计算。
-
- 链接依赖项。 所有以前安装过的依赖项都会直接从存储区中获取并链接到
node_modules。
- 链接依赖项。 所有以前安装过的依赖项都会直接从存储区中获取并链接到
-
- 创建一个非扁平的node_modules目录
- 硬链接用于“全局存储” :PNPM将下载的每个包的一个版本,在全局存储(~/.pnpm-store)里只保存一份物理文件。当某个项目需要这个包时,PNPM并不复制文件,而是在项目的
.pnpm目录中为它创建一个硬链接。这保证了磁盘空间的高效利用,所有项目共享同一份物理文件。 - 软链接用于构建“依赖树” :项目的根
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/*包括所有公共包(如vue、reactivity、compiler-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