天天看點

Serverless 背景下的前端困境與解決方案

Serverless 背景下的前端困境與解決方案

回顧 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 背景下的前端困境與解決方案

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 網關和函數運作時、容器是三大核心技術。

Serverless 背景下的前端困境與解決方案

基于現有生态,如何實作函數運作時,其中也是有很多故事的。

Serverless 背景下的前端困境與解決方案

Node.js 基礎團隊的使命,就是為阿裡集團 Node.js 生态提供各種基礎能力,包括但不限于架構,中間件包等,而在 Serverless 體系中,我們要負責架構、工具鍊、運作時、釋出系統,同時也需要和周邊的網關,監控系統等對接。

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. 可擴充。

Serverless 背景下的前端困境與解決方案

那麼,在 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 為例子。

Serverless 背景下的前端困境與解決方案

通過這個配置,我們可以看出函數 app.server 對應的 HTTP 請求路徑是 '/',這個配置其實描述的就是路由資訊。對應的 app.server 函數實作如下圖。

Serverless 背景下的前端困境與解決方案

通過提供 ctx.ssrRender 方法,讀取 dist 目錄下的 Page.server.js 完成服務端渲染。

核心要點:

  • ssrRender 方法比較容易實作
  • 采用類似 Umi SSR 的方式,将源碼打包到 Page.server.js 檔案中
  • 在釋出的時候,将配置,app.server 函數和 Page.server.js 等檔案上傳到 Serverless 運作環境即可

綜上所述,我們大緻可以推出架構更新的四大階段。

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 的另一次契機,一次革命。

    傳統的應用開發、調試、部署的整個研發流程,在新的機會下需要模式更新,也需要整體重塑原有的體系,從工具鍊、架構、到整個釋出和灰階以及復原流程。

本次分享主要圍繞 Serverless 體系下,使用全新的架構、工具鍊和研發模式,講解在新的體系中進行業務快速疊代,研發更新以及多場景,多環境的問題。

4)基于 FaaS 實作 NPM CDN 同步

  • 講師:張立理,就職于百度,現任資深前端工程師 & 百度 ECOMFE、FE-CMC 主席一職。作為行業享有盛名的大咖,張立理行事低調,對工作熱情飽滿,多次受邀作為嘉賓出席各類大會,并發表了精彩演講。
  • 内容摘要:NPM 是 JavaScript 最權威的依賴倉庫,通過 CDN 通路 NPM 任意包内的檔案有助于快速建構前端應用,UNPKG 和 jsDelivr 是國際上比較知名的 NPM CDN 提供商,本次分享将介紹通過基于雲服務(包括函數雲、對象存儲、CDN、容器引擎)和 Terraform 架構建構一個高彈性、高穩定性、免運維的 NPM 到 CDN 的同步服務
Serverless 背景下的前端困境與解決方案

繼續閱讀