139 lines
4.1 KiB
Markdown
139 lines
4.1 KiB
Markdown
# 编译器内存溢出解决方案
|
||
|
||
## 问题描述
|
||
编译时出现 `FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory` 错误,表示 Node.js 内存不足。
|
||
|
||
## 解决方案
|
||
|
||
### 方案一:增加 Node.js 内存限制(推荐)
|
||
|
||
#### 在 HBuilderX 中设置
|
||
|
||
1. **修改 HBuilderX 配置文件**
|
||
- 关闭 HBuilderX
|
||
- 找到 HBuilderX 安装目录
|
||
- 打开 `HBuilderX\plugins\node\node_modules\@dcloudio\vite-plugin-uni\dist` 目录
|
||
- 或者在项目根目录创建 `vue.config.js` 文件
|
||
|
||
2. **创建或修改项目根目录下的 `vue.config.js`**
|
||
```javascript
|
||
module.exports = {
|
||
transpileDependencies: [],
|
||
// 增加 Node.js 内存限制
|
||
configureWebpack: {
|
||
devServer: {
|
||
disableHostCheck: true
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
3. **修改 HBuilderX 启动配置**
|
||
- 找到 HBuilderX 安装目录
|
||
- 编辑 `HBuilderX.exe` 的启动参数
|
||
- 创建一个批处理文件 `start-hbuilderx.bat`:
|
||
```bat
|
||
@echo off
|
||
set NODE_OPTIONS=--max-old-space-size=8192
|
||
start "" "HBuilderX安装路径\HBuilderX.exe"
|
||
```
|
||
- 将内存设置为 8GB(8192MB),可根据实际情况调整为 4096、8192 或更大
|
||
|
||
#### 在命令行中运行(如果使用 CLI)
|
||
|
||
如果您使用命令行方式编译,可以设置环境变量:
|
||
|
||
**Windows PowerShell:**
|
||
```powershell
|
||
$env:NODE_OPTIONS="--max-old-space-size=8192"
|
||
```
|
||
|
||
**Windows CMD:**
|
||
```cmd
|
||
set NODE_OPTIONS=--max-old-space-size=8192
|
||
```
|
||
|
||
**永久设置(Windows 系统环境变量):**
|
||
1. 右键"此电脑" → "属性" → "高级系统设置" → "环境变量"
|
||
2. 在"用户变量"或"系统变量"中新建变量:
|
||
- 变量名:`NODE_OPTIONS`
|
||
- 变量值:`--max-old-space-size=8192`
|
||
3. 重启 HBuilderX
|
||
|
||
### 方案二:清理缓存
|
||
|
||
1. **清理 HBuilderX 缓存**
|
||
- 在 HBuilderX 中:运行 → 清理项目缓存
|
||
- 或者手动删除 `unpackage` 目录
|
||
|
||
2. **删除 node_modules 并重新安装**
|
||
```powershell
|
||
Remove-Item -Recurse -Force node_modules
|
||
# 如果有 package.json,重新安装依赖
|
||
npm install
|
||
```
|
||
|
||
### 方案三:优化项目
|
||
|
||
1. **检查大文件**
|
||
- 检查 `static` 目录下是否有过大的图片或资源文件
|
||
- 当前项目中有 85 个 icon 图片,建议:
|
||
- 压缩图片文件
|
||
- 使用雪碧图或字体图标代替多个小图标
|
||
- 将不常用的资源移到云存储
|
||
|
||
2. **检查第三方库**
|
||
- 检查 `lib` 目录中的第三方库是否必需
|
||
- 当前已引入的库:
|
||
- dompurify@3.2.4es.js
|
||
- markdown-it.min.js
|
||
- highlight-uni.min.js
|
||
- lunar-javascript@1.7.2.js
|
||
- string-similarity.min.js
|
||
- 考虑按需引入或延迟加载
|
||
|
||
3. **优化编译配置**
|
||
在 `manifest.json` 中的 `h5.optimization` 已启用 `treeShaking`,这很好。
|
||
|
||
4. **分包加载**
|
||
- 已使用 `packageA` 分包,继续保持
|
||
- 考虑将更多页面移到分包中
|
||
|
||
### 方案四:升级 HBuilderX
|
||
|
||
确保使用最新版本的 HBuilderX,新版本通常有更好的内存管理。
|
||
|
||
## 推荐操作步骤
|
||
|
||
1. **立即执行:** 设置 `NODE_OPTIONS` 环境变量为 `--max-old-space-size=8192`
|
||
2. **清理缓存:** 在 HBuilderX 中清理项目缓存
|
||
3. **重启 HBuilderX:** 使用新的环境变量启动
|
||
4. **长期优化:** 压缩静态资源,优化第三方库引入
|
||
|
||
## 验证
|
||
|
||
设置完成后,重新编译项目,查看是否还会出现内存溢出错误。
|
||
|
||
## 参考资料
|
||
|
||
- [uni-app 官方文档 - 内存溢出问题](https://uniapp.dcloud.net.cn/tutorial/run/OOM.html)
|
||
- Node.js 内存限制说明:
|
||
- 默认限制:约 1.4GB(32位)或 1.7GB(64位)
|
||
- 建议设置:4096MB(4GB)或 8192MB(8GB)
|
||
- 最大可设置:取决于系统可用内存
|
||
|
||
## 常见问题
|
||
|
||
**Q: 设置后仍然内存溢出?**
|
||
A: 尝试增大内存限制值,如 `--max-old-space-size=16384`(16GB)
|
||
|
||
**Q: 如何检查当前 Node.js 内存限制?**
|
||
A: 在命令行运行:`node -e "console.log(require('v8').getHeapStatistics().heap_size_limit/(1024*1024))"`
|
||
|
||
**Q: 编译特别慢?**
|
||
A: 内存充足但编译慢,可能是 CPU 性能问题,考虑:
|
||
- 关闭不必要的后台程序
|
||
- 使用 SSD 硬盘
|
||
- 升级硬件配置
|
||
|