升级Vaadin 8到14时Webpack因缺失terser模块启动失败求助
Vaadin 8升级至14时Webpack因缺失terser模块报错
环境与报错详情
正在将Vaadin 7应用逐步升级至Vaadin 24,当前处于Vaadin 8到14的升级阶段,使用npm版本6.14.10。启动应用时Webpack报错,导致访问UI时抛出java.lang.IllegalStateException: Webpack exited prematurely异常,具体错误日志如下:
Webpack failed with the exception: internal/modules/cjs/loader.js:883 throw err; ^ Error: Cannot find module 'terser' Require stack: - C:\...\my-app\node_modules\webpack-babel-multi-target-plugin\dist\src\safari-nomodule-fix\safari.nomodule.fix.plugin.js - C:\...\my-app\node_modules\webpack-babel-multi-target-plugin\dist\src\babel.multi.target.plugin.js - C:\...\my-app\node_modules\webpack-babel-multi-target-plugin\dist\index.js - C:\...\my-app\webpack.generated.js - C:\...\my-app\webpack.config.js - C:\...\my-app\node_modules\webpack-cli\bin\utils\convert-argv.js - C:\...\my-app\node_modules\webpack-dev-server\bin\webpack-dev-server.js at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15) at Function.Module._load (internal/modules/cjs/loader.js:725:27) at Module.require (internal/modules/cjs/loader.js:952:19) at require (internal/modules/cjs/helpers.js:88:18) at Object.<anonymous> (C:\...\my-app\node_modules\webpack-babel-multi-target-plugin\dist\src\safari-nomodule-fix\safari.nomodule.fix.plugin.js:14:16) at Module._compile (internal/modules/cjs/loader.js:1063:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10) at Module.load (internal/modules/cjs/loader.js:928:32) at Function.Module._load (internal/modules/cjs/loader.js:769:14) at Module.require (internal/modules/cjs/loader.js:952:19) at require (internal/modules/cjs/helpers.js:88:18) at Object.<anonymous> (C:\...\my-app\node_modules\webpack-babel-multi-target-plugin\dist\src\babel.multi.target.plugin.js:9:38) at Module._compile (internal/modules/cjs/loader.js:1063:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10) at Module.load (internal/modules/cjs/loader.js:928:32) at Function.Module._load (internal/modules/cjs/loader.js:769:14) { code: 'MODULE_NOT_FOUND', requireStack: [ 'C:\\...\\my-app\\node_modules\\webpack-babel-multi-target-plugin\\dist\\src\\safari-nomodule-fix\\safari.nomodule.fix.plugin.js', 'C:\\...\\my-app\\node_modules\\webpack-babel-multi-target-plugin\\dist\\src\\babel.multi.target.plugin.js', 'C:\\...\\my-app\\node_modules\\webpack-babel-multi-target-plugin\\dist\\index.js', 'C:\\...\\my-app\\webpack.generated.js', 'C:\\...\\my-app\\webpack.config.js', 'C:\\...\\my-app\\node_modules\\webpack-cli\\bin\\utils\\convert-argv.js', 'C:\\...\\my-app\\node_modules\\webpack-dev-server\\bin\\webpack-dev-server.js' ] }
同时应用日志中存在npm警告:
npm WARN webpack-babel-multi-target-plugin@2.5.0 requires a peer of terser@>=3.12.0 but none is installed. You must install peer dependencies yourself.
已尝试但无效的解决方案
- 删除
.vaadin目录内容 - 删除
node_modules目录内容 - 升级至Vaadin 14最新版本(14.11.2)并使用Gradle重建项目
- 执行
npm install --save-dev "terser@>=3.12.0" - 执行
npm install --legacy-peer-deps - 手动在
package.json中添加terser依赖(分别尝试dependencies和devDependencies)
额外可行解决方案
- 锁定terser具体兼容版本:执行
npm install --save-dev terser@4.8.0,该版本与webpack-babel-multi-target-plugin@2.5.0兼容性更稳定,避免版本范围匹配问题 - 清理npm缓存后重装:先执行
npm cache clean --force清空缓存,再删除node_modules和package-lock.json,最后重新执行npm install - 检查并调整Webpack配置:查看
webpack.generated.js是否存在异常引用,或在webpack.config.js中显式配置terser-webpack-plugin,确保模块能被正确识别 - 切换适配的npm版本:尝试升级npm到7.x版本(如7.24.0),该版本对peer依赖的处理逻辑更适配Vaadin 14的依赖体系,升级后重新安装依赖
- 检查.npmrc配置:查看项目根目录的
.npmrc文件,若存在strict-peer-deps或异常registry配置,临时注释后重新执行依赖安装 - 用Gradle深度清理缓存:执行
./gradlew vaadinClean清理Vaadin相关构建缓存,再执行./gradlew build --refresh-dependencies强制刷新所有依赖
内容的提问来源于stack exchange,提问作者Evan
相关产品推荐
相关产品推荐

