Angular 4 Universal构建触发内存限制错误求助
首先看你给出的错误栈片段:
Security context: 0x2189632d
1: DoJoin(aka DoJoin) [native array.js:~95] [pc=0x3bb15e9b](this=0x28a841a1 ,p=0x2c9cc3e9 <JSArray[5865]>,q=5865,E=0x28a84209 ,A=0x28a84279 <S...
这个错误基本可以确定是Node.js构建时内存不足导致的,你之前用--max_new_space_size没效果,大概率是参数用错了——构建过程主要占用的是Node的老内存空间(Old Space),不是新内存空间,下面给你几个可行的解决办法:
修正内存参数的使用方式:
把参数换成--max_old_space_size,并且要确保参数是传给Node进程,而不是Angular CLI。正确的构建命令应该是:node --max_old_space_size=8192 node_modules/@angular/cli/bin/ng build --universal这里的
8192表示分配8GB内存,你可以根据自己机器的配置调整(比如4GB就写4096)。如果直接给Angular CLI加这个参数是无效的,必须先启动Node并指定内存,再调用CLI的执行文件。优化Angular构建配置:
打开你的angular-cli.json,在projects -> <你的项目名> -> architect -> build里做以下调整:- 设置
vendorChunk: false:减少构建时生成的vendor chunk数量,降低内存开销; - 确保
aot: true:AOT编译会提前把模板编译成JS,不仅能提升运行时性能,也能减少构建过程的内存占用(Angular CLI 1.4.x可能需要手动开启); - 清理不必要的依赖:检查
package.json,移除项目中不再使用的第三方库,然后删除node_modules和package-lock.json,重新执行npm install,避免冗余依赖占用内存。
- 设置
升级Node和Angular CLI版本:
你当前用的Node 8.9.4和Angular CLI 1.4.4都比较老旧,存在一些已知的内存管理和构建效率问题:- Node可以升级到10.x版本(Angular 4兼容Node 6.9+,10.x是稳定且性能更好的选择);
- Angular CLI升级到1.7.4(这是适配Angular 4的最后一个CLI版本),新版本修复了不少旧版本的内存泄漏问题,能有效缓解构建时的内存压力。
拆分大型模块:
如果你的应用确实体量很大,可以尝试把一些大的功能模块拆分成更小的懒加载模块。Universal构建时会遍历所有模块的代码,拆分后能减少单次构建需要处理的代码量,从而降低内存占用。
内容的提问来源于stack exchange,提问作者Kishan

