起因
由于之前项目赶进度,所以忽略了项目构建时生成的文件体积大小(vendor.js达到了8.4M
😅)。忙完后回过头来进行构建优化,才发现本地构建一直失败。内部的CI/CD构建正常,所以没有发现这个问题。
运行环境
NodeJs@22.11.0
Vite@5.4.3
报错信息
截取部分关键信息
[29010:0x130008000] 55880 ms: Mark-Compact 4031.2 (4128.1) -> 4027.3 (4140.6) MB, pooled: 0 MB, 1857.00 / 0.00 ms (average mu = 0.389, current mu = 0.175) allocation failure; scavenge might not succeed
[29010:0x130008000] 59320 ms: Mark-Compact 4043.7 (4141.1) -> 4037.6 (4150.8) MB, pooled: 0 MB, 3405.04 / 0.00 ms (average mu = 0.176, current mu = 0.010) allocation failure; scavenge might not succeed
<--- JS stacktrace ---> FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory ----- Native stack trace -----
1: 0x102e4fc58 node::OOMErrorHandler(char const*, v8::OOMDetails const&) [/Users/01422266/.nvm/versions/node/v22.11.0/bin/node]
2: 0x103078d98 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, v8::OOMDetails const&)
3: 0x103263038 v8::internal::Heap::stack()
4: 0x103261444 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags)
## ...忽略
127: 0x102e0d59c node::Start(int, char**)
128: 0x10a0c108c
[1] 28986 abort npm run build
Mark-Compact allocation failure, scavenge might not succeed
标记-整理 初始化失败,清理可能不成功。
"FATAL ERROR: Reached heap limit Allocation failed"
达到堆内存上限,初始化失败。
从报错信息分析报错是因为Node老生代内存分配不足,导致堆内存溢出,主线程崩溃,最简单的解决方式就是增加老生代内存分配的最大值。
如何修改呢?参见NodeJs Api文档 nodejs.org/api/cli.htm… 可以通过--max-old-space-size
进行修改。
修改 --max-old-space-size 大小
方式一:修改全局变量
-
windows
在环境变量中,添加
NODE_OPTIONS=--max-old-space-size=8192
-
Mac
- 在终端工具的配置文件中添加环境变量。笔者用的
item2
,bash工具是zsh
。
cd ~ vim .zshrc
- 添加NODE_OPTIONS
export const NODE_OPTIONS=--max-old-space-size=8192
- 在终端工具的配置文件中添加环境变量。笔者用的
方式二:通过cross-env
对单个项目生效
- 安装
cross-env
pnpm add cross-env -D
- 修改package.json的scripts
scripts: {
"build": "cross-env NODE_OPTIONS=--max-old-space-size=8192 && vite build"
}
通过以上设置,再次本地运行pnpm run build
就能恢复正常构建了。
思考🤔
这种方法解决了构建的问题,但是没有找到引起问题的真正原因,因为项目还没有大到需要这么多资源进行构建,猜测是因为vite.config.js
的不合理配置导致的。