Angular10执行ng build --prod报错Property body应为array却得到null
问题根因
这个报错是生产构建时Babel转换ES6 for-of循环语法的过程中,遇到了非法的AST(抽象语法树)结构触发的校验错误。开发模式的ng build不会开启全量语法转换和压缩,因此不会触发该报错。
排查解决步骤
- 第一步:测试环境配置兼容性
你的environment.prod.ts中直接用require导入package.json的写法,在Angular 10生产构建的AOT编译优化阶段会触发额外的语法转换,先临时修改配置注释该逻辑测试:
重新执行export const environment = { production: true, VERSION: 'test-version' // 临时替换为固定版本号 };ng build --prod,如果构建正常,后续可以改用Angular官方推荐的方式注入版本号,避免使用require语法。 - 第二步:排查新增的异常for-of循环代码
报错堆栈明确指向@babel/plugin-transform-for-of插件处理逻辑出错,你可以对比新分支和原有分支的代码差异,排查所有新增的for-of循环语句,重点检查两种异常写法:
修正所有异常写法后重新构建。// 异常写法1:for-of后面直接跟分号,没有循环体 for (const item of userList); // 异常写法2:空循环体,部分Babel版本处理时会生成null的body属性 for (const item of userList) {} - 第三步:临时关闭构建优化定位问题
打开项目根目录的angular.json,找到生产构建的配置节点,临时关闭优化参数测试:
如果修改后可以正常构建,说明是Angular构建优化器和现有Babel插件的版本兼容问题,继续执行下一步。{ "projects": { "你的项目名": { "architect": { "build": { "configurations": { "production": { "buildOptimizer": false, "optimization": false } } } } } } } - 第四步:固定Babel转换插件版本
Angular 10对应的@babel/plugin-transform-for-ofv7.10+版本存在已知的空循环体处理bug,你可以手动固定兼容版本:
执行安装命令:npm install @babel/plugin-transform-for-of@7.12.1 --save-dev
在项目根目录新建babel.config.json文件,添加配置:
删除node_modules和package-lock.json后重新安装依赖,再执行生产构建即可。{ "plugins": ["@babel/plugin-transform-for-of"] }
内容的提问来源于stack exchange,提问作者Fluqz
相关产品推荐
相关产品推荐

