在 code-server 中正确调试 React(react-scripts)解决办法
背景问题
在 code-server 中运行 React(使用 react-scripts)时,浏览器访问路径通常是:
/proxy/<port>/
但 React 的静态资源(bundle.js、CSS、HMR WebSocket)实际需要从:
/absproxy/<port>/
加载。
如果路径不一致,会导致:
bundle.js返回 HTML →Unexpected token '<'- 静态资源全部 404
- HMR(热更新)无法连接
- 页面空白
解决方案
1. 创建或修改 .env.development
| |
注意:
/proxy/3003/是浏览器看到的路径,/absproxy/3003/才是 React 静态资源必须使用的真实路径。
2. 启动 React
| |
3. 浏览器访问
https://你的域名/proxy/3003/
code-server 会自动将其映射到:
/absproxy/3003/
React 的资源路径也会自动正确。
原理说明
React 默认生成的资源路径是:
/static/js/bundle.js
但 code-server 的代理路径是:
/absproxy/3003/static/js/bundle.js
如果不设置 PUBLIC_URL,React 会继续请求根路径 /static/...,导致:
- bundle.js → 404
- 返回 HTML →
Unexpected token '<' - HMR WebSocket 连接失败
设置:
PUBLIC_URL=/absproxy/3003/
WDS_SOCKET_PATH=/absproxy/3003/ws
后,React 会自动生成正确路径。
官方文档参考
code-server 官方文档(Proxying / absproxy):
https://coder.com/docs/code-server/latest/guide#proxying
文档说明:前端开发工具必须使用 /absproxy/<port>/ 才能正确加载资源。
总结
| 项目 | 错误路径 | 正确路径 |
|---|---|---|
| 静态资源 | /proxy/3003/static/... | /absproxy/3003/static/... |
| WebSocket | /proxy/3003/ws | /absproxy/3003/ws |
| 浏览器访问 | /absproxy/3003/(不直接访问) | /proxy/3003/(code-server 自动映射) |
最终只需要修改 .env.development或者.env.development.local 即可解决所有问题。