Angular 8迁移至Angular 9后执行ng build --prod遇budgets超限错误
核心原因
不是编译内存使用方式变化,而是Angular 9默认启用了差异加载(Differential Loading),导致构建产物的统计逻辑和Angular 8不同:
- Angular 8中差异加载需手动开启,而Angular 9开始默认生成ES2015和ES5两个版本的初始包,以适配不同浏览器。
- 原有budgets配置的
initial类型,在Angular 9中会分别对ES2015和ES5的初始包进行大小校验,两个包的体积均远超你设置的2MB警告、5MB错误阈值,因此触发了超限提示。
报错信息对应
你遇到的警告和错误明确指向两个版本的初始包超限:
WARNING in budgets: Exceeded maximum budget for initial-es2015. Budget 2 MB was not met by 13.8 MB with a total of 15.8 MB.
WARNING in budgets: Exceeded maximum budget for initial-es5. Budget 2 MB was not met by 15.6 MB with a total of 17.6 MB.
ERROR in budgets: Exceeded maximum budget for initial-es2015. Budget 5 MB was not met by 10.8 MB with a total of 15.8 MB.
ERROR in budgets: Exceeded maximum budget for initial-es5. Budget 5 MB was not met by 12.6 MB with a total of 17.6 MB.
解决方案
1. 临时调整budgets阈值(已验证有效)
修改angular.json中的budgets配置,提高对应阈值以适配双版本包的体积:
"budgets": [ { "type": "initial", "maximumWarning": "12mb", "maximumError": "20mb" } ]
调整后执行ng build --prod即可正常完成构建。
2. 长期优化方案(推荐)
如果希望保持严格的budgets限制,可通过以下方式压缩包体积:
- 确认摇树优化开启:在
angular.json的生产构建配置中,确保optimization、buildOptimizer、treeShaking均设为true - 分析包体积:执行
ng build --prod --stats-json生成统计文件,用webpack-bundle-analyzer工具定位体积过大的依赖或未使用的代码 - 启用模块懒加载:将非核心业务模块改为懒加载,降低初始包体积
- 按需引入依赖:对大型第三方库采用按需引入的方式,避免打包完整库
内容的提问来源于stack exchange,提问作者Nicolas Cozzo

