pnpm 修改依赖源码打包报错
背景
在使用 Element Plus 的项目中,Rollup 报错:"affixProps" is not exported by "node_modules/.../affix.mjs"。具体错误示例如下:
x Build failed in 4.59s
error during build:
RollupError: "affixProps" is not exported by "node_modules/.pnpm/element-plus@2.6.0_vue@3.4.19/node_modules/element-plus/es/components/affix/src/affix.mjs", imported by "node_modules/.pnpm/element-plus@2.6.0_vue@3.4.19/node_modules/element-plus/es/components/affix/src/affix2.mjs".
file: C:/project/designCode/node_modules/.pnpm/element-plus@2.6.0_vue@3.4.19/node_modules/element-plus/es/components/affix/src/affix2.mjs:5:9
3: import '../../../utils/index.mjs';
4: import '../../../hooks/index.mjs';
5: import { affixProps, affixEmits } from './affix.mjs';
^
6: import _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs';
7: import { useNamespace } from '../../../hooks/use-namespace/index.mjs';
at getRollupEror (file:///C:/project/designCode/node_modules/.pnpm/rollup@4.12.0/node_modules/rollup/dist/es/shared/parseAst.js:375:41)
at error (file:///C:/project/designCode/node_modules/.pnpm/rollup@4.12.0/node_modules/rollup/dist/es/shared/parseAst.js:372:42)
at Module.error (file:///C:/project/designCode/node_modules/.pnpm/rollup@4.12.0/node_modules/rollup/dist/es/shared/node-entry.js:13651:16)
at Module.traceVariable (file:///C:/project/designCode/node_modules/.pnpm/rollup@4.12.0/node_modules/rollup/dist/es/shared/node-entry.js:14099:29)
at ModuleScope.findVariable (file:///C:/project/designCode/node_modules/.pnpm/rollup@4.12.0/node_modules/rollup/dist/es/shared/node-entry.js:11802:39)
at Identifier.bind (file:///C:/project/designCode/node_modules/.pnpm/rollup@4.12.0/node_modules/rollup/dist/es/shared/node-entry.js:7296:40)
at Property.bind (file:///C:/project/designCode/node_modules/.pnpm/rollup@4.12.0/node_modules/rollup/dist/es/shared/node-entry.js:4732:23)
at ObjectExpression.bind (file:///C:/project/designCode/node_modules/.pnpm/rollup@4.12.0/node_modules/rollup/dist/es/shared/node-entry.js:4728:28)
at CallExpression.bind (file:///C:/project/designCode/node_modules/.pnpm/rollup@4.12.0/node_modules/rollup/dist/es/shared/node-entry.js:4728:28)
at CallExpression.bind (file:///C:/project/designCode/node_modules/.pnpm/rollup@4.12.0/node_modules/rollup/dist/es/shared/node-entry.js:8961:15)
ELIFECYCLE Command failed with exit code 1.
这通常表明,Element Plus 内部组件文件(affix2.mjs
)引用了 affixProps
,但在 affix.mjs
中没有进行对应的导出。常见原因包括:
在
node_modules
中手动修改了 Element Plus 源码,破坏了内部的依赖关系;修改了 Element Plus 及其子依赖(如 utils、hooks、shared 等)的不同版本文件,导致某些导出名称不再一致;
不同版本的 Element Plus 之间存在接口变化,主组件与子组件的导出方式或名称不兼容。
具体案例
• 项目 A 使用了 Element Plus 2.7.8;
• 项目 B 使用了 Element Plus 2.6.0;
• 项目 A 手动替换了 es
与 lib
文件夹,使 Element Plus 源码被改动;
• 项目 B 在构建时却出现了 "affixProps is not exported by affix.mjs" 的报错,无法正常打包。
核心分析
手动修改 node_modules 破坏依赖结构
- 修改了 node_modules 中的 Element Plus 文件后,
affix2.mjs
与affix.mjs
之间的引用不匹配,导致构建报错。
- 修改了 node_modules 中的 Element Plus 文件后,
pnpm-store 全局缓存与依赖复用机制
pnpm 默认会将同版本依赖缓存到同一个全局 store 下,并通过链接方式复用;
即使两个项目使用不同版本的 Element Plus(如 2.6.0 和 2.7.8),它们可能共享相同版本的子依赖(如 utils、hooks、shared 等模块);
当在一个项目中修改了这些共享的子依赖后,另一个项目在安装时也会链接到这些被修改过的文件,从而导致打包错误;
这种依赖复用是 pnpm 的核心特性 —— 相同的依赖版本在全局 store 中只存储一次,不同项目通过符号链接或硬链接方式复用,以节省磁盘空间。
解决方案
避免在 node_modules 中直接改动依赖
node_modules 通常应该視为只读内容,重新安装依赖后,手动改动会被覆盖;
如确有必须变更第三方库的场景,可使用 patch-package 或 Fork 并维护自己的分支,保证依赖可追溯、可还原。
删除 node_modules 并强制重新安装
若发现已经污染了依赖,可先删除 node_modules,然后执行 pnpm install --force 等命令,重新下载干净版本;
若全局 store 也被破坏,需考虑更改 pnpm storeDir 位置或清空后重装。
确认依赖版本与兼容性
检查 Element Plus 版本及其配套依赖版本是否一致;
如果存在与项目不兼容的版本,应及时切换到正确版本或升级到已有修复的版本。
合理分离或配置 store
在多 Node.js 环境或团队协作场景下,可使用
.npmrc
或命令行参数--store
为项目指定独立的 pnpm store,避免因为依赖复用而相互影响;CI/CD 环境也应统一安装流程,保证同样的依赖版本和缓存配置。
总结
"affixProps is not exported" 等报错多由手动修改依赖或版本、缓存不一致引起。为避免相关问题,需注意:
尽量保持依赖的纯净状态,勿直接修改 node_modules;
若需要定制第三方库,可使用 patch-package 或 Fork;
遇到打包报错时,可先尝试删除 node_modules 并强制重新安装;
减少不同项目之间对同一依赖版本的重复改动,或合理配置 pnpm store 以避开全局依赖冲突。
说明
由于 pnpm 的依赖复用机制,即使两个项目使用不同版本的 Element Plus(如 2.6.0 和 2.7.8),它们可能共享相同版本的子依赖(如 utils、hooks、shared 等模块),项目 A 修改了 es 与 lib 的 Element Plus 的源码,而项目 B 也引用了 Element Plus 的源码,修改到了公共的依赖,导致打包时引用到错误内容。