webpack打包多入口,大项目时,有时候会报内存溢出的错误(FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
),可采用以下步骤来解决问题:
1. 定位问题
可在打包脚本中,加入以下代码,实时监控内存占用情况
process.memoryUsage()
返回值为:
{
rss: 4935680,
heapTotal: 1826816,
heapUsed: 650472,
external: 49879,
arrayBuffers: 9386
}
单位是字节
heapTotal
和heapUsed
代表V8
的内存使用情况。external
代表V8
管理的,绑定到Javascript
的C++
对象的内存使用情况。rss
是驻留集大小, 是给这个进程分配了多少物理内存(占总分配内存的一部分),包含所有的C++
和JavaScript
对象与代码。arrayBuffers
指分配给ArrayBuffer
和SharedArrayBuffer
的内存,包括所有的Node.js Buffer
。 这也包含在external
值5. 中。 当Node.js
用作嵌入式库时,此值可能为0
,因为在这种情况下可能无法跟踪ArrayBuffer
的分配。
2. 解决问题
查看到webpack所需要的大致内存后,将nodejs
可用内存调整至其需要的大小,可通多以下几种方式调整:
2.1 nodejs执行相关脚本,直接添加--max-old-space-size
参数
node --max-old-space-size=8192 index.js
2.2 如果是通过gulp等处理的打包
找到node_modules/.bin/gulp文件,第一行会为#!/usr/bin/env node
,在node后面新增--max-old-space-size xxx
就好,
比如:
#!/usr/bin/env node --max_old_space_size=8192 // 8192为MB,可修改为自己需要的大小。
2.3 通过设置全局变量解决
# windows
set NODE_OPTIONS=--max_old_space_size=4096
# mac/linux
export NODE_OPTIONS=--max_old_space_size=4096
2.4 选择npm库increase-memory-limit
但是作者更推荐使用方式2.3
以上4种方式,都可解决内存溢出问题,可按照相关项目实际情况,选择合适的方式.