You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js 13.5.6 App Router中fetch no-store仍在构建时请求的原因

Next.js 13.5.6 App Router中fetch({ cache: 'no-store' })仍在构建阶段执行的原因

这是因为Next.js 13.5+版本对App Router的静态/动态渲染判断逻辑做了调整,核心是自动静态优化的优先级提升,具体细节如下:

1. 13.0.0 vs 13.5.6的行为差异

  • 在Next.js 13.0.0刚推出App Router时,fetch配置cache: 'no-store'会直接将路由标记为动态渲染,构建阶段完全跳过数据获取,只在用户请求时执行。
  • 但13.5.6版本开始,Next.js引入了更智能的自动静态检测:如果路由组件没有依赖任何用户请求专属信息(比如请求头headers、Cookie、URL查询参数searchParams等),即使fetch设置了cache: 'no-store',Next.js依然会认为这个路由可以被静态预渲染,于是在构建阶段执行数据获取逻辑,生成静态页面。

2. 为什么export const dynamic = 'force-dynamic'能解决问题

这个配置会强制路由进入动态渲染模式,完全跳过Next.js的自动静态检测逻辑,不管有没有用户专属依赖,都会在每个用户请求时才执行数据获取,自然不会在构建阶段触发fetch和console.log。

3. 额外验证点

如果你的组件中加入任何动态依赖,比如:

import { headers } from 'next/headers';

export default async function Home() {
  const headersList = await headers(); // 引入请求头依赖
  const posts = await getPosts();
  return <h1>The Starting Page</h1>;
}

即使不设置dynamic: 'force-dynamic',Next.js也会识别到这是动态路由,不会在构建阶段执行fetch,因为请求头只能在用户请求时获取,无法提前预渲染。

你的示例代码中,组件没有任何动态依赖,所以13.5.6的自动静态优化逻辑生效,导致构建阶段执行了数据获取。

内容的提问来源于stack exchange,提问作者Dmitriy Glazkov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 15:22:20