src/components/blocks/。
每个 block 自带布局,从 messages/{en,zh}.json 取文案,彼此独立可以随意调序。
组合代码只有一处:src/app/[locale]/(marketing)/page.tsx。
前置条件
无。Block 已经接好。Block 阵容
当前page.tsx 里的顺序:
src/components/blocks/ 下的一个文件。它们都不接受 props——
所有差异都通过 i18n key 表达。
Block 怎么读文案
每个 block 都用Home.<block> 命名空间调 useTranslations:
messages/en.json 的 Home.hero 下,messages/zh.json 同位置
有同名 key。改文案就是改 JSON——永远不要为了改字而碰组件源码。
调序或删除 block
打开src/app/[locale]/(marketing)/page.tsx,调整 JSX 顺序。
要删一个就删那一行;要把定价放到功能上面就交换顺序。
没有什么 nav 数据结构——视觉顺序就是 JSX 顺序。
新增一个 block
- 创建
src/components/blocks/<my-block>.tsx,默认导出一个调用useTranslations('Home.myBlock')的 server component。 - 在
messages/en.json和messages/zh.json同时加Home.myBlock。 - 在
page.tsx想要的位置 import 并 render。 - 跑一下
node scripts/check-i18n.mjs确认 key 对齐。
主题 token
品牌色和圆角都是src/app/globals.css 里 @theme 块的 CSS 变量
(Tailwind v4 指令)。改一次 --primary,所有 block 自动换肤。
暗色模式变量在文件下方的 .dark 里。
验证一下
常见坑(5 个)
- 组件里写死英文——一定要用
useTranslations。写字面字符串的话, 中文站会显示英文。Reviewer 会抓住,但你已经浪费了 commit。 - Block 顺序影响视觉节奏——密集与喘息段落交替(如 Features 之后接 Quickstart,不要两个网格连排)。
- 360px 下的移动端响应——iPhone SE 宽度是底线。一定测。 Hero 副标题特别容易在窄屏溢出。
- 只往
en.json加 key——validator 会阻断构建。 永远两份文件同步加。 - 直接 import
next/link——必须用@/i18n/navigation的Link, 否则点击跳转会丢 locale 前缀。
官方文档
- tailwindcss.com——utility class 与 v4
@theme指令 - ui.shadcn.com——block 用到的组件原语
- Lucide icons——通用图标集
- next-intl useTranslations——block 内部的 i18n