# Seven - 多语言官网(Next.js 15)
基于 Next.js 15、Tailwind CSS 和 shadcn/ui 搭建的多语言企业官网模板,内置中/英/日/韩/繁体语言路由,统一页头/页尾布局与 SEO 元数据管理。
## 技术栈
- Next.js 15(App Router)
- React 18
- Tailwind CSS
- shadcn/ui
## 目录结构(关键项)
```
app/
[lang]/
layout.tsx # 按语言生成 Metadata(需 await params)
page.tsx # 首页入口(需 await params)
products/page.tsx # 产品页(Client 组件)
solutions/page.tsx # 解决方案页(Client 组件)
contact/page.tsx # 联系我们(使用 PageLayout,表单仅在客户端渲染)
components/
PageLayout.tsx # 统一 TDK、Navbar、Footer 与内容容器
Navbar.tsx
Footer.tsx
TDK.tsx # 页面标题/描述/关键词
data/
content.ts # 站点通用文案(多语言)
pageContent.ts # 各页面文案(多语言)
```
## 快速开始(Windows PowerShell)
```powershell
# 安装依赖
npm install
# 本地开发(默认 http://localhost:3000)
npm run dev
# 生产构建
npm run build
# 本地预览生产构建
npm run start
```
## 环境要求
- Node.js ≥ 18.17(推荐 LTS)
- npm ≥ 9(或使用 pnpm/bun 亦可)
## 多语言与路由
- 路由格式:`/[lang]/...`,其中 `lang ∈ { en, zh-CN, zh-TW, ko, ja }`
- 入口页静态参数:`app/[lang]/page.tsx` 中的 `generateStaticParams()`
- 元数据生成:`app/[lang]/layout.tsx` 中的 `generateMetadata()` 会根据语言返回对应 TDK
注意:Next.js 15 起,动态段的 `params` 在服务端为 Promise,必须 `await` 后再使用,例如:
```ts
export async function generateMetadata({ params }: { params: Promise<{ lang: string }> }) {
const { lang } = await params;
// ...
}
```
## SEO 与 TDK
- 统一在 `PageLayout` 内通过 `TDK` 组件注入 `title/description/keywords`
- `app/[lang]/layout.tsx` 中维护各语言默认元数据与 `alternates.languages`
## SSR/CSR 与 Hydration 注意事项
- 避免在 SSR 阶段使用不稳定输出(如 `Date.now()`、`Math.random()`)
- 对于仅在客户端可用的交互(如带自动填充的表单),采用“客户端渲染占位”策略:
- `contact/page.tsx` 中使用 `isClient` 状态在挂载后再渲染表单,避免浏览器扩展(如 LastPass)注入导致水合不一致
- 若你引入新的服务端函数,确保在使用 `params` 前执行 `await`
## 常见问题(FAQ)
- Hydration failed:
- 检查是否使用了未固定输出的变量;
- 检查是否有浏览器扩展注入 DOM(如密码管理器);
- 对仅客户端渲染的复杂表单使用 `isClient` 保护渲染;
- 移除不必要的 `suppressHydrationWarning`,定位并修复根因。
- Route used `params.lang`. `params` should be awaited:
- Next.js 15 的动态 API 是异步的,请调整类型为 `Promise<...>` 并 `await`。
## 开发脚本
```powershell
# 代码检查(如已配置)
npm run lint
# Tailwind 即时开发(随 dev 一起运行)
npm run dev
```
## 部署
- 推荐部署到 Vercel:
- Framework: Next.js
- Build Command: `npm run build`
- Output: `.next`
- Node Version: 使用项目/平台默认 LTS
- 也可自托管:
- 运行 `npm run build && npm run start`
## 贡献与代码风格
- 变量/函数命名清晰完整,避免缩写
- 避免深层嵌套,使用早返回
- TypeScript 明确标注导出 API 的类型
- 不捕获且吞掉错误;错误需被有意义处理
## 许可证
本仓库以 MIT 协议开源。根据业务需要可自由修改与商用。