在 pnpm 中,public-hoist-pattern[] 是用于控制依赖提升(Hoisting)的一个重要配置项。
核心作用
它的主要作用是允许符合特定规则的第三方依赖被提升到根目录的 node_modules 中,从而使其对项目中的所有代码(包括未在 package.json 中显式声明该依赖的代码)可见。
为什么需要它?
-
pnpm 默认使用符号链接的方式管理依赖
-
大多数依赖不会被提升到顶层 node_modules,而是存放在 .pnpm 文件夹中
-
这样可以避免幽灵依赖问题,但也可能导致某些包无法被正确访问
为什么需要这个配置
-
@aurora 作用域下的包可能是内部私有包
-
这些包可能在构建、运行或插件机制中需要直接访问(例如通过 require('@aurora/xxx'))
-
通过强制提升,确保这些包始终在 node_modules 顶层,避免因路径解析失败导致的问题
配置规则与默认值
默认值:通常默认为 ['eslint ', 'prettier ']。这意味着任何名称包含 eslint 或 prettier 的包都会被自动提升。
配置位置:在项目根目录的 .npmrc 文件中定义。
语法示例:
ini
提升所有以 @types/ 开头的包和所有包含 babel 的包
public-hoist-pattern[]=@types/*
public-hoist-pattern[]=babel
使用 ! 符号可以排除特定包(从 v7.12.0 开始支持)
public-hoist-pattern[]=!@types/react
请谨慎使用此类代码。
与 hoist-pattern 的区别
hoist-pattern:将匹配的包提升到 node_modules/.pnpm/node_modules(一个隐藏的、由 pnpm 内部管理的目录)。
public-hoist-pattern:将匹配的包直接提升到根目录 node_modules,对外部环境完全可见。
pnpm10中的使用
publicHoistPattern
默认值:[]
类型:string[]
不同于 hoist-pattern 会把依赖提升到一个虚拟存储中的隐藏的模块目录中,publicHoistPattern 将匹配的依赖提升至根模块目录中。 提升至根模块目录中意味着应用代码可以访问到幻影依赖,即使它们对解析策略做了不当的修改。
当处理一些不能正确解析依赖关系的有缺陷可插拔工具时,此设置很有用。
例如:
javascript
publicHoistPattern:
- "*plugin*"
- "*aurora*"
- "*@wetest*"
- "*@types*"
- "*eslint*"