React 项目中常见的跨域问题及解决方案

在使用 React 进行前端开发时,调用后端接口往往会遇到 跨域问题。这是前端开发中一个非常常见但又容易让初学者困惑的问题。本文将从跨域的基本原理讲起,结合 React 项目的实际开发,讲解如何优雅地解决跨域问题。
一、什么是跨域?
“跨域”是指浏览器出于安全策略(同源策略 Same-Origin Policy)的限制,阻止一个网页去请求另一个“源”的资源。
所谓“源”指的是:协议、域名、端口。
只要其中一个不同,就算是跨域。例如:
- ✅ http://localhost:3000向 http://localhost:3000请求 —— 同源
- ❌ http://localhost:3000向 http://api.example.com请求 —— 跨域
- ❌ http://localhost:3000向 https://localhost:3000请求 —— 跨域(协议不同)
- ❌ http://localhost:3000向 http://localhost:5000请求 —— 跨域(端口不同)
二、React 项目中的跨域场景
React 开发环境通常使用 create-react-app脚手架,该脚手架会在 localhost:3000启动一个开发服务器。
如果你的 API 接口部署在另一个地址,比如:

fetch('http://localhost:5000/api/user')
浏览器就会报类似下面的错误:

Access to fetch at 'http://localhost:5000/api/user' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
这说明前端请求被浏览器拦截了,产生了跨域错误。
三、解决方案:使用本地代理(推荐)
在 React 项目中,我们推荐使用 代理转发(proxy)的方式解决跨域问题。
1. 配置方法
方法一:使用 vite(推荐现代项目)
在 vite.config.js中添加:
export default {
  server: {
    proxy: {
      '/api': {
        target: 'http://localhost:5000',
        changeOrigin: true,
        rewrite: path => path.replace(/^\/api/, '')
      }
    }
  }
}
请求写法:
fetch('/api/user')  // 实际会代理到 http://localhost:5000/user
方法二:使用 create-react-app
在项目根目录下创建 setupProxy.js文件(适用于 react-scripts):
npm install http-proxy-middleware --save
// src/setupProxy.js
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function(app) {
  app.use(
    '/api',
    createProxyMiddleware({
      target: 'http://localhost:5000',
      changeOrigin: true,
      pathRewrite: {
        '^/api': ''
      }
    })
  );
};
此时你可以在前端发请求如下:
fetch('/api/user')
代理服务器会将请求自动转发到后端地址 http://localhost:5000/user,浏览器认为是本地访问,从而不会报跨域错误。
四、后端支持 CORS(跨域资源共享)
如果你无法使用代理(比如项目已部署上线),需要让后端支持 CORS。
以 Node.js/Express 为例:
npm install cors
const express = require('express');
const cors = require('cors');
const app = express();
app.use(cors());
app.get('/user', (req, res) => {
  res.json({ name: '张三' });
});
后端添加 Access-Control-Allow-Origin等响应头后,浏览器就能正常接收响应。
五、其他跨域解决方式(了解)
#牛客创作赏金赛##简历中的项目经历要怎么写#
全部评论

相关推荐

1. markdown渲染自己如何实现,说一下思路2. 主题切换是如何实现的3. 切换时的localStorage持久化配置是干什么的4. 如果是动态的切换,根据时区去切换主题应该怎么实现(取Date.now())5. 如果一直在这个页面上,那在切换的边界时间点,不进行刷新,如何去切换主题(设置监听,或者到时间服务器推送一个数据然后去切换)6. 有两个网址,一个主站,一个子站,主站变了主题如何将子站的主题也切换(用跨标签的通信方式)7. 如果不用跨标签通信呢?(面试官说用cookie)8. 你觉得Pinia的优点在哪,在项目中带给你觉得特别好的东西?(回答了组件间状态同步,面试官说这些localstorage也可以实现,又回答了composition api)9. 说一下原型,闭包,事件循环10. 说一下宏任务有哪些,微任务有哪些11. 基于axios实现一个类似中间件的请求方法,比如说有一个axios的封装,这个封装可以热插拔或者是基于插件的形式,能够针对黑产进行处理,或者对其他刷网站的行为进行处理,如何分别实现这两个插件和一个共同对这两个行为限制的插件12. 说一下图片懒加载是怎么优化的13. 还有其他实现图片懒加载的方式吗14. 怎么确定图片是有性能上的问题的15. 在开发中关注过哪些优化的指标16. 手撕一个拖拽dom的场景题
投递哔哩哔哩等公司6个岗位
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务