引言
把 Vite 项目从「本地跑通」推到「生产稳跑」,绕不开三个工程问题:① 环境变量怎么按环境切分(开发/测试/生产/灰度)② 构建模式与 base 路径怎么配(子路径部署、CDN)③ 产物怎么优化(体积、加载、缓存)。本文以这三个问题为主线,讲透 import.meta.env 的完整体系、.env 文件与模式、vite build 的模式差异、sourcemap 与产物分析,最后给出一套可落地的生产构建最佳实践清单。
前置:/vite-config-guide/(配置与构建)、/vite-build-optimization/(构建优化)。部署见 [[infra]]、[[devops]]。
目录
- 1. import.meta.env 全览:内置变量
- 2. .env 文件与模式:按环境切分
- 3. 自定义环境变量与类型提示
- 4. 构建模式:dev / build / preview
- 5. base 路径与子路径部署
- 6. 生产构建优化清单
- 7. Sourcemap 策略
- 8. 产物分析与体积控制
- 9. CDN 与缓存策略
- 10. 最佳实践清单与速查表
- 延伸阅读
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
三个核心命令对应不同模式:
| 命令 | 模式 | 用途 |
|---|---|---|
vite | development | 开发服务器 |
vite build | production | 生产构建 |
vite preview | production | 本地预览产物 |
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.js | immutable 1年 |
| assets/*.hash.css | immutable 1年 |
| index.html | no-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 流水线
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。