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 请求问题。

相关推荐
Warren982 小时前
Lua 脚本在 Redis 中的应用
java·前端·网络·vue.js·redis·junit·lua
mCell2 小时前
JavaScript 运行机制详解:再谈 Event Loop
前端·javascript·浏览器
帧栈6 小时前
开发避坑指南(27):Vue3中高效安全修改列表元素属性的方法
前端·vue.js
max5006006 小时前
基于桥梁三维模型的无人机检测路径规划系统设计与实现
前端·javascript·python·算法·无人机·easyui
excel6 小时前
使用函数式封装绘制科赫雪花(Koch Snowflake)
前端
long3167 小时前
java 策略模式 demo
java·开发语言·后端·spring·设计模式
萌萌哒草头将军7 小时前
Node.js v24.6.0 新功能速览 🚀🚀🚀
前端·javascript·node.js
柏油8 小时前
Spring @Cacheable 解读
redis·后端·spring
持久的棒棒君9 小时前
启动electron桌面项目控制台输出中文时乱码解决
前端·javascript·electron
柏油9 小时前
Spring @TransactionalEventListener 解读
spring boot·后端·spring