blogs

大型网站JAMStack架构实践

发布于: 2022.01.09

前言

2021年中,在一个全球官网重建项目上工作。项目期望替换老旧的CMS系统,有更好的访问速度和自然搜索排名,涉及十多个地区及语言。最终我们采用JAMStack架构来实现。

本文主要分享一下使用JAMStack架构构建大型网站的实践经验。

一、为什么选择JAMStack

以WordPress为代表的传统CMS是很优秀的产品,但它们无法提供更好的访问速度和安全性。

2019年底,技术雷达上提到了JAMStack架构,主要技术包括:静态站点生成器(Static Site Generator),无头CMS(Headless CMS) 和 CDN。使用静态站点生成器与无头CMS API集成生成静态页面,然后部署到CDN,能够给网站带来更好的性能、安全性和扩展性。

传统CMS架构与JAMStack架构对比
传统CMS架构与JAMStack架构对比,来自 https://jamstack.org/

实际上2010年前就存在这种架构方案。只因为静态站点生成器使用Java、Ruby等语言,与前端代码集成构建难度较大,导致开发成本较高。自从Node.js诞生后,前端框架和构建工具的兴起,静态站点生成器生也可以使用JavaScript语言,并且能够和React、Vue前端框架融为一体,极大的降低了开发成本。

二、JAMStack技术选型

在使用JAMStack架构时,优先选择Headless CMS产品,其次才是云服务和静态站点生成器。当前大多数Headless CMS都是付费的,且不同的价格提供了不同的功能。也有一些免费开源的Headless CMS产品,仅提供了基础功能,更多功能需要二次开发。因此选择一款适合运维团队的CMS产品,能够节省很多开发成本和后期的维护成本。

选择适合运维团队的 Headless CMS 产品

你需要根据运维团队规模、编辑权限、发布流程、操作习惯、维护内容易用性等方面,去对比CMS产品功能是否满足。以下是实践中三种角色较为重要的功能需求。

  1. 内容编辑角色(Editor)
    • 内容预览。编辑者期望看到发布后的预期效果,这是非常重要的功能。Headless CMS需要结合静态站点生成器一起实现,需要调研CMS产品是如何提供预览操作。
    • 富文本编辑器。大多数编辑者更喜欢使用WYSIWYG编辑器,而不是Markdown编辑器。需要调研CMS如何如何替换。
    • 多媒体资源管理。图片和视频这些多媒体资源会越来越多,编辑者需要按照类型、标签、时间、关键词等方式快速查找。
    • 内容历史版本化。编辑者需要对比历史版本内容,了解差异;也需要快速回退到前一个版本,重新发布。需要调研CMS有没有这个功能,以及二次开发成本如何。
    • 国际化(i18n)。全球化网站必要的功能。特别需要调研CMS是否支持阿拉伯语、希伯来语用户的使用习惯。
    • 还有 批量编辑内容翻译 等辅助功能。
  2. 管理员角色(Admin)
    • 角色权限管理。大型网站都会划分内容板块,由不同的内容编辑团队独立维护。管理员需要为这些团队设置不同的权限。一些CMS产品会使用不同的价格来限制角色个数。
    • 操作日志。管理员或其他角色需要查看关键事件发生了什么操作,便于问题回溯。
  3. 开发者角色(Developer)
    • 独立部署。需要调研CMS是否支持独立部署,这涉及到数据存储安全等问题。
    • 集成登录认证系统。需要调研好CMS如何集成已有的认证系统。
    • 集成内容发布流程。一些大型维护团队会有严格的发布审批流程,你需要调研CMS如何集成当前的审批流程系统。
    • 还有 WebhookREST 和 GraphQL API插件扩展 等功能,都是Headless CMS产品必备功能。

选择合适的云服务

云服务环境搭建对于JAMstack架构是至关重要的。特别是大型全球网站,你不仅需要考虑到云服务商的CDN节点分布、带宽等性能问题;还需要考虑到欧盟的GDPR法案对于数据存储、数据同步,以及部署架构的影响。

搭建大型的JAMstack应用的CI和部署环境,有以下两种方案供你参考:

选择静态站点生成器框架

在JAMstack官网列举了很多静态站点生成器,覆盖了主流的前端三大框架(React, Vue, Angular)。

这些静态站点生成器,本质上是将前端框架和对应的Server-Side Rendering框架重新整合而成,分别构建出client和server两端的代码,作用于不同的运行环境。基于React的 Next和Gatsby,和基于Vue 的 Nuxt 都是很优秀的静态站点生成器,他们的生态已经很成熟,你可以放心的选择他们。

三、JAMStack开发实践

由于JAMStack架构采用前后端代码解耦,静态站点生成器框架在实践过程中使用多种模式,相对于传统的CMS单体应用来说,具有一定的复杂度。以下总结了使用NuxtJS和Strapi CMS实施JAMStack架构应用的一些实践经验。

四、思考JAMStack架构

当然JAMStack架构也带来一些新的问题:

JAMStack 架构是一个优秀的CMS系统解决方案,解耦能带来一定的好处。但JAMStack不是银弹,不会完全代替传统的CMS,选择适合你的业务和团队诉求即可。

参考资料