diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index a789526..93542b3 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -1,3 +1,4 @@ +import type { Metadata } from "next"; import { setRequestLocale } from "next-intl/server"; import { hasLocale } from "next-intl"; import { notFound } from "next/navigation"; @@ -6,7 +7,6 @@ import { Hero } from "@/app/components/Hero"; import { DispatchNetwork } from "@/app/components/DispatchNetwork"; import { Footer } from "@/app/components/Footer"; import { FloatWindow } from "@/app/components/float-window/FloatWindow"; -import { fetchHomepageEvents } from "@/lib/events-fetch"; import { routing } from "@/i18n/routing"; interface Props { @@ -16,30 +16,59 @@ interface Props { /** * 站点首页 (/[locale])。 * - * i18n 改造前是 RSC + cookies(),整页 dynamic。改造后通过 setRequestLocale - * 启用 SSG —— 但这页 await fetchHomepageEvents 仍然是 server fetch,会把 - * 整页钉成 dynamic(fetch 命中 cache 也算访问态)。 + * SSG 化(i18n 改造收尾,2026-05): + * 原版 await fetchHomepageEvents() server fetch backend,把首页钉成 + * ƒ Dynamic。改造让 FloatWindow / ActivityTicker 各自 client fetch + * /api/public/homepage-events,page 本身只剩纯静态渲染,build 时随 + * [locale] generateStaticParams 一起预渲染(zh + en 两份),Vercel + * Function 调用归零。 * - * TODO: 把 FloatWindow 的 event prop 移到 client 自己 fetch(参考 Hero - * 的 ActivityTicker 模式),让首页变 ●(SSG)。当前先保持 ƒ,等下一轮 - * 优化。 + * force-static + setRequestLocale 双保险:让 next-intl 不退回 dynamic。 */ +export const dynamic = "force-static"; + export default async function HomePage({ params }: Props) { const { locale } = await params; if (!hasLocale(routing.locales, locale)) notFound(); setRequestLocale(locale); - const homepageEvents = await fetchHomepageEvents(); - // FloatWindow 只展示"第一条未过期活动";fetchHomepageEvents 已把未过期排前面 - const latestActive = homepageEvents.find((e) => !e.deprecated) ?? null; - return ( <>