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

Next.js 13.2.1 App Dir静态转动态运行时错误求助

问题背景

使用Supabase类ORM语法获取数据时,应用先成功获取数据随后崩溃,抛出错误:

error - Error: Page changed from static to dynamic at runtime /en/habitaciones
see more here https://nextjs.org/docs/messages/app-static-to-dynamic-error
    at doRender (C:\creative-dev\coding\web\repos\hqnrd\node_modules\.pnpm\next@13.2.1_biqbaboplfbrettd7655fr4n2y\node_modules\next\dist\server\base-server.js:818:29)
    at async cacheEntry1.responseCache.get.incrementalCache.incrementalCache (C:\creative-dev\coding\web\repos\hqnrd\node_modules\.pnpm\next@13.2.1_biqbaboplfbrettd7655fr4n2y\node_modules\next\dist\server\base-server.js:926:28)
    at async C:\creative-dev\coding\web\repos\hqnrd\node_modules\.pnpm\next@13.2.1_biqbaboplfbrettd7655fr4n2y\node_modules\next\dist\server\response-cache\index.js:83:36 {
  page: '/en/habitaciones'
}

应用采用多语言架构,所有页面和组件放在动态路由app/[lang]下,已尝试配置路由段选项、创建无本地化测试应用(可正常获取Supabase数据)。

解决方案

1. 强制页面动态渲染

在app/[lang]/habitaciones/page.tsx文件顶部添加路由段配置,强制页面始终以动态模式渲染,避免静态到动态的切换:

export const dynamic = 'force-dynamic';

或使用revalidate: 0实现同样效果:

export const revalidate = 0;

2. 预生成多语言静态页面

如果页面数据不依赖用户动态上下文(如认证状态),可以预生成所有语言版本的静态页面:
在页面文件中添加generateStaticParams函数,生成所有支持的语言路由参数:

import { i18n } from '@/i18n-config';

export async function generateStaticParams() {
  return i18n.locales.map(locale => ({
    lang: locale,
  }));
}

同时确保Supabase数据获取在服务器组件中完成,且不依赖请求动态值(如headers()、cookies())。

3. 检查Supabase客户端初始化

若数据获取依赖用户认证,确保Supabase客户端在服务器组件中使用请求上下文初始化,且页面明确标记为动态:

import { createServerComponentClient } from '@supabase/auth-helpers-nextjs';
import { cookies } from 'next/headers';

export const dynamic = 'force-dynamic';

export default async function HabitacionesPage({ params }: { params: { lang: string } }) {
  const supabase = createServerComponentClient({ cookies });
  const { data, error } = await supabase.from('habitaciones').select('*');
  
  if (error) throw error;
  
  return <div>{/* 渲染数据 */}</div>;
}

4. 验证中间件逻辑

确保中间件不会在静态渲染阶段引入动态行为,当前中间件的重定向逻辑已排除静态资源,可保持现有配置,但需确认getLocale函数不会触发动态依赖。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:45:00