在 React 项目中,如果你要通过 JSONP 的方式避免跨域(尤其是在后端不支持 CORS 的老系统中),可以参考以下完整做法。


🧠 背景说明:为什么使用 JSONP?

浏览器的 跨域限制(同源策略) 会阻止你直接用 fetchaxios 请求跨域 API,但 <script> 标签没有跨域限制。

JSONP 的原理就是动态插入 <script> 标签,利用 script 能跨域的特性加载远程返回的 JS 文件,并在里面调用你页面上注册好的全局函数。


✅ React 中使用 JSONP 的方法

✅ 方法一:使用封装好的库(推荐)

可以使用 jsonp 库(轻量、好用):

🔧 1. 安装 jsonp

npm install jsonp

🔧 2. 使用示例

import jsonp from 'jsonp';
 
function getData() {
  jsonp('https://example.com/api/data?callback=callbackFn', null, (err, data) => {
    if (err) {
      console.error('JSONP 请求失败:', err);
    } else {
      console.log('JSONP 返回数据:', data);
    }
  });
}

✅ 在 React 中你可以放在 useEffect、点击事件中等任何地方使用。


✅ 方法二:手动实现 JSONP(学习原理)

如果不想用第三方库,也可以自己实现:

function jsonpRequest(url, callbackName) {
  return new Promise((resolve, reject) => {
    const script = document.createElement('script');
    const callbackFn = `jsonp_cb_${Date.now()}`;
 
    window[callbackFn] = (data) => {
      resolve(data);
      document.body.removeChild(script);
      delete window[callbackFn];
    };
 
    script.src = `${url}${url.includes('?') ? '&' : '?'}${callbackName}=${callbackFn}`;
    script.onerror = reject;
 
    document.body.appendChild(script);
  });
}
 
// 用法:
jsonpRequest('https://example.com/api/data', 'callback')
  .then((res) => {
    console.log('返回数据:', res);
  })
  .catch((err) => {
    console.error('JSONP 请求失败', err);
  });

⚠️ 使用 JSONP 的注意事项

限制描述
✅ 只能是 GET 请求因为 script 标签无法发起 POST 等请求
✅ 服务器必须支持 JSONP后端必须返回一段 JS,如:callbackFn({ data })
⚠️ 安全风险不建议对不可信域名使用 JSONP,可能被注入恶意脚本
❌ 不支持复杂请求头、认证等无法传 Token、Header 等,适用场景有限

✅ React 项目中 JSONP 使用场景举例

  • 请求旧系统、第三方广告接口、股票接口等(如新浪、百度金融 API)

  • 你没法控制后端,又需要跨域获取数据

  • 不适合用于登录、支付、权限等安全敏感数据


✅ 总结

做法说明
使用 jsonp推荐、最简单
自己动态插 <script>可学原理,但不推荐重复造轮子
React 中使用方式useEffect、点击事件、请求封装中都可调用