NX Monorepo中pnpm未安装传递性工作区依赖的问题排查
问题原因
pnpm的严格依赖隔离机制下,当包使用workspace:*协议依赖工作区内的其他包时,默认只会在该包自身的node_modules中建立本地链接,不会自动将这个工作区依赖传递到上层依赖它的项目中。具体到你的场景:vite-plugin-parse-matter依赖workspace:*的parse-matter,pnpm不会主动把parse-matter链接到demo的node_modules或根node_modules,导致demo运行时vite-plugin-parse-matter找不到依赖。
解决方案(无需直接添加依赖或用peer依赖)
方案1:配置pnpm公共提升规则
在monorepo根目录的.pnpmrc文件中添加如下配置,指定需要提升的工作区包:
public-hoist-pattern[] = "parse-matter"
执行pnpm install后,pnpm会将parse-matter提升到根node_modules中,demo项目可通过Node.js的模块解析机制找到该依赖。
方案2:标记依赖为可注入
在vite-plugin-parse-matter的package.json中添加dependenciesMeta字段,标记parse-matter为需要注入到依赖链中的包:
{ "dependencies": { "parse-matter": "workspace:*" }, "dependenciesMeta": { "parse-matter": { "injected": true } } }
该配置会告诉pnpm,parse-matter需要被自动注入到所有依赖vite-plugin-parse-matter的项目依赖环境中,无需在demo中手动声明。
方案3:完善NX项目依赖配置
检查vite-plugin-parse-matter对应的project.json,确保其构建/运行目标正确声明了对parse-matter的依赖:
{ "targets": { "build": { "dependsOn": ["^build", "parse-matter:build"] } } }
这能保证NX在处理demo项目的依赖时,先完成parse-matter的构建与链接,避免运行时缺失依赖。
内容的提问来源于stack exchange,提问作者Robin

