Angular 5项目用--prod构建报错:If encoding is specified then the first argument must be a string
我之前帮同事处理过几乎一模一样的问题,你碰到的这个"[id].[chunkhash:20].chunk.js If encoding is specified then the first argument must be a string"错误,确实和UglifyJS与Node 8.9.4的兼容性冲突有关——毕竟Angular 5的构建工具链和较新的Node版本存在一些适配问题。下面是几个经过验证的解决方向:
1. 升级UglifyJS相关依赖包
Angular 5默认搭配的uglify-js和@angular-devkit/build-optimizer版本可能和Node 8.x不兼容,直接升级到稳定适配的版本就能解决问题:
- 先卸载旧依赖:
npm uninstall @angular-devkit/build-optimizer uglify-js - 安装兼容的新版本:
npm install @angular-devkit/build-optimizer@0.0.35 uglify-js@3.3.20 --save-dev
这个版本组合在Node 8.9.4环境下对Angular 5的生产构建支持很稳定,我同事当时就是这么搞定的。
2. 拆分生产构建参数,绕过默认的--prod配置
有时候--prod会一次性触发所有生产优化流程,反而容易触发冲突。你可以手动指定生产环境参数,替代--prod:
ng build --aot=true --optimization=true --build-optimizer=true --sourcemaps=false --extract-css=true --named-chunks=false --vendor-chunk=false
这样既能达到生产构建的效果,又能避免--prod默认启用的某些可能出问题的优化步骤,还方便你逐个排查到底是哪个参数导致的报错。
3. 临时切换Node版本(应急方案)
如果升级依赖的方法无效,降级Node版本到v8.5.x或者v6.x确实能快速解决问题,但不推荐长期使用旧版本。你可以用nvm来快速切换版本:
- 安装nvm后,安装指定版本:
nvm install 8.5.0 - 切换到该版本:
nvm use 8.5.0
切换后再执行ng build --prod,应该就能顺利完成构建了。
4. 排查项目中的特殊代码
还有一种可能是项目里存在非标准代码(比如第三方库未转译的ES6+语法、动态生成的特殊字符串),导致UglifyJS压缩时出错。你可以先临时禁用build-optimizer试试:
ng build --prod --build-optimizer=false
如果禁用后构建正常,那就要逐步排查项目中的组件、模块或者第三方依赖,找到触发UglifyJS bug的代码——要么修改代码,要么给对应的依赖添加转译配置。
补充一下:这个错误的本质是UglifyJS在处理chunk文件时,对编码参数的处理逻辑和Node 8.x的文件系统API不兼容,导致传递了非字符串类型的参数,所以核心思路就是要么让UglifyJS适配Node版本,要么让Node版本适配UglifyJS,或者绕过冲突的优化环节。
内容的提问来源于stack exchange,提问作者Mark

