回顾 2018 年的前端届,笔者看到的是 PWA、SSR、AMP、Web Component & Polymer、GraphQL 等半生不熟的技术,其中最有创新点的大概就是 Truffle(区块链)和 TFJS(TensorFlow.js)了。
到了 2019 年 ,当数 Serverless 的发展最为迅速。那么,当下去分析 Serverless 背景下的前端困境就显得尤为重要——从自身痛点出发,才能更好地赋能前端。
本文将从 Serverless 背景下的前端困境入手分析,结合具体的技术点,最后给出解决方案相关的建议。
Serverless 背景下的前端困境
国内各个公司在 Serverless 投入很大,腾讯和阿里云都铆足了劲在上面发力,提出了各自的解决方案,腾讯推出了 Serverless 2.0,以及前段时间阿里云推出的预留模式,都是对 Serverless 越来越重视的表现。
阿里近期在做前端研发升级,为拓展前端的边界和职能,尝试做了一次和 Serverless 的结合,希望能将传统应用快速迁移到 Serverless 体系,让大家都能享受到 Serverless 的红利。
Serverless 技术已经来临,Web 应用是 Serverless 技术一个重要的场景。
应该以什么姿态和角色去迎接新的技术变革,是每个端开发需要思考的问题。
我们可能会有如下思考:
- Serverless 能给我们带来多大价值?
- 有没有符合 Serverless 应用的开发框架?
- Serverless 下前端传统的渲染,该如何做?
- Serverless 应用的开发模式会不会和过去的开发模式存在很大的差异?
为了让 Web 应用在 Serverless 场景下,保持甚至超越传统开发体验,我们做了许多探索。我们尝试将传统 Web 应用框架迁移到 Serverless 平台上,比如 Egg.js 等框架,虽然与传统开发体验相差不大,但是也带来了不少问题,例如不支持跨云平台,还需要针对 Serverless 特性做好适配,相关的工具也没法深度适配 Web 应用框架这种特定场景。
FaaS 架构研发模式如何升级
Node.js Web 的浪潮,把前端变为了全栈开发工程师,体会到了传统前后端一体应用的魅力,也扩充了前端的边界,而 Serverless 则成了工程师们从 DevOps 到 NoOps 的另一次契机,新的革命即将到来。
传统应用开发、调试、部署的整个研发流程,在新的机会下需要模式升级,也需要从工具链、框架、到整个发布和灰度以及回滚流程,整体来重塑原有的体系。
面对基建成本和技术革新,阿里集团利用传统的 Node.js 技术栈的经验积累,演进出全新的 midway-faas 框架,结合完整的工具链从整个研发流程,调试,发布着手,通过平台化,工具化,将整个工程从头迁移到 Serverless 新体系。
为此,阿里开始了「前端研发升级」这个大项目。
整个前端研发模式升级的目的有两个,一为「前端赋能」,二为「提效」。所谓的「前端赋能」,是因为我们希望能够打破现有的技术壁垒,朝着更底层、面向数据的地方去深入探索,在这之中可以从面向 UI 和视图本身变得更加了解业务,从更全面的视角来理解现有的体系。而「前端提效」,则是希望让 Serverless,用更轻量化的方式进行业务研发,降低整个前端参与业务交付的门槛,同时,在开发期间,也能减少人力总成本,让前端减负,业务小步快跑成为可能。
概览如下,用户代码桥接函数和 BaaS 服务,其中 HTTP 网关和函数运行时、容器是三大核心技术。
基于现有生态,如何实现函数运行时,其中也是有很多故事的。
Node.js 基础团队的使命,就是为阿里集团 Node.js 生态提供各种基础能力,包括但不限于框架,中间件包等,而在 Serverless 体系中,我们要负责框架、工具链、运行时、发布系统,同时也需要和周边的网关,监控系统等对接。
渲染层如何做
从 beidou、Next.js、Egg-react-ssr 到 Umi SSR, 可以看出服务端渲染是很重要的端侧渲染组成部分。无论如何,React SSR 都是依赖 Node.js Web 应用的。那么,在 Serverless 时代,基于函数即服务(Functions as a Service,简写为FaaS)做 API 开发相关是非常简单的,因为它 1. 无服务,不需要管运维工作;2. 代码只关心函数粒度,面向 API 编程,降低构建复杂度;3. 可扩展。
那么,在 FaaS 下,如何做好渲染层呢?直出 HTML,做 CSR 很明显是太简单了,其实我们可以做的更多,笔者目前能想到的 Serverless 时代的渲染层具有如下特点:
- 采用 Next.js/egg-react-ssr 写法,实现客户端渲染和服务端渲染统一
- 采用 Umi SSR 构建,生成独立 umi.server.js 做法,做到渲染
- 采用 Umi 做法,内置 Webpack 和 React, 简化开发,只在构建时区分客户端渲染和服务端渲染,做好和 CDN 的搭档,做好优雅降级,保证稳定性
- 结合 FaaS API,做好渲染集成
为了演示 Serverless 下渲染层实现原理,下面会进行简要说明。在 Serverless 云函数里,一般会有 server.yml 作为配置文件,这里以 lamda 为例子。
通过这个配置,我们可以看出函数 app.server 对应的 HTTP 请求路径是 '/',这个配置其实描述的就是路由信息。对应的 app.server 函数实现如下图。
通过提供 ctx.ssrRender 方法,读取 dist 目录下的 Page.server.js 完成服务端渲染。
核心要点:
- ssrRender 方法比较容易实现
- 采用类似 Umi SSR 的方式,将源码打包到 Page.server.js 文件中
- 在发布的时候,将配置,app.server 函数和 Page.server.js 等文件上传到 Serverless 运行环境即可
综上所述,我们大致可以推出架构升级的四大阶段。
- 在 CSR 中,开发者需要关心 React 和 Webpack
- 在 SSR 中,开发者需要关心 React、Webpack 和 Egg.js
- 在 Umi SSR 同构中,开发者需要关心 React 和 Egg.js,由于 Umi 内置了 Webpack, 开发者基本不需要关注 Webpack
- 未来,基于 FaaS 的渲染层,开发者只需要关心 React, 不需要关心 Webpack 和 Egg.js
在这四个阶段中,依次出现了 CSR 和 SSR, 之后在同构实践中,对开发者要求要更高,甚至是全栈。所有这些经验和最佳实践的积累,沉淀出了更简单的开发方式,在未来 Serverless 环境下,希望前端更加简单、高效。
Serverless 时代,我们还能干点什么
Serverless 是一个颠覆性的演进,与之伴随而来的,是对未知的探索,这既是机遇也是挑战。
1)自动化
目前看,从申请域名,到网关,到集群的链路,离「无运维」还有许多优化空间。
2)面向页面开发,会导致页面管理成本增加
页面和 API 都以函数的形式存在,其维护成本比微服务时还要高
3)多种技术栈的融合
像早年的 Portal,现在的微前端,其实都是在解决「Widget 或组件的复用和配置」问题。
一个大型应用被“碎片化”后,还要保持“一目了然”。它由哪些子应用构成、运行状态、异常监控、代码健康度、甚至一些运营数据的监控,就变得非常必要了。
简化开发,赋能业务,为大中台,小前台贡献应变能力,笔者畅想的未来是这样的:
- 组件:开发只写组件
- 页面:配置出来
- 系统:集成出来
寄语未来前端
通过阿里前端的四大方向:Serverless、搭建、智能化、IDE, 我们可以看到未来对前端要求会越来越高,复合型人才(比如掌握算法),需要跨界(影响力),国际化,生在这样的时代是每一个前端的机遇和荣耀。
希望前端能够有更强的业务 Owner 意识,勇于创新,打破前端自身的局限和壁垒。无论 Serverless 还是智能化,我们都在突破,引领潮流。
本届 D2 Serverless 专场
其实,Serverless 背景下的前端困境对应的解决方案,业界都在探索,这是一条开拓的路,本次 D2 特地设置了 Serverless 专场,邀请国际国内知名一线专家,共同探讨,目前已入驻以下主题,邀你共赏。
1)Serverless 赋能前端应用开发
- 讲师:Matheus Fernandes & Shu Ding, 海外嘉宾,来自业界践行 Serverless 的先驱、知名 Serverless 解决方案提供商 ZEIT 公司。Matheus Fernandes 是 ZEIT 的技术负责人,知名的产品包括 Next.js 和 ZEIT now, 他帮助团队快速发展和业务的全球扩张。对开源、网络、CDN加速和摄影充满热情。为了追逐梦想,他辍学了,环球旅行和写代码,作为 ZEIT 的技术负责人,他两项爱好都实现了。Shu Ding 是 ZEIT 的产品设计师,他参与深受全球用户的喜爱的 Next.js、zeit.co 管理后台、SWR 等产品的设计。从高中开始编程,花了 4 年在算法比赛上。复旦大学计算机系本科毕业,目前是一名平面设计师和前端开发者,在上海工作。他创建了 inns.studio 以及其他很多项目。
- 内容摘要:ZEIT 是如何应用 Serverless 思想,借助前端实现 API 目录以及 Serverless target 等功能,在无额外开发成本的情况下,大幅度提升应用的可用性与伸缩性的? 在本次分享中,我们将通过分析实际的案例,去了解 Serverless 在开发场景背后的工作方式,一起感受如何利用 Serverless 的思想和能力去编写功能强大的前端应用程序。
2)前端新思路:组件即服务和 Serverless SSR 实践
- 讲师:狼叔,来自阿里巴巴,花名狼叔,前去哪儿前端架构师,StuQ 明星讲师,Node.js 技术布道者。曾就职于新浪、网秦,曾做过前端、后端、数据分析、移动端负责人、做过首席架构师、技术总监,全栈技术实践者,目前主要关注技术架构和团队梯队建设方向。
- 内容摘要:今天,做 Node.js 的运维和高并发依然是富有挑战的,为了提效,我们将架构演进为页面即服务,可是粒度还不够,借着云原生和 Serverless 大潮,无运维、轻松扩展,是对前端极大的诱惑。那么,基于 FaaS 之上,前端有哪些可能性呢?2019 年上半年,我在阿里巴巴经济体前端委员会推进的 Serverless 研发体系共建项目中负责 Serverless SSR 的研究,将 CSR、SSR、边缘渲染进行整合和尝试,提出组件即服务的概念(Component as Service),试图结合Faas, 做出更简单的开发方式。本次分享主要围绕 Serverless SSR 和它的演进过程、背后思考为主。
3)Serverless 下函数应用架构升级
- 讲师:陈仲寅,来自阿里巴巴,花名张挺,长期耕耘于 Node.js 技术栈,为淘宝和阿里其他BU提供框架和中间件解决方案,负责淘宝整体的 Node.js 体系基础建设,解决全栈开发的各种维护和稳定性问题,也同时负责 MidwayJs 系列内部和社区开源产品,包括 Midway、Sandbox、Pandora、Injection等开源产品的开发、维护等工作。
- 内容摘要:Node.js Web 的浪潮,让前端变为了全栈开发工程师,体会到了传统前后端一体应用的魅力,也扩充了前端的边界,而 Serverless 则成了工程师们从 DevOps 到 NoOps 的另一次契机,一次革命。
传统的应用开发、调试、部署的整个研发流程,在新的机会下需要模式升级,也需要整体重塑原有的体系,从工具链、框架、到整个发布和灰度以及回滚流程。
面对基建成本和技术革新,阿里集团利用传统的 Node.js 技术栈的经验积累,演进出全新的 midway-faas 框架,结合完整的工具链从整个研发流程,调试,发布着手,通过平台化,工具化,将整个工程从头迁移到 Serverless 新体系。
本次分享主要围绕 Serverless 体系下,使用全新的框架、工具链和研发模式,讲解在新的体系中进行业务快速迭代,研发升级以及多场景,多环境的问题。
4)基于 FaaS 实现 NPM CDN 同步
- 讲师:张立理,就职于百度,现任资深前端工程师 & 百度 ECOMFE、FE-CMC 主席一职。作为行业享有盛名的大咖,张立理行事低调,对工作热情饱满,多次受邀作为嘉宾出席各类大会,并发表了精彩演讲。
- 内容摘要:NPM 是 JavaScript 最权威的依赖仓库,通过 CDN 访问 NPM 任意包内的文件有助于快速构建前端应用,UNPKG 和 jsDelivr 是国际上比较知名的 NPM CDN 提供商,本次分享将介绍通过基于云服务(包括函数云、对象存储、CDN、容器引擎)和 Terraform 框架构建一个高弹性、高稳定性、免运维的 NPM 到 CDN 的同步服务