import { Link as I18nLink, LOCALES } from "@/i18n/routing"; import { getLines } from "@/lib/lines"; import { constructMetadata } from "@/lib/metadata"; import { Line } from "@/types/line"; 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: `/line`, canonicalUrl: `/line`, }); } // 生成静态路由参数(多语言) export async function generateStaticParams() { return LOCALES.map((locale) => ({ locale, })); } // 空数据组件(纯静态,无动态属性) function EmptyState() { return
暂无产品线数据
; } // 单个车间卡片组件(Client Component 标记,避免 Hydration 冲突) // 'use client'; // 仅当需要添加交互时启用,当前纯展示可不用 function ProductCard({ product }: { product: Line }) { // 为 Image 组件添加默认值,避免属性缺失导致不匹配 const coverSrc = product.cover || "/default-workshop-cover.png"; // 兜底封面图 const coverAlt = product.title || "产品线封面"; return (
{/* 封面图:优化属性,确保服务端/客户端渲染一致 */}
{coverAlt}
{/* 车间信息 */}

{product.title || "未命名产品线"}

{product.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 products: Line[] = await getLines(locale); // 页面标题翻译兜底 const pageTitle = t("pageTitle", { defaultValue: "产品线展示" }); return (
{/* 页面标题(纯静态渲染,无动态属性) */}

{pageTitle}

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