nextjs+react接口会请求两次?

解决 Next.js + React 接口重复请求问题

在 Next.js 应用中,你可能会遇到 API 请求被发送两次的情况。以下是常见原因和解决方案:

1. 开发模式下 StrictMode 的影响

原因

Next.js 默认启用 React 的 StrictMode,在开发环境下会故意渲染两次组件以帮助发现潜在问题。

解决方案

jsx 复制代码
// next.config.js
module.exports = {
  reactStrictMode: false, // 关闭严格模式
}

或者仅在生产环境构建时保留:

jsx 复制代码
// next.config.js
module.exports = {
  reactStrictMode: process.env.NODE_ENV === 'production',
}

2. useEffect 依赖项问题

错误示例

jsx 复制代码
useEffect(() => {
  fetch('/api/data'); // 会触发多次
});

正确做法

jsx 复制代码
useEffect(() => {
  const fetchData = async () => {
    const res = await fetch('/api/data');
    const data = await res.json();
    // 处理数据
  };

  fetchData();
}, []); // 空依赖数组确保只运行一次

3. 页面渲染和预取导致的重复请求

原因

Next.js 会自动预取页面链接,可能导致 API 被调用多次。

解决方案

jsx 复制代码
// 禁用特定链接的预取
<Link href="/some-page" prefetch={false}>
  不预取的链接
</Link>

4. 自定义 App 中的重复初始化

错误示例

jsx 复制代码
// _app.js
function MyApp({ Component, pageProps }) {
  fetch('/api/init'); // 会在每次路由变化时调用
  
  return <Component {...pageProps} />;
}

正确做法

jsx 复制代码
// _app.js
function MyApp({ Component, pageProps }) {
  useEffect(() => {
    fetch('/api/init');
  }, []); // 只运行一次

  return <Component {...pageProps} />;
}

5. API 路由缓存策略

在 API 路由中添加缓存头可以减少重复请求的影响:

js 复制代码
// pages/api/data.js
export default function handler(req, res) {
  res.setHeader('Cache-Control', 's-maxage=10, stale-while-revalidate=59');
  res.status(200).json({ data: 'your data' });
}

6. 使用请求去重库

安装 axios 并使用请求拦截器:

bash 复制代码
npm install axios
js 复制代码
import axios from 'axios';

const api = axios.create();
const pendingRequests = new Map();

api.interceptors.request.use(config => {
  const requestId = `${config.method}-${config.url}`;
  if (pendingRequests.has(requestId)) {
    return Promise.reject(new Error('Duplicate request'));
  }
  pendingRequests.set(requestId, true);
  config.requestId = requestId;
  return config;
});

api.interceptors.response.use(response => {
  const requestId = response.config.requestId;
  pendingRequests.delete(requestId);
  return response;
});

7. 检查浏览器插件

某些浏览器插件(如 React Developer Tools、Redux DevTools)可能会导致额外的请求,尝试在无痕模式下测试。

验证解决方案

  1. 检查网络请求是否仍然重复
  2. 确认只在生产环境下保留 StrictMode
  3. 确保所有 useEffect 都有正确的依赖数组

通过这些方法,你应该能够有效减少或消除 Next.js 应用中的重复 API 请求问题。

相关推荐
范小多几秒前
24小时学会Python Visual code +Python Playwright通过谷歌浏览器取控件元素(连载、十一)
服务器·前端·python
ooolmf几秒前
matlab2024读取温度01
java·前端·javascript
打工人小夏2 分钟前
前端vue3项目使用nprogress动画组件,实现页面加载动画
前端
一颗宁檬不酸4 分钟前
前端农业商城中产品产地溯源功能的实现
前端
李少兄11 分钟前
深入理解前端中的透视(Perspective)
前端·css
江公望21 分钟前
HTML5 History 模式 5分钟讲清楚
前端·html·html5
云和数据.ChenGuang27 分钟前
Zabbix Web 界面安装时**无法自动创建配置文件 `zabbix.conf.php`** 的问题
前端·zabbix·运维技术·数据库运维工程师·运维教程
码界奇点30 分钟前
Java Web学习 第15篇jQuery万字长文详解从入门到实战解锁前端交互新境界
java·前端·学习·jquery
前端老曹39 分钟前
vue3 三级路由无法缓存的终极解决方案
前端·javascript·vue.js·vue
兮动人42 分钟前
Google Chrome 142更新引发内网访问危机:原理、影响与全面解决方案
前端·chrome