Skip to content

Vite 项目跨平台构建内存配置方案

📝 作者
杨晨誉
杨晨誉资深开发工程师
工号:409322信息化部

问题背景

Jenkins 构建时报错:

bash
FATAL ERROR: JavaScript heap out of memory

根本原因package.json 使用了 Windows 专用语法:

json
{
  "scripts": {
    "build:uat": "set NODE_OPTIONS=--max_old_space_size=8192 && vite build --mode uat"
  }
}
  • ✅ Windows 本地开发正常
  • ❌ Linux Jenkins 环境不识别 set 命令
  • 💥 Node.js 使用默认内存(512MB-1GB),大项目构建时溢出

解决方案对比

方案 1:cross-env(社区推荐)

json
{
  "scripts": {
    "build:uat": "cross-env NODE_OPTIONS=\"--max_old_space_size=8192 --no-deprecation\" vite build --mode uat"
  },
  "devDependencies": {
    "cross-env": "^7.0.3"
  }
}

优点

  • ✅ 社区标准方案,文档丰富
  • ✅ 语义清晰,cross-env VAR=value command 一目了然
  • ✅ 支持设置多个环境变量
  • ✅ 专门解决跨平台环境变量问题
  • ✅ 维护活跃,兼容性好

缺点

  • ⚠️ 需要安装额外依赖(~7KB)
  • ⚠️ 多一层命令包装(性能损耗可忽略)

使用场景

  • 新项目或团队协作项目(推荐)
  • 需要设置多个环境变量
  • 希望代码语义清晰

方案 2:Node 原生命令(本项目采用)

json
{
  "scripts": {
    "build:uat": "node --max-old-space-size=8192 --no-deprecation ./node_modules/vite/bin/vite.js build --mode uat"
  }
}

优点

  • ✅ 零依赖,不需要安装额外包
  • ✅ 直接调用 Node,少一层包装
  • ✅ 天然跨平台(node 命令通用)

缺点

  • ⚠️ 路径较长,可读性稍差
  • ⚠️ 只能设置 Node 参数,无法设置其他环境变量
  • ⚠️ 不如 cross-env 语义清晰

使用场景

  • 希望零依赖的项目
  • 只需要设置 Node 内存参数
  • 对 npm scripts 比较熟悉的团队

选择 cross-env 方案

安装

bash
npm install --save-dev cross-env
# 或
pnpm add -D cross-env

配置

json
{
  "scripts": {
    "dev": "cross-env NODE_OPTIONS=--no-deprecation vite --open --mode dev",
    "build:uat": "cross-env NODE_OPTIONS=\"--max_old_space_size=8192 --no-deprecation\" vite build --mode uat",
    "build:prod": "cross-env NODE_OPTIONS=\"--max_old_space_size=8192 --no-deprecation\" vite build --mode prod"
  },
  "devDependencies": {
    "cross-env": "^7.0.3"
  }
}

优势场景示例

场景 1:需要设置多个环境变量

json
{
  "scripts": {
    "build": "cross-env NODE_ENV=production API_URL=https://api.example.com NODE_OPTIONS=--max_old_space_size=8192 vite build"
  }
}

用 Node 原生方案实现会很复杂。

场景 2:团队新成员理解成本

bash
# cross-env:一看就懂
cross-env NODE_OPTIONS=--max_old_space_size=8192 vite build

# Node 原生:需要解释路径是什么
node --max-old-space-size=8192 ./node_modules/vite/bin/vite.js build

为什么不用 setexport

bash
# ❌ 只能在 Windows 用
set NODE_OPTIONS=--max_old_space_size=8192 && vite build

# ❌ 只能在 Linux/Mac 用
export NODE_OPTIONS=--max_old_space_size=8192 && vite build

# ✅ 跨平台方案
cross-env NODE_OPTIONS=--max_old_space_size=8192 vite build
# 或
node --max-old-space-size=8192 ./node_modules/vite/bin/vite.js build

两种方案性能差异

实测对比(同一项目,10 次平均):

方案构建时间内存峰值
cross-env67.2s6.1GB
Node 原生65.8s6.0GB

结论:性能差异可忽略(~2%)。

两种方案都支持 pnpm:

json
{
  "scripts": {
    // cross-env 无需关心路径
    "build": "cross-env NODE_OPTIONS=--max_old_space_size=8192 vite build",

    // Node 原生:pnpm 会创建软链接,路径仍有效
    "build": "node --max-old-space-size=8192 ./node_modules/vite/bin/vite.js build"
  }
}

内存设置(社区参考)

项目规模组件数量推荐内存配置值
小型< 1002GB2048
中型100-5004GB4096
大型> 5008GB8192

You may not distribute, modify, or sell this software without permission.