同事说项目里配了 js proxy,结果你打开代码看到的是 new Proxy(),两边说的根本不是一回事。前端语境里这个词有两种:一种是 JavaScript 语言自带的代理对象,另一种是开发服务器把请求转发给后端。

语言里的 Proxy:拦对象操作

new Proxy(target, handler) 包住一个对象,读属性走 get,写属性走 set,还能拦 deleteProperty、has 这些操作。常见用途是表单校验、给对象加默认值、做响应式数据的依赖收集,Vue 3 的响应式底层就是它。浏览器控制台里就能试,改完刷新页面就还原,不会污染代码。

const user = new Proxy({}, { set(obj, key, val) { if (key === 'age' && val < 0) throw new Error('年龄不能为负'); obj[key] = val; return true; } });

注意 set 陷阱要返回 true,不然严格模式下会报 TypeError。嵌套对象默认不会被代理,需要递归包一层,或者干脆用现成的响应式库。反射调用记得用 Reflect,别在 handler 里直接操作 target,容易绕晕。

开发服务器里的 proxy:解决跨域

Vite 在 vite.config.js 里写 server.proxy,webpack devServer 用 proxy 字段,把 /api 开头的请求转到 http://localhost:8080,浏览器就当成同源请求,跨域问题绕过去了。这只在开发环境有效,上线还得靠后端配 CORS 或 Nginx 反代。线上用 Nginx 反代时,记得把 Host 头和真实 IP 传过去,不然后端日志全是代理地址。

配置时注意 path rewrite,后端没有 /api 前缀就要把它去掉,否则 404。改完重启 dev server,热更新不会重载代理配置。

判断用哪种:操作对象用语言内置的 Proxy,调接口跨域用构建工具的 proxy。名字一样,js proxy 这个词在不同群里指的东西也不一样,问清楚再答。