Vue 项目打包时如果出现 内存不足(OOM,Out of Memory)简称就是OOM,通常是因为项目代码量较大、依赖过多、打包时 Webpack 需要处理的文件过多,导致 Node.js 运行时超出了默认的内存限制。
一、为什么会出现内存不足?
- 项目过大:项目代码文件过多,Webpack 需要处理的内容太多。
- 第三方库过多:node_modules 体积过大,依赖库多且未进行优化。
- Source Map 过大:默认 production 模式会生成 .map 文件,占用大量内存。
- Tree Shaking 失败:未正确优化 Webpack,导致无用代码未被剔除。
- Node.js 默认内存限制:Node.js 进程默认最大内存约为 1.76GB(32 位)或 4GB(64 位),超出就会 OOM。
- Loader 处理文件过多:如 vue-loader、babel-loader 在转换文件时占用大量内存。
缓存未启用:Webpack 没有缓存处理,每次都要重新编译所有文件,增加内存消耗。
二、如何解决内存不足问题?
- 增加 Node.js 内存限制(最直接的方法)
在 package.json 的 scripts 里修改 build 命令:
"scripts": {
"build": "node --max-old-space-size=8192 node_modules/.bin/vue-cli-service build"
}
或者直接在命令行执行:
export NODE_OPTIONS="--max-old-space-size=8192" # Linux/macOS
set NODE_OPTIONS="--max-old-space-size=8192" # Windows
npm run build
这里 8192 代表 8GB,你可以改成 4096(4GB)或 16384(16GB)看情况调整。
- 关闭 Source Map
如果不需要调试 SourceMap,可以在 vue.config.js 中关闭:
module.exports = {
productionSourceMap: false
}
这样可以减少 .map 文件的生成,降低内存占用。
3. 开启 Webpack 持久化缓存
在 vue.config.js 里启用持久化缓存,提高二次打包速度,减少内存占用:
module.exports = {
configureWebpack: {
cache: {
type: 'filesystem', // 持久化缓存
}
}
}
- 减少 Webpack 处理的文件
(1)排除不必要的模块
可以通过 externals 让 Webpack 不打包某些库,改为 CDN 方式:
module.exports = {
configureWebpack: {
externals: {
vue: 'Vue',
'vue-router': 'VueRouter',
axios: 'axios'
}
}
}
这样 Webpack 就不会打包这些库,减少打包体积和内存占用。
(2)减少 Babel 转译的范围
在 babel.config.js 里排除 node_modules:
module.exports = {
presets: ['@vue/cli-plugin-babel/preset'],
ignore: ['node_modules']
}
- 启用 Webpack 多进程构建(thread-loader)
在 vue.config.js 里开启多线程:
module.exports = {
configureWebpack: {
module: {
rules: [
{
test: /\.js$/,
use: ['thread-loader', 'babel-loader'],
exclude: /node_modules/
}
]
}
}
}
这样可以利用多核 CPU,提高构建效率,减少单个进程的内存压力。
- 升级依赖,优化 Webpack
升级 Vue CLI、Webpack:旧版本的 Webpack 可能有性能问题,可以尝试升级 Vue CLI:
npm update -g @vue/cli
优化 Tree Shaking:确保 sideEffects 设置正确,避免无用代码进入打包:
"sideEffects": false
总结
如果 Vue 项目打包时内存不足,可以尝试:
- 增加 Node.js 内存限制(最有效)
- 关闭 Source Map
- 启用 Webpack 缓存
- 减少 Webpack 处理的文件
- 启用 Webpack 多进程
- 升级 Vue CLI 和 Webpack
- 这样可以显著降低打包时的内存占用,提高构建速度。