挑战
现有网站建立在一个单体 CMS 上,这带来了复杂的问题:
- 性能缓慢 — 带有臃肿插件的服务器渲染页面平均加载时间为 4-6 秒,严重影响 Core Web Vitals
- 开发瓶颈 — 每次内容更改(新着陆页、博客布局、CTA 更新)都需要开发人员修改模板文件
- 糟糕的 SEO 基础 — 缺乏结构化数据、不一致的元标签、缺失的 Canonical URL 和非程序化生成的 Sitemap 导致自然搜索可见性弱
- 僵化的内容模型 — 添加新的内容类型(案例研究、FAQ、团队成员简介)需要进行 Schema 迁移和模板重写
- 无预览功能 — 编辑人员盲目发布内容,无法在上线前预览更改
- 本地化需求 — 未来扩展到多种语言需要一个原生支持 i18n 的 CMS
我们的解决方案
我们构建了一个 Strapi + Next.js 无头架构,其中 Strapi 具有灵活的内容建模层,Next.js 前端通过 ISR 实现近乎即时更新的静态生成,以及一个涵盖技术、页面内和结构化数据优化的综合 SEO 系统。
架构
- CMS: Strapi (自托管),带有自定义内容类型和 Dynamic Zones
- 前端: Next.js,使用 App Router, React Server Components, TypeScript
- 样式: Tailwind CSS,带有设计系统 Tokens
- SEO 层: Next.js Metadata API, JSON-LD 生成器, 自动化 Sitemap/robots.txt
- 媒体: Strapi Media Library,使用 Cloudinary 提供商进行优化交付
- 托管: Vercel (前端), 云托管 Strapi 后端, Cloudinary (媒体 CDN)
- 数据库: PostgreSQL,用于 Strapi 内容存储
- 缓存: ISR,通过 Strapi Webhooks 进行按需重新验证
Strapi 内容建模
内容类型
该 CMS 以内容类型为核心构建,涵盖所有业务需求:营销页面、带分类和作者的博客文章、活动着陆页、服务/产品提供、团队成员简介、FAQ、客户评价以及用于全站配置的全局设置单例。
Dynamic Zones (页面构建器)
Strapi Dynamic Zones 允许编辑人员使用可重用组件来组合页面内容——每个 Zone 条目都映射到前端的 React 组件。可用的区块包括英雄区、功能网格、图文布局、客户评价区、CTA 横幅、FAQ 手风琴、数据统计、定价表、Logo 网格、嵌入内容、博客精选和联系表单——涵盖了所有常见的营销页面模式。
SEO 组件(可复用)
一个附加到每种内容类型的共享 SEO 组件提供了自定义元标题、元描述、Canonical URL 覆盖、Open Graph 图片、索引指令、焦点关键词和可选的结构化数据覆盖的字段——确保所有内容一致的 SEO 管理。
Next.js 前端架构
组件结构
前端遵循分层架构:
- 区块组件 直接映射到 Strapi Dynamic Zone 条目
- UI 原语 提供一致的设计系统元素
- 布局组件 处理页眉、页脚和导航
- SEO 工具 生成结构化数据和元标签
一个中央 Dynamic Zone 渲染器遍历来自 Strapi 的区块数组,并为每个条目渲染相应的 React 组件。
数据获取策略
所有路由都使用增量静态再生 (ISR),并通过 Strapi Webhooks 触发按需重新验证。当编辑人员发布或更新内容时,Strapi 会触发一个 Webhook,进而触发特定受影响页面的重新验证,确保更新在几秒钟内上线,而无需完全重建。
SEO 实施
技术 SEO
- 每页元数据 — 从 Strapi SEO 字段生成标题、描述、Canonical URL、Open Graph 和 Twitter Card 标签,并带有智能回退机制
- 自动化 Sitemap — 从所有已发布内容中程序化生成,并带有适当的更改频率和优先级值
- Robots.txt — 环境感知生成(生产环境允许抓取,暂存环境阻止抓取)
- Canonical URL — 自动生成并进行尾部斜杠规范化,可从 CMS 覆盖
结构化数据 (JSON-LD)
自动化 Schema 生成涵盖:
- 组织 — 来自全局设置的全站 Schema
- 文章 — 带有标题、作者、日期和发布者的博客文章
- FAQ — 当页面上使用 FAQ 区块时自动生成
- 面包屑 — 根据 URL 路径层级自动生成
- 服务 — 带有提供者和服务区域的服务页面
- 本地商家 — 可选,适用于有实体位置的商家
性能 SEO (Core Web Vitals)
- LCP — 英雄图片预加载, Cloudinary 自动格式 (WebP/AVIF), 关键 CSS 内联, Server Components 消除不必要的客户端 JS
- CLS — 媒体库中明确的图片尺寸, 带有 size-adjust 的优化字体加载, 骨架占位符, 固定尺寸嵌入容器
- INP — 最少的客户端 JavaScript, 轻量级交互处理程序, 按路由的代码分割
页面内 SEO 工具
CMS 包含编辑指导,提供元字段的字符计数指示器、确保没有页面在没有 SEO 元数据的情况下发布的必填字段验证,以及从内容标题和摘要自动填充 SEO 字段并提供手动覆盖选项。
媒体管道
上传到 Strapi 的图片存储在 Cloudinary CDN 上,Next.js 前端请求优化后的变体,具有自动格式选择、响应式尺寸调整、边缘缓存和带有模糊占位符的延迟加载,以实现首屏优先加载。
主要功能
- Dynamic Zone 页面构建器 — 12+ 个可组合区块,实现零开发人员页面创建
- 可复用 SEO 组件 — 附加到每种内容类型,实现一致的元数据管理
- 自动化结构化数据 — 用于 Organization, Article, FAQ, Breadcrumb, Service 的 JSON-LD
- ISR + Webhooks — 内容更新在几秒钟内上线,无需完全重建
- 程序化 Sitemap — 从所有已发布的 Strapi 内容自动生成
- Cloudinary 媒体管道 — 自动格式、响应式尺寸调整、CDN 交付
- Core Web Vitals 优化 — Server Components, 图片预加载, 字体优化, 最少 JS
- 草稿预览 — Strapi 预览按钮在发布前在 Next.js 中渲染草稿内容
- i18n 就绪 — Strapi 内置的国际化功能,用于未来的多语言扩展
- 编辑防护栏 — Strapi 管理后台中的字符计数、必填字段和关键词指导
成果
技术栈
caseStudyDetail.more 案例研究
探索更多我们的技术实施案例
