import { Link as I18nLink, LOCALES } from "@/i18n/routing"; import { constructMetadata } from "@/lib/metadata"; import { getWorkShops } from "@/lib/workshop"; import { WorkShop } from "@/types/workShop"; import { Metadata } from "next"; import { getTranslations } from "next-intl/server"; // 强制静态生成 export const dynamic = "force-static"; // 明确 Params 类型(静态生成的参数) type Params = { locale: string }; type MetadataProps = { params: Params; }; // 生成页面元数据(确保服务端/客户端翻译一致) export async function generateMetadata({ params, }: MetadataProps): Promise { const { locale } = params; const t = await getTranslations({ locale, namespace: "Workshop" }); return constructMetadata({ page: "Workshop", title: t("pageTitle", { defaultValue: "车间展示" }), // 使用 next-intl 官方的 defaultValue description: t("pageDesc", { defaultValue: "公司车间展示" }), locale: locale, path: `/workshop`, canonicalUrl: `/workshop`, }); } // 生成静态路由参数(多语言) export async function generateStaticParams() { return LOCALES.map((locale) => ({ locale, })); } // 空数据组件(纯静态,无动态属性) function EmptyState() { return
暂无车间数据
; } // 单个车间卡片组件(Client Component 标记,避免 Hydration 冲突) // 'use client'; // 仅当需要添加交互时启用,当前纯展示可不用 function WorkshopCard({ workshop }: { workshop: WorkShop }) { // 为 Image 组件添加默认值,避免属性缺失导致不匹配 const coverSrc = workshop.cover || "/default-workshop-cover.png"; // 兜底封面图 const coverAlt = workshop.title || "车间封面"; return (
{/* 封面图:优化属性,确保服务端/客户端渲染一致 */}
{coverAlt}
{/* 车间信息 */}

{workshop.title || "未命名车间"}

{workshop.desc || "暂无描述"}

); } // 页面主组件(Server Component) export default async function Page({ params, }: { params: Params; }) { const { locale } = await params; // 获取翻译(确保服务端/客户端一致) const t = await getTranslations({ locale, namespace: "Workshop" }); // 获取车间数据(顶层 await,Server Component 原生支持) const workShops: WorkShop[] = await getWorkShops(locale); // 页面标题翻译兜底 const pageTitle = t("pageTitle", { defaultValue: "车间展示" }); return (
{/* 页面标题(纯静态渲染,无动态属性) */}

{pageTitle}

{/* 移除不必要的 Suspense:Server Component 顶层 await 无需 Suspense */} {workShops.length > 0 ? (
{workShops.map((workshop) => { // 用稳定的 key(优先用唯一标识,如 id;无 id 则用 title+locale 避免 index 导致的问题) const stableKey = `${workshop.title}-${workshop.locale}`; return ; })}
) : ( )}
); }