前端工程化之FaaS SSR方案
一、背景
二、诉求即目标
同构的SSR:顶层设计上已不接受基于模板的SSR技术,因为异构的TPL和JS增加了页面组件的维护切换成本,基于业务与团队现状,我们需要快速迭代,一套代码100%复用,同时JS一体化同构的SSR能把组件代码侵入降到最低。
极速接入:页面开发者希望集成在CSR工程下,几乎为零的模块、项目和页面目录改动。一方面因为CSR是业务承载大头,另一方面是前端分散的多个模块现状,迁入一个集中式的庞大工程内再拆成可控的小块,加上依赖关系管理,改造成本极大,为了接入SSR要重构甚至重写是削弱工程化ROI的。
开发体验:页面开发者更专注于组件代码本身,CSR的开发部署方式,修改代码打包发布即可。希望BFF服务编排和云端基础设施一切都以NoOps有条不紊的运行。数据接口和字段复用更是基本诉求。
效果保障:使用服务端HTML结果渲染首屏,适当的利用缓存策略,加速受访缩短FMP时间,提升网页服务品质。SEO友好,利于内容密集型网页获得搜索的曝光。
三、FaaS SSR普世
Page Resources:SSR过程所需的必要元素
Template:页面模板,即CSR页面的HTML,同时是SSR页面的模板。
Bundle:组件打包的bundle,这份供Node.js Server端进行SSR的bundle产物,需要webpack单独打包产出。
FC:控制SSR过程的计算函数,实现SSR 核心的钩子,在Function Sandbox中运行,可以自定义SSR结果。
Data:填充组件的BaaS数据,通过调用Backend Service获取。
Routing:路由页面请求及调度资源
manifest.json:模块构建产出的资源清单。每个方向模块自动产出一份,声明上述Page Resources的资源等信息。
module:模块的信息,manifest.json路径、模块查询路径等信息。
router:解析当前Request信息的Lambda函数,匹配到当前页面的Template、Bundle、FC信息,并向FC派发HTTP事件。
BaaS:后端即服务,包括接口、存储、通信等Backend Service。通过Spec描述即可交给FaaS RPC调用目标服务。
Rendering:通过系列Lambda函数管道调用,注入整个过程的环境变量,包括获取并转换BaaS数据接口描述,通过RPC调用获取内容数据,合并组件和数据,回填APP HTML和模板,等等进行实质的SSR过程。
Watching:服务日常运维提效相关,包括通用监控、日志传输、离线计算、服务观测等等。
4.1 组件响应
4.2 接口描述
4.3 构建改造
4.4 开发体验
4.5 风险控制
缓存1:即代理层缓存。当FaaS服务异常时,返回最近成功的SSR缓存。
缓存2:即FaaS层缓存。实现对不同模块不同页面的公共下游响应数据共用,当下游BaaS服务异常时,返回最近成功的API缓存。
降级:即服务降级为CSR,当以上没有缓存时回退到响应静态文件。