本文基于这次抖音电商 818 主会场性能优化项目介绍一下 Jamstack 架构
Jamstack 是 Netlify 公司在 2016 年提出的一种架构理念,JAM 分别是 JavaScript、APIs 和 Markup 的缩写,具体含义是:
APIs (A): 可以通过 JavaScript 调用的数据接口 (例如:飞书开放 API、GitHub API).
Markup (M): 用于页面构建的模板方案、站点生成器、构建工具 (例如:Nunjucks、 Webpack、Gatsby).
我们过去熟悉的类 LAMP 或者 MEAN 架构的渲染流程都大概都如下图所示,每当用户请求一个页面时,服务器就会查询一个数据库,并将结果与页面的标记和插件中的数据结合起来,在浏览器中生成一个新的 HTML 文档。这个过程可以减慢页面加载时间。
Jamstack 架构与上述传统架构还是有很大的不同,当用户请求页面时,不需要查询数据库,因为 HTML 文档在 CDN 静态缓存文件,如果有数据需求,会再通过 API 接口去获取。
Jamstack 的实现依赖下面几个点
Jamstack 核心还是一个架构思想,具体到我们这次抖音电商大促主会场,还是需要做一些调整
Jamstack 架构主要还是基于浏览器 web 场景来设计,目前行业大多数访问路径都是在 App 内,所以我们也借助客户端提供更好的性能
根据我们的统计,DNS 和 TCP 会有 150ms-200ms 的耗时,基于 dns-prefetch preconnect 只能解决页面内的部分,我们基于字节浏览器内核 TTWebview 的域名保活功能,针对我们的域名进行的长链接保活,让这块儿耗时大幅减少
Jamstack 架构让页面的静态和动态进行了分离,正常情况下,我们需要在页面主文档加载完成,使用 JavaScript 请求 API 获取数据,借助客户端的能力,我们可以在主文档加载的同时,并行加载 API 数据
借助客户端能力,我们提前将页面使用的静态资源(JavaScript、CSS、图片)进行了预先的离线化,这样可以大大减少静态资源的加载耗时。
借助字节浏览器内核 TTWebview,我们可以对 JavaScript 的编译结果进行 Cache,进一步减少二次打开的运行耗时
目前页面越来越复杂,JavaScript 的执行耗时越来越久,一些预编译方案也是值得探索,比如 Flutter 本地开发时使用 JIT 保障研发体验,正式发布使用 AOT 保障性能。
如果页面的数据不是强个性化,SSR + Jamstack 是个非常好的架构,既保证性能,也有动态化能力。
我们是抖音电商前端营销团队,如果你对构建下一代搭建平台、跨端方案、性能优化感兴趣,可以联系我 mengdesen#bytedance.com