在现代前端开发中,前后端分离架构已成为主流模式。开发环境下,前端项目运行在本地服务器(如Vite默认的5173端口),而后端API通常部署在另一台服务器或不同端口上。这种跨域场景下,浏览器出于安全考虑会阻止前端直接发送请求到不同源的地址。
代理配置的核心价值在于:
在Vite项目中,我们通过修改vite.config.js文件中的server.proxy选项来实现代理功能。以下是完整配置示例及深度解析:
javascript复制export default defineConfig({
server: {
port: 8888, // 自定义开发服务器端口
host: true, // 允许局域网访问
proxy: {
'/dwapi/': { // 代理路径前缀
target: 'http://192.168.xx.xxx:xxxx', // 后端服务地址
changeOrigin: true, // 修改请求源
rewrite: (path) => path.replace(/^\/dwapi/, '') // 路径重写
}
}
}
})
关键配置项详解:
/dwapi/:匹配所有以/dwapi/开头的请求注意:实际项目中请将192.168.xx.xxx:xxxx替换为真实的后端服务地址。如果是HTTPS服务,需要将target改为https://开头。
在配置代理前,首先需要确认前端开发机与后端服务器的网络连通性。Windows系统下推荐使用以下方法:
打开命令提示符:
执行ping测试:
bash复制ping 192.168.xx.xxx
成功响应示例:
code复制正在 Ping 192.168.1.100 具有 32 字节的数据:
来自 192.168.1.100 的回复: 字节=32 时间=2ms TTL=64
来自 192.168.1.100 的回复: 字节=32 时间=1ms TTL=64
来自 192.168.1.100 的回复: 字节=32 时间=1ms TTL=64
来自 192.168.1.100 的回复: 字节=32 时间=2ms TTL=64
192.168.1.100 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 1ms,最长 = 2ms,平均 = 1ms
常见问题排查:
网络层连通后,还需要验证应用层端口是否可访问。由于现代Windows系统默认不启用Telnet客户端,需要先进行安装:
安装Telnet客户端:
执行端口测试:
bash复制telnet 192.168.xx.xxx 端口号
连接成功表现:
连接失败表现:
实操技巧:在团队协作中,建议将常用测试命令写入项目文档的"开发环境准备"章节,方便新成员快速上手。
即使配置看似正确,实际开发中仍可能遇到各种代理异常。以下是典型问题及解决方案:
404 Not Found
跨域问题依然存在
网络连接缓慢
现代浏览器提供的开发者工具是调试代理请求的利器:
网络面板使用要点:
控制台错误分析:
高级调试技巧:
实际项目通常需要区分开发、测试和生产环境。推荐以下配置方案:
环境变量方案:
javascript复制// vite.config.js
import { loadEnv } from 'vite'
export default ({ mode }) => {
const env = loadEnv(mode, process.cwd())
return defineConfig({
server: {
proxy: {
'/api': {
target: env.VITE_API_BASE_URL,
// ...其他配置
}
}
}
})
}
配置文件方案:
javascript复制// config/dev.js
export default {
apiBaseUrl: 'http://dev.example.com'
}
// vite.config.js
import devConfig from './config/dev'
export default defineConfig({
server: {
proxy: {
'/api': {
target: devConfig.apiBaseUrl
}
}
}
})
API文档协作:
Mock服务集成:
javascript复制import { defineConfig } from 'vite'
import { createProxyMiddleware } from 'http-proxy-middleware'
export default defineConfig({
server: {
setupMiddlewares: (middlewares) => {
middlewares.use(
'/api',
createProxyMiddleware({
target: 'http://localhost:3000',
changeOrigin: true,
onError: (err, req, res) => {
// 代理失败时返回mock数据
res.writeHead(200, { 'Content-Type': 'application/json' })
res.end(JSON.stringify({ code: 0, data: 'mock' }))
}
})
)
return middlewares
}
}
})
健康检查机制:
javascript复制// 在应用启动时检查后端可用性
fetch('/api/health')
.then(response => {
if (!response.ok) {
console.error('后端服务不可用')
}
})
.catch(error => {
console.error('网络连接异常:', error)
})
敏感信息保护:
请求验证:
javascript复制proxy: {
'/api': {
target: 'http://backend:3000',
bypass: (req) => {
// 验证请求合法性
if (!req.headers['x-auth-token']) {
return '/403'
}
}
}
}
连接池配置:
javascript复制const http = require('http')
const agent = new http.Agent({
keepAlive: true,
maxSockets: 20,
maxFreeSockets: 10
})
export default defineConfig({
server: {
proxy: {
'/api': {
target: 'http://backend:3000',
agent: agent
}
}
}
})
缓存策略:
javascript复制proxy: {
'/api': {
target: 'http://backend:3000',
onProxyRes: (proxyRes) => {
// 对静态资源设置缓存
if (proxyRes.req.path.includes('/static/')) {
proxyRes.headers['cache-control'] = 'public, max-age=31536000'
}
}
}
}
负载均衡示例:
javascript复制const targets = [
'http://backend1:3000',
'http://backend2:3000',
'http://backend3:3000'
]
export default defineConfig({
server: {
proxy: {
'/api': {
target: targets,
changeOrigin: true,
router: () => {
return targets[Math.floor(Math.random() * targets.length)]
}
}
}
}
})
在实际项目开发中,我发现代理配置的稳定性会直接影响开发体验。建议团队建立统一的代理配置规范,并将网络连通性检查纳入CI/CD流程的预检查步骤。对于大型项目,可以考虑使用API网关替代简单代理,获得更强大的流量管理能力。