Vite 环境变量与生产构建最佳实践:import.meta.env、构建模式与产物优化

Vite 生产构建最佳实践:import.meta.env 环境变量体系(.env 文件/模式/替换)、构建模式与 base 路径、Sourcemap 策略、产物优化(压缩/代码分割/动态导入)、CDN 与 gzip、部署配置。

引言

把 Vite 项目从「本地跑通」推到「生产稳跑」,绕不开三个工程问题:① 环境变量怎么按环境切分(开发/测试/生产/灰度)② 构建模式与 base 路径怎么配(子路径部署、CDN)③ 产物怎么优化(体积、加载、缓存)。本文以这三个问题为主线,讲透 import.meta.env 的完整体系、.env 文件与模式、vite build 的模式差异、sourcemap 与产物分析,最后给出一套可落地的生产构建最佳实践清单。

前置:/vite-config-guide/(配置与构建)、/vite-build-optimization/(构建优化)。部署见 [[infra]]、[[devops]]。


目录


1. import.meta.env 全览:内置变量

Vite 把环境信息注入 import.meta.env:

console.log(import.meta.env.MODE)          // 当前模式:development / production
console.log(import.meta.env.DEV)           // 是否开发模式(boolean)
console.log(import.meta.env.PROD)          // 是否生产模式(boolean)
console.log(import.meta.env.BASE_URL)      // base 路径(默认 '/')
console.log(import.meta.env.SSR)           // 是否 SSR

内置变量表:

变量说明典型值
MODE当前运行模式development / production
DEV是否开发模式true / false
PROD是否生产模式false / true
BASE_URL部署基础路径/ / /app/
SSR是否服务端渲染false

心智:import.meta.env 是编译期常量替换——不是运行时读取,而是构建时把 import.meta.env.XXX 直接替换成字面量,所以不能解构(const { DEV } = import.meta.env 会失效)。


2. .env 文件与模式:按环境切分

Vite 按「模式 + 优先级」加载 .env 文件:

.env                # 所有环境
.env.local          # 本地(不进版本库)
.env.[mode]         # 指定模式(如 .env.production)
.env.[mode].local   # 指定模式本地

优先级(高 → 低):
.env.production.local > .env.production > .env.local > .env

示例:

# .env
VITE_APP_NAME=plume-app
# .env.development
VITE_API_BASE=http://localhost:3000
# .env.production
VITE_API_BASE=https://api.plume.dev
VITE_SENTRY_DSN=https://xxx@sentry.io/1

自定义模式(比如 staging):

# .env.staging
VITE_API_BASE=https://staging-api.plume.dev

# 构建命令
vite build --mode staging     # 只加载 .env + .env.staging

关键规则:

规则说明
只暴露 VITE_ 前缀其他变量不进客户端代码
服务端变量不暴露API_KEY 之类只在服务端
非 VITE_ 可用vite.config.ts / 服务端代码里用

铁律:只有 VITE_ 前缀的变量会进客户端 bundle——密钥(API_KEY、token)绝不能放 VITE_ 变量,否则打进包里等于公开。


3. 自定义环境变量与类型提示

定义并类型化自定义变量:

// env.d.ts
interface ImportMetaEnv {
  readonly VITE_API_BASE: string
  readonly VITE_SENTRY_DSN?: string
  readonly VITE_ENABLE_MOCK?: 'true' | 'false'
}
interface ImportMeta {
  readonly env: ImportMetaEnv
}

在代码中使用:

const apiBase = import.meta.env.VITE_API_BASE ?? 'http://localhost:3000'
const enableMock = import.meta.env.VITE_ENABLE_MOCK === 'true'

编译期替换举例:

// 源码
if (import.meta.env.DEV) {
  console.log('debug 面板')
}
// 生产构建后 → 整段被删除(DEV 替换为 false + 死代码消除)

记忆:VITE_ 变量 + env.d.ts 类型声明 = 安全且可维护的环境配置——类型提示避免拼写错误,VITE_ 前缀防止密钥泄漏。


4. 构建模式:dev / build / preview

三个核心命令对应不同模式:

命令模式用途
vitedevelopment开发服务器
vite buildproduction生产构建
vite previewproduction本地预览产物

build 前 clean 输出目录:

export default defineConfig({
  build: {
    outDir: 'dist',              // 产物目录
    emptyOutDir: true,           // 清空旧产物(默认 true)
    sourcemap: 'hidden',         // sourcemap 策略(见第 7 节)
  },
})

构建产物结构:

dist/
  index.html
  assets/
    index-3f4k2a.js        # 入口 chunk(带 hash)
    vendor-8d7f2c.js       # 依赖 chunk
    index-1a2b3c.css

记忆:vite build 用 production 模式并执行 Rollup 打包——产物带内容 hash,支持长期缓存。


5. base 路径与子路径部署

部署到子路径(如 /app/ 或 CDN 子目录)时必须配置 base:

export default defineConfig({
  base: '/app/',            // 所有资源 URL 前缀
  // 或 CDN:base: 'https://cdn.plume.dev/app/'
})

base 的影响:

默认 '/':  <script src="/assets/index.js">
base '/app/':<script src="/app/assets/index.js">

动态 base(运行时感知):Vite 5+ 支持 import.meta.env.BASE_URL 运行时拼接(构建时用相对路径)。

base 配置要点:

场景base 值
根路径部署/
子路径/app/
CDN 前缀完整 URL
相对部署./(避免)

记忆:base 决定所有资源 URL 的公共前缀——子路径部署忘配 base,资源全部 404。


6. 生产构建优化清单

构建优化(配合 /vite-build-optimization/):

export default defineConfig({
  build: {
    target: 'es2018',                // 浏览器目标(平衡兼容与体积)
    cssCodeSplit: true,              // CSS 按 chunk 拆
    minify: 'esbuild',               // 压缩器(esbuild 快 / terser 更小)
    rollupOptions: {
      output: {
        manualChunks: {
          vendor: ['react', 'react-dom'],   // 手动分 vendor
        },
      },
    },
    reportCompressedSize: true,      // 报告 gzip 尺寸
  },
})

加载优化清单:

手段效果
动态导入路由级代码分割
preload/prefetch关键资源预加载
CSS 拆包非首屏样式延迟
压缩(gzip/brotli)传输体积 -70%
图片压缩静态资源瘦身
字体子集化字体体积

记忆:生产优化 = 压缩 + 代码分割 + 预加载 + 压缩传输——先看产物报告,按体积大头逐个击破。


7. Sourcemap 策略

sourcemap 的取舍:

配置说明适用
false不产出极简部署
true产出 .map 文件调试/内网
'hidden'产出但不暴露生产 + 出错时手动挂载
'inline'内联到 bundle单文件场景
export default defineConfig({
  build: {
    sourcemap: 'hidden',   // 生产推荐:保留映射但不在源码引用
  },
})

实践建议:

生产环境:sourcemap: 'hidden'(不暴露源码,但出错时可配合 Sentry 上传)
监控接入:把 .map 上传到错误监控平台,只保留服务端

记忆:生产暴露 sourcemap = 源码裸奔——用 'hidden' 保留排错能力又不直接泄露。


8. 产物分析与体积控制

分析产物体积:

npm i -D rollup-plugin-visualizer
# 构建时生成可视化报告
vite build && npx vite-bundle-visualizer
# 或使用 --report 参数(vite 6+):vite build --report

体积控制手段:

1. 动态导入拆分大库(echarts、antd 按需)
2. 排查未使用依赖(unimported 检测)
3. 替换大库(moment → dayjs)
4. gzip/brotli 压缩
5. 移除重复依赖(resolve.dedupe)

体积基线参考:

指标健康值
首屏 JS(gzip)< 200KB
初始请求< 8 个
总包(gzip)< 500KB

记忆:体积控制看「首屏 gzip JS」而不是总大小——路由懒加载后首屏才是关键路径。


9. CDN 与缓存策略

产物部署到 CDN 的缓存策略:

带 hash 的资源(index-xxx.js):Cache-Control: immutable(永久缓存)
index.html:Cache-Control: no-cache(实时回源,确保引到新 hash)

Vite 产物天然适合 CDN:

// 构建配置配合 CDN
export default defineConfig({
  base: 'https://cdn.plume.dev/',
})

部署流程示例(Nginx/对象存储):

# 构建
vite build
# 上传 dist/ 到 CDN / 对象存储
aws s3 sync dist/ s3://bucket/app --delete
# 或 Vercel/Netlify:根目录 dist,框架预设 vite
缓存对象策略
assets/*.hash.jsimmutable 1年
assets/*.hash.cssimmutable 1年
index.htmlno-cache
图片(无 hash)短缓存 + 协商

记忆:hash 资源永久缓存 + html 不缓存 = 更新的铁律——CDN 上线「永不手动刷新」靠的就是这套。


10. 最佳实践清单与速查表

生产构建最佳实践清单:

✅ VITE_ 前缀隔离密钥,密钥只留服务端
✅ env.d.ts 给自定义变量类型
✅ .env.[mode] 按环境切分,生产用 production 模式
✅ base 配置子路径/CDN
✅ sourcemap: 'hidden' + 监控平台上传
✅ 路由动态导入 + vendor 手动分 chunk
✅ gzip/brotli 压缩 + 带 hash 资源 immutable 缓存
✅ 产物分析确认首屏 < 200KB gzip
✅ 部署前 preview 本地验证

速查表:

需求做法
按环境切变量.env.[mode] + --mode staging
读环境变量import.meta.env.VITE_XXX
类型提示env.d.ts 的 ImportMetaEnv
子路径部署base: '/app/'
生产调试sourcemap: 'hidden'
体积报告vite build --report / visualizer
资源缓存hash 资源 immutable + html no-cache
本地验证vite preview

一句话记忆:环境变量用 VITE_ 前缀按模式切分、密钥绝不进 bundle;base 管子路径、sourcemap 用 hidden;产物压缩 + 路由懒加载 + vendor 分块,hash 资源永久缓存、html 实时回源——一套清单吃透生产构建。


延伸阅读

  • /vite-config-guide/ — build/env 配置全参数
  • /vite-build-optimization/ — chunk 策略与 Tree Shaking
  • /vite-ssr-frameworks/ — SSR 环境变量与部署
  • [[infra]] — 部署与 CDN 基础设施
  • [[devops]] — CI/CD 流水线

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「vite」更多文章

  1. Vite 静态资源与媒体资产处理:图片、字体、SVG 与 Worker
  2. Vite 浏览器兼容与 Legacy 构建:build.target、Polyfill 与兼容插件
  3. Vite 测试实战:Vitest 单元测试、组件测试与 E2E 测试