pnpm工作区如何仅为指定包单独设置node-linker=hoisted
pnpm workspace 仅针对React Native子包启用hoisted模式配置方案
node-linker属于pnpm的全局安装级配置,子包目录下单独的.npmrc中配置该参数不会生效,pnpm执行workspace安装时只会读取根目录的linker相关配置,不需要全局开启node-linker=hoisted就能满足React Native/Expo的运行要求,具体配置方式如下:
根目录.npmrc定向配置(推荐方案)
保留pnpm默认的符号链接模式保证其他子包的依赖隔离,只定向提升React Native/Expo运行必须的依赖到根目录node_modules,不会出现全量子包依赖被提升的问题,将以下内容写入workspace根目录的.npmrc:
# 不全局开启hoisted,默认使用pnpm原生链接模式保证依赖隔离 node-linker=pnpm # 定向提升RN/Expo生态相关依赖,匹配规则可根据实际报错调整 hoist-pattern[]=*react* hoist-pattern[]=*react-native* hoist-pattern[]=*@react-native* hoist-pattern[]=*expo* hoist-pattern[]=*@expo* hoist-pattern[]=*metro* hoist-pattern[]=*hermes-engine* # 通用工具类依赖提升,避免多实例冲突 public-hoist-pattern[]=*eslint* public-hoist-pattern[]=*prettier* public-hoist-pattern[]=*typescript*
配置完成后在根目录执行pnpm install重新安装依赖即可,非RN相关的子包依赖不会被提升,依然保持pnpm默认的依赖隔离结构。如果运行RN项目时提示某依赖找不到,直接把对应依赖名按同样的hoist-pattern[]=*依赖名关键字*格式加到配置里即可。
兼容兜底方案
如果定向提升后老版本React Native/Expo依然存在依赖解析报错(部分旧版本RN的原生构建脚本会强制遍历node_modules目录查找依赖,对软链兼容极差),有两种可选兜底方式:
- 方式一:在根目录
package.json的pnpm.packageExtensions字段中补全RN相关包缺失的依赖声明,不需要修改linker模式{ "pnpm": { "packageExtensions": { "react-native@*": { "dependencies": { // 按报错提示补全缺失的依赖即可 } } } } } - 方式二:进入RN子包目录,执行带参数的安装命令单独为该子包启用hoisted模式:
pnpm install --config.node-linker=hoisted。注意这种方式下该子包的依赖不会和workspace其他包共享,每次安装/更新该子包依赖都需要带上该参数,适合RN子包和其他业务子包依赖复用度极低的场景。
注意:不要在子包目录的.npmrc中配置node-linker参数,pnpm的workspace安装流程以根目录配置为准,子目录下的linker类配置会被直接忽略,不会产生任何效果。
内容的提问来源于stack exchange,提问作者mbaroukhcw
相关产品推荐
相关产品推荐

