Yarn 3升级后执行yarn build遇Compilation类型错误求助
升级Yarn 1到Yarn 3后Webpack构建出现Compilation类型错误的排查求助
我已经断断续续研究这个问题几天了,仍未找到可行的解决方向。
正尝试将公司的Monorepo从Yarn 1.22升级到Yarn 3,目的是提升依赖安装速度。Yarn官方迁移步骤很简单,但我们的Monorepo包含大量构建流程,问题仅在升级后出现。
我们的Monorepo包含多个前端项目,有统一工具管理构建和测试流程。问题已定位到yarn build步骤,执行该命令时触发如下错误:
TypeError: The 'compilation' argument must be an instance of Compilation at Function.getCompilationHooks (/Users/myuser/workspace/monorepo/web/tools/webpack/node_modules/webpack/lib/javascript/JavascriptModulesPlugin.js:151:10) at SourceMapDevToolModuleOptionsPlugin.apply (/Users/myuser/workspace/monorepo/web/tools/webpack/node_modules/webpack/lib/SourceMapDevToolModuleOptionsPlugin.js:50:27) at /Users/myuser/workspace/monorepo/web/tools/webpack/node_modules/webpack/lib/SourceMapDevToolPlugin.js:183:53 at Hook.eval [as call] (eval at create (/Users/myuser/workspace/monorepo/node_modules/webpack/node_modules/tapable/lib/HookCodeFactory.js:19:10), <anonymous>:102:1) at Hook.CALL_DELEGATE [as _call] (/Users/myuser/workspace/monorepo/node_modules/webpack/node_modules/tapable/lib/Hook.js:14:14) at Compiler.newCompilation (/Users/myuser/workspace/monorepo/node_modules/webpack/lib/Compiler.js:1124:26) at /Users/myuser/workspace/monorepo/node_modules/webpack/lib/Compiler.js:1168:29 at Hook.eval [as callAsync] (eval at create (/Users/myuser/workspace/monorepo/node_modules/webpack/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:6:1) at Hook.CALL_ASYNC_DELEGATE [as _callAsync] (/Users/myuser/workspace/monorepo/node_modules/webpack/node_modules/tapable/lib/Hook.js:18:14) at Compiler.compile (/Users/myuser/workspace/monorepo/node_modules/webpack/lib/Compiler.js:1163:28)
查阅资料后得知这类问题可能源于Node安装问题或多版本Webpack共存。我已执行以下排查操作:
- 清理nvm缓存
- 清理Yarn缓存
- 删除Monorepo中所有
node_modules文件夹并重新安装依赖
但问题仍未解决。暂未尝试重新安装Node,不认为这能解决问题。
随后我同步了项目中所有依赖的Webpack版本至webpack@5.86.0,执行yarn why webpack的输出如下:
yarn why webpack ├─ @monorepo/ui-react@workspace:web/packages/ui-react [3e9d5] │ └─ webpack@npm:5.86.0 [dc2b7] (via npm:^5.86.0 [dc2b7]) │ ├─ @monorepo/ui-react@workspace:web/packages/ui-react [6105e] │ └─ webpack@npm:5.86.0 [dc2b7] (via npm:^5.86.0 [dc2b7]) │ ├─ @monorepo/ui-react@workspace:web/packages/ui-react [85f66] │ └─ webpack@npm:5.86.0 [dc2b7] (via npm:^5.86.0 [dc2b7]) │ ├─ @monorepo/ui-react@workspace:web/packages/ui-react [bf190] │ └─ webpack@npm:5.86.0 [dc2b7] (via npm:^5.86.0 [dc2b7]) │ ├─ @monorepo/ui-react@workspace:web/packages/ui-react │ └─ webpack@npm:5.86.0 [dc2b7] (via npm:^5.86.0 [dc2b7]) │ ├─ @monorepo/webpack@workspace:web/tools/webpack │ └─ webpack@npm:5.86.0 [b35f9] (via npm:^5.86.0 [b35f9]) │ ├─ react-scripts@npm:5.0.1 │ └─ webpack@npm:5.86.0 (via npm:^5.64.4) │ ├─ react-scripts@npm:5.0.1 [d10d4] │ └─ webpack@npm:5.86.0 [dc2b7] (via npm:^5.86.0 [dc2b7]) │ └─ react-scripts@npm:5.0.1 [dc2b7] └─ webpack@npm:5.86.0 [dc2b7] (via npm:^5.86.0 [dc2b7])
虽然所有依赖的Webpack版本一致,但不确定yarn build是否仍在调用多版本Webpack。
接着排查Webpack配置,发现错误源于SourceMapDevToolPlugin。当我从Webpack工具的config.js中移除该插件时,构建可以成功完成:
// 被移除的代码 new webpack.SourceMapDevToolPlugin({ noSources: false, filename: '[name].[fullhash].js.map', }),
由于我们的日志工具需要该插件生成的Source Map,我并不想移除它。目前陷入瓶颈,不知如何在保留该插件的前提下解决这个Compilation类型错误。Yarn 3存在一些差异,我不确定该投入时间到哪个方向。另外,我们在根目录package.json中为Webpack工具设置了nohoist,但该特性已被废弃,暂时不认为它会导致问题。恳请各位提供解决思路或建议。
内容的提问来源于stack exchange,提问作者TheGRS
相关产品推荐
相关产品推荐

