前言
在本地开发时,你的接口请求可能是这样的:
axios.get('http://192.168.1.100:8080/api/users')
但部署到生产环境后,后端地址变成了:
https://api.example.com/api/users
如果你把 IP 和端口硬编码在代码里,那每次部署都要改代码------这显然是不可接受的。
同时,本地开发还会遇到另一个经典问题:
浏览器报跨域错误(CORS)
这两个问题,本质上都属于环境配置与构建工具的能力范畴。
在 Vue3 + Vite 体系中,它们有非常优雅的解决方案。
这一篇,我们把 .env环境变量、Vite Proxy 代理、多环境管理、部署注意事项 一次性讲透。
一、环境变量:让代码适应不同环境
1️⃣ Vite 的环境变量机制
Vite 使用 **import.meta.env** 来暴露环境变量:
console.log(import.meta.env.VITE_API_BASE_URL)
📌 核心规则:
只有
VITE_开头的变量才会暴露到客户端代码中。
2️⃣ 创建环境文件
在项目根目录下创建:
.env # 所有环境共用
.env.development # 开发环境
.env.production # 生产环境
.env.staging # 预发布环境(可选)
3️⃣ 文件内容示例
# .env.development
VITE_API_BASE_URL=/api
VITE_APP_TITLE=Vue3 Demo (Dev)
VITE_UPLOAD_LIMIT=10
# .env.production
VITE_API_BASE_URL=https://api.example.com
VITE_APP_TITLE=Vue3 Demo
VITE_UPLOAD_LIMIT=50
4️⃣ 在代码中使用
// utils/request.ts
const request = axios.create({
baseURL: import.meta.env.VITE_API_BASE_URL,
timeout: 10000
})
<script setup>
console.log(import.meta.env.VITE_APP_TITLE)
</script>
5️⃣ TypeScript 类型提示(进阶)
// env.d.ts
interface ImportMetaEnv {
readonly VITE_API_BASE_URL: string
readonly VITE_APP_TITLE: string
readonly VITE_UPLOAD_LIMIT: string
}
interface ImportMeta {
readonly env: ImportMetaEnv
}
✅ IDE 自动补全 + 类型校验
二、模式(Mode)与环境切换
1️⃣ Vite 的默认模式
| 命令 | 默认模式 | 加载文件 |
|---|---|---|
vite dev |
development |
.env.development |
vite build |
production |
.env.production |
2️⃣ 自定义模式
// package.json
{
"scripts": {
"dev": "vite --mode development",
"build:staging": "vite build --mode staging",
"build": "vite build --mode production"
}
}
📌 --mode决定加载哪个 .env文件
三、跨域问题:为什么本地开发会跨域?
1️⃣ 跨域的本质
浏览器出于安全考虑,阻止了:
前端:http://localhost:5173
后端:http://192.168.1.100:8080
❌ 协议 / 域名 / 端口 任一不同,就是跨域
2️⃣ 常见解决方案对比
| 方案 | 适用场景 | 说明 |
|---|---|---|
| CORS(后端配置) | 生产环境 | 后端加响应头 |
| JSONP | 老旧系统 | 只支持 GET |
| Nginx 反向代理 | 生产环境 | 运维配置 |
| Vite Proxy | 开发环境 | ✅ 前端自行解决 |
📌 开发环境用 Vite Proxy,生产环境用 Nginx 或 CORS
四、Vite Proxy 代理配置(重点)
1️⃣ 基础配置
// vite.config.ts
export default defineConfig({
server: {
proxy: {
'/api': {
target: 'http://192.168.1.100:8080',
changeOrigin: true
}
}
}
})
📌 效果:
-
前端请求
/api/users -
Vite 转发到
http://192.168.1.100:8080/api/users -
浏览器只和 localhost 通信,不存在跨域
2️⃣ 路径重写
proxy: {
'/api': {
target: 'http://192.168.1.100:8080',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
}
}
📌 请求 /api/users→ 转发到 http://.../users
3️⃣ 多个代理目标
proxy: {
'/api': {
target: 'http://backend:8080',
changeOrigin: true
},
'/upload': {
target: 'http://file-server:9000',
changeOrigin: true
}
}
4️⃣ WebSocket 代理
proxy: {
'/ws': {
target: 'ws://localhost:3000',
ws: true,
changeOrigin: true
}
}
五、生产环境的跨域处理
1️⃣ Nginx 反向代理(推荐 ✅)
server {
listen 80;
server_name example.com;
location / {
root /var/www/dist;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://backend:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
📌 前端和后端在同一域名下,不存在跨域
2️⃣ 后端 CORS 配置
// Node.js / Express 示例
app.use(cors({
origin: ['https://example.com'],
credentials: true
}))
六、环境变量安全注意事项
⚠️ 重要:前端环境变量是公开的
VITE_API_BASE_URL=https://api.example.com # ✅ 公开,没问题
VITE_SECRET_KEY=abc123 # ❌ 密钥不能放前端!
📌 前端代码中不能放任何敏感信息:
-
数据库密码
-
JWT 签名密钥
-
私钥
✅ 敏感信息只能放在后端
七、部署时的常见问题
❌ 问题 1:刷新页面 404
原因 :SPA 的路由是前端控制的,服务器不认识 /user这个路径
解决 :Nginx 配置 try_files
location / {
try_files $uri $uri/ /index.html;
}
❌ 问题 2:API 请求打到前端服务器
原因 :生产环境 baseURL配成了相对路径 /api,但没有代理
解决:生产环境用绝对路径 或 Nginx 代理
❌ 问题 3:环境变量不生效
原因 :变量名没有 VITE_前缀
解决 :检查 .env文件和变量名
八、完整的 vite.config.ts 示例
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
export default defineConfig(({ mode }) => {
// 加载对应模式的环境变量
const env = loadEnv(mode, process.cwd())
return {
plugins: [vue()],
resolve: {
alias: {
'@': path.resolve(__dirname, 'src')
}
},
server: {
port: 5173,
open: true,
proxy: {
'/api': {
target: env.VITE_PROXY_TARGET || 'http://localhost:8080',
changeOrigin: true,
rewrite: (p) => p.replace(/^\/api/, '')
}
}
},
build: {
outDir: 'dist',
sourcemap: mode !== 'production',
rollupOptions: {
output: {
chunkFileNames: 'assets/js/[name]-[hash].js',
entryFileNames: 'assets/js/[name]-[hash].js',
assetFileNames: 'assets/[ext]/[name]-[hash].[ext]'
}
}
}
}
})
九、面试高频问答
Q1:Vite 中环境变量为什么必须以 VITE_ 开头?
防止意外将敏感环境变量暴露到客户端代码中。
Q2:Vite Proxy 在生产环境能用吗?
不能,Vite Proxy 只在开发服务器生效,生产环境用 Nginx。
Q3:SPA 部署后刷新 404 怎么解决?
服务器配置 fallback 到 index.html(Nginx 的 try_files)。
十、总结(架构级)
-
.env文件管理不同环境的配置 -
VITE_前缀控制变量暴露 -
Vite Proxy 解决开发环境跨域
-
生产环境用 Nginx 反向代理
-
前端环境变量是公开的,不能放敏感信息
📢 下期预告
👉 第 21 篇:Vue3 性能优化九大策略