🌐 一句话总结
Vite 的代理是在开发服务器层做的,它拦截浏览器发给 Vite 的请求,转发给真正的后端服务,只在 vite dev 时生效,生产环境不生效。
核心机制
通过 http-proxy 库实现 HTTP、HTTPS、WebSocket 代理
跨域解决
开发环境完美解决前端跨域问题
性能优化
开发服务器层面代理,性能开销小
精准控制
支持路径重写、请求头修改等高级功能
🔧 实现方式
1. 核心依赖:http-proxy
Vite 内部使用了 http-proxy 这个库(由 Node.js 编写),它是一个强大的 HTTP 代理中间件。
HTTP/HTTPS
支持标准 HTTP 和 HTTPS 协议
请求修改
支持修改请求/响应头
路径重写
灵活的路径重写功能
🔄 请求流程(开发环境)
浏览器
发送请求
↓
发送请求
/api/usersVite 开发服务器
(localhost:3000)
检查 proxy 配置
↓
(localhost:3000)
检查 proxy 配置
使用 http-proxy
转发请求
↓
转发请求
后端服务器
(http://localhost:3001)
返回数据
↓
(http://localhost:3001)
返回数据
Vite 服务器
返回给浏览器
返回给浏览器
✅ 浏览器看到的是:
http://localhost:3000/api/users
✅ 实际请求的是:
http://localhost:3001/api/users
⚙️ 配置方式
配置文件:vite.config.js
// vite.config.js
export default {
server: {
proxy: {
// 代理 /api 开头的请求
'/api': {
target: 'http://localhost:3000', // 后端地址
changeOrigin: true, // 修改请求头中的 origin
rewrite: (path) => path.replace(/^\/api/, ''), // 重写路径
},
// 代理 WebSocket
'/ws': {
target: 'ws://localhost:8080',
ws: true,
}
}
}
}
✅ 常见配置项说明
| 配置项 | 作用 |
|---|---|
target |
代理的目标地址(后端服务) |
changeOrigin |
是否修改请求头中的 host 字段(通常设为 true) |
rewrite |
重写路径,比如去掉 /api 前缀 |
secure |
是否验证 HTTPS 证书(设为 false 可忽略证书错误) |
ws |
是否代理 WebSocket |
🌰 实际例子
假设你前端在 http://localhost:3000,后端在 http://localhost:5000
// vite.config.js
export default defineConfig({
server: {
proxy: {
'/api': {
target: 'http://localhost:5000',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '/v1') // /api/users → /v1/users
},
'/upload': {
target: 'http://upload-server.com',
changeOrigin: true,
secure: false, // 忽略 HTTPS 证书验证
}
}
}
})
请求 /api/users
被代理到 http://localhost:5000/v1/users
请求 /upload/file
被代理到 http://upload-server.com/upload/file
⚠️ 注意事项
⚠️ 只在开发时生效
- 生产环境(vite build)不会代理
- 生产环境需要用 Nginx、Caddy 等反向代理
⚠️ 路径匹配规则
- 路径匹配是前缀匹配
- /api 会匹配 /api, /api/users, /api/v1/...
⚠️ 功能限制
- 不支持复杂的路由逻辑
- 如果需要复杂代理,建议直接用 Nginx 或写自定义中间件
⚠️ WebSocket 配置
- WebSocket 代理要显式开启
- 需要设置
ws: true
✅ 总结对比
| 问题 | 回答 |
|---|---|
| Vite 代理是通过什么实现的? | http-proxy(Node.js 库) |
| 配置在哪? | vite.config.js 的 server.proxy |
| 生产环境有效吗? | ❌ 只在 vite dev 时生效 |
| 能解决跨域吗? | ✅ 是开发时解决跨域的主要方式 |
| 支持 WebSocket 吗? | ✅ 设置 ws: true 即可 |