開發與維運

移動前端開發和 Web 前端開發的區別是什麼?

滾動.gif

前端這門技術,從誕生髮展至今不過寥寥十餘年。如果說前十年是 PC 前端的時代,那後十年一定是屬於移動前端的時代。特別是隨著網絡制式的發展,移動設備在全球範圍內得到了空前的普及,在前端領域,Hybird Web、React Native、Weex、Flutter 等等一系列新的移動前端技術也如同雨後春筍般冒出來,今天來和大家分享一下我對「移動前端開發和 Web 前端開發」的理解。

回顧:前端發展史

▐ 階段一:刀耕火種

十多年前的前端,開發者還在為兼容 IE6 而頭疼,框架上 jQuery 是老大,有追求的前端開發可能會使用 Zepto.js 以減少網頁體積。這個時候,前端頁面主要還是以 PC 為主,這個時候根本沒有移動前端的概念,在小小的手機屏幕上流量的頁面則是以純文本為主。

image.png

▐ 階段二:工程化

image.png

在 2011 ~ 2014 年之間的歷史階段裡,模塊化的思路佔為主導。當時為了進行 Assets 資源加載器的設計,就制定了模塊化的協議規範。當時比較流行的模塊化協議就是 AMD(RequireJS)、CMD(Seajs 為代表)、KMD(Kissy 為代表)。在淘寶、天貓,Kissy 應用的很火,所以 KMD 主導天下;在支付寶及外部社區,Seajs 應用的很火,所以 CMD 主導天下,玉伯大大的名氣和威望也在前端圈裡特別高;而 AMD 在國外比較流行,但漸漸也被後來出現的 CommonJS 規範削弱了氣勢。

▐ 階段三:移動化

隨著 3G、4G 的發展和 iOS 和 Android 手機在市場的普及量大增,PC 業務主戰場也逐漸過渡到移動端。前端的思維模式由 PC 轉向了移動端,並向 App 的用戶體驗看齊。移動端的 HTML5 協議支持不完善,前端的生產配套不全,Android 的屏幕碎片化,所以那個時候的前端開發移動端頁面適配的痛苦要遠遠超過 PC 時代。

image.png

▐ 階段四:框架化

在前端社區,Angular、React、Vue、RN (React Native) 這樣的 MV* 框架一個接著一個出現,讓前端接受了數據驅動思想的洗禮之外,還藉助 RN 完成了移動端的體驗升級,包括後來的 Weex、Flutter。

在這個階段,前端開始有了終端的底層架構組,開始構思前端頁面在移動終端上的加載性能和用戶體驗表現。在阿里巴巴內部,為了解決多端複用的問題,Rax 藉助 VDOM 打通 WebView 和 Weex 兩端,一套代碼跑天下。

image.png

▐ 階段五:垂直化

隨著初代 iPhone 的發佈,大屏幕手機逐漸變成了主流,移動端的需求開始爆發。在淘寶天貓,每年雙十一的移動端成交額逐年攀升,並逐漸佔領絕對領先地位。前端的領域也隨著這種趨勢逐漸細分,按照場景可以簡單分為移動(無線)前端開發和中後臺前端開發。

移動前端開發面向的是消費者端的 Web 與 輕 App 業務場景,在這個場景下,淘系經過多年的營銷活動沉澱,逐漸形成了移動端獨特的、輕量級的解決方案,以及模塊維度的、面向運營的頁面搭建系統。

中後臺前端則是面向企業 ERP、CRM 、OA 等偏後的業務場景,如商家後臺等系統。在這個場景下,藉助飛冰、Fusion Design 等中後臺物料,形成可視化的中後臺搭建解決方案,為業務的前端、開發或產品角色提供一站式中後臺生產解決方案。

移動前端:混合技術的前世今生

曾幾何時,移動客戶端開發和前端開發是兩條沒有交集的平行線,但現在我們越來越擁抱兩者的合作產物:混合式(Hybird)應用開發,或者用最近比較火的一個概念 -- 大前端技術。

從技術的表現形式思考,本質上客戶端開發與前端開發都是終端技術,它的特點是直接面向用戶 UI 編程。

▐ 同是 UI 編程,我們面對的痛點是什麼?

傳統 Web 前端技術的技術侷限性

1、資源加載:HTML、JS、CSS、圖片等靜態資源存放於遠端的服務器,需要動態的異步拉取,再拉取數據進行展示,初始化效率上比 Native 慢的多

2、渲染機制:在瀏覽器的設計中,JS 的執行和頁面的佈局、Paint 都在同一個主線程,無法並行化,再加上 JS 的性能趕不上 AOT 語言,執行復雜邏輯時導致的卡頓通常會阻塞 UI,再加上冗長的渲染管線,導致瀏覽器的渲染體驗在等量對比 Native 時並不佔優勢。

3、頁面切換:在瀏覽器中並不存在路由的概念,這導致頁面間的切換體驗完全依賴於瀏覽器 Shell 提供的能力,在頁面切換的時候會反覆加載。當然前端社區中也出現了單頁面應用的概念,但是多個頁面的資源也顯著增加了 JSBundle 的體積,也使頁面的開發更加複雜化了。

4、API 能力:瀏覽器的安全機制是基於同源策略的沙箱機制,這套沙箱機制阻止了前端開發者使用原生系統能力,你只能使用 W3C 標準定義的功能,而且考慮到終端碎片化的問題,這些接口往往不能直接使用。這在 PC 端的場景中是沒有什麼問題的,但是在移動端則相反,開發者希望有能力調用系統接口實現一些更富交互的場景。

5、交互性能:瀏覽器的實時交互性能體驗差,在複雜交互場景中大規模的重排限制了 UI 幀率,這種限制在中低端移動設備中尤為嚴重。

6、腳本語言,動態解析執行
JS 是一門 JIT 語言,也就是需要動態解析執行,對比預先編譯機器碼的 AOT 語言的執行性能就差得多了。

傳統客戶端技術的侷限性?

1、動態性:客戶端開發通常是有固定的版本發佈計劃,而且受制於 Apple 的 App Store 審核規則,版本發佈的不確定性還會受到政策影響,Android 在國內的渠道眾多,每次發版都要反覆檢查渠道,一旦發現線上問題需要依賴再次發版,容錯成本非常高,這也大大增加了對業務的侷限性。

2、開發成本:客戶端的開發成本高,然而生態還不如 Web 豐富,npm 社區的幾萬開源包,加上更活躍的開發者社區,導致對企業來講客戶端的研發成本是高於 Web 開發的。

3、跨端一致性:傳統客戶端開發一套業務,是需要實現 Android + iOS 兩套代碼的,而且由於 Android 和 iOS 的操作系統能力差異,同樣的需求往往會用不同的視覺和交互來實現,這也導致了業務成本居高不下。

▐ 混合式前端開發

為什麼會出現混合式前端開發?

隨著 iOS + Android 確立了移動操作系統的統治地位,前端開發者也在尋找使用操作系統提供的能力進行業務開發的模式。Web 的開發方式遠比 iOS 和 Android 更加方便和高效,Web 上層出不窮的各種庫和框架也遠比 Android 和 iOS 的各種庫和框架方便的多。Web 上我們可以方便的使用各種前端框架,及時預覽效果(想想大型 Android/iOS 工程的編譯時間)。

從阿里巴巴的角度來看,隨著中臺化的理念逐漸被接受:業務需要追求快速發展,前臺的 UI 和需求會隨著商業決策快速迭代,前端和客戶端不同的崗位也形成了分工化的研發模式。

前端向上,前置作為業務方的唯一接口,逐漸演變為大前端的業務層。在這一層,它的職責是負責定義規範,通過框架規範業務的開發過程,同時封裝統一的解決方案和工程化能力,將重複的工作抽離。

客戶端向下扎,解耦業務需求,轉為大前端的架構層,給上層的業務開發者提供能力支持。通過將客戶端的系統級 API 以及宿主應用的能力暴露給上層前端,提高前端頁面對更多富交互場景的承載能力。

image.png

在這樣的大背景下,各種混合開發技術層出不窮,在這裡我們簡單的把混合式應用的發展定義為三個階段:

▐ 階段一:JSBridge

在這個階段,主要還是以 WebView 為主,並配合 JSBridge 提供了 Naive 與 JS 之間的通信鏈路,基於這個通信基礎,Native可以暴露出一些標準服務 API 提供給 JS 調用,同樣的 JS 也可以以此封裝一些基礎API給 Native 調用。前端開發者使用傳統的 JS + HTML + CSS 進行頁面的開發,並且調用 JSBridge API 驅動客戶端能力。在這個階段,Apache Cordova 是業內的佼佼者,大多互聯網公司內部也有自己的 JSBridge 框架實現,可以說 JSBridge 第一次給了前端開發者調用 Native 的能力。

image.png

但是 JSBridge 方案的主要缺點在於性能方面及高級組件擴展能力缺失,流暢性始終無法與 Native 媲美。

▐ 階段二:原生 UI

雖然 Web 的動態性和高效的開發效率,是原生開發望塵莫及的,但是瀏覽器技術的瓶頸也非常明顯:

1、W3C 作為開放的技術標準,歷史悠久,包袱多,顯著拖慢了瀏覽器的性能。

2、WebView 渲染引擎設計的上的缺陷,渲染流水線非常長,導致瀏覽器對合成器動畫和非合成器動畫區別對待,非合成動畫性能不好。

3、單線程模型,無法發揮現代硬件架構特別是 ARM 架構多核心的性能。

4、異步光柵化的設計,在進行長列表滾動時,不可避免出現白屏的現象。

**有沒有一種兩全其美的方式?
React Native/Weex 的出現給前端開發者帶來了一道曙光。**

React Native/Weex 利用 JS 引擎來調用 Native 端的組件,從而實現相應的功能。React Native 和 Weex 都允許前端開發者使用 JS 進行業務邏輯開發,使用 VDOM 來描述文檔結構,並配合 CSS 的子集來定製樣式,樣式和模板分離。

Weex 體系中, JS 的執行在 JS Thread,Layout 執行在獨立的 Layout Thread ,渲染執行在系統的 MainThread ,三個線程相互獨立,並行執行。

在 WebView 的體系中 JS 的執行、 Layout 、 Paint 都在 MainThread ,相互影響,在進行復雜任務時會導致界面卡頓。

這種方案的優勢在於最大化的複用前端的生態和 Native 的生態體系。

在阿里巴巴,Weex 的大規模應用,甚至支撐起了雙十一億級的流量。

image.png

▐ 階段三:自繪引擎

什麼是自繪引擎?

所謂自繪引擎,就是不依賴操作系統提供的佈局、原生組件能力,直接調用 GPU 或者底層抽象層進行繪製的渲染引擎。

在上一個階段,前端開發者已經可以使用 JS 引擎驅動原生 UI 了,為什麼還需要自繪引擎?

React Native/Weex 充分將 Native 的 View 體系輸出到前端體系中,在進行 Android/iOS Native View 的封裝過程中,存在不少難以逾越的障礙。如:難以抹平的雙端一致性問題、複雜樣式能力難以實現、 Layout 動畫需要執行兩次(WeexCore Layout 和 Android Native 本身的 Layout )。組件的封裝成本隨著複雜度增加也越來越高,難以逾越 Native View 限制提供更細緻的 W3C 標準能力。

2018 年 Flutter 誕生,通過 Dart 語言構建一套跨平臺的開發組件,所有組件基於 Skia 引擎自繪,在性能上和 Native 平臺的 View 相媲美,同時解決了上一代架構難以解決的雙端一致性等問題。引起大家廣泛關注,充分驗證了通過繪製構建組件做到 Native View 媲美的 UI 渲染引擎的可行性。

但是 Flutter 本身是缺乏動態更新特性的,社區上也有一些項目在探索 Flutter 的動態化特性,我們團隊內部也在實現面向前端的動態化 Flutter 引擎:Kraken,與其它方案不同的是 Kraken 並沒有基於 Flutter 自帶的 Widgets 框架進行擴展,而是從底層擴展了 W3C 標準的 API,這使得它更像一個瀏覽器,也讓 Flutter 面向 Web 開發者的使用門檻大大降低。

未來:迴歸本源

天下大勢,分久必合,合久必分。移動前端開發本質上還是終端開發的一種形態,不管容器、框架、語言怎麼變,在前端開發者中只有 W3C 的標準是永遠不變的。筆者認為,隨著 Web 的發展,在解決一系列性能、體驗問題之後,瀏覽器技術會成為更通用的 UI 編程標準。

▐ PWA

早先年,Google 就已經在這一領域內努力,推出了 PWA (Progress Web Application) 的概念。

PWA 通過在移動端瀏覽器提供標準化框架,在 Web App 中實現和 Native App 接近的用戶體驗。它的特性其實是一系列 W3C 標準和私有標準集合,簡單的說 PWA 支持:

  • 離線加載:通過 Service Worker 等提供的緩存機制,允許用戶在斷網或者弱網的情況下直接讀取離線資源。
  • 後臺駐留進程:正常情況下,瀏覽器的頁面關閉後它的整個生命週期就結束了,內存也得到了釋放。Service Worker 允許頁面在關閉的情況下繼續運行,這保證了類似於離線緩存、主動推送等。
  • 消息通知:允許 Web 開發者實現類似 App 的主動推送機制。
  • 其它移動 App 的功能特性,如直接保存圖標到桌面,允許用戶像正常使用 App 一樣打開 PWA 應用;可以隱藏 UI 中的默認瀏覽器元素,讓 Web 內容全屏展示,從視覺上看讓 Web 應用更像一個原生應用,有時候你根本無法分辨到底是 Web 應用還是原生應用。

▐ PHA

當然在標準能力不完善,業務又需要定製化能力的當下,混合式應用還會繼續發展。

PHA (Progress Hybird Application) 的概念應用而生,PHA 是一種漸進式的混合應用增強策略, 提供端測的輔助能力,提升 WebView 的渲染性能與體驗。廣義地說,當下比較火的小程序、快應用都是 PHA 的一種實現。

在淘系內部,我們也在實現一套輕量級的 PHA 方案,並且在大促中也取得了不錯的效果,我想後面單獨出一篇關於 PHA 的文章來闡述。

關於未來,隨著技術方案的多樣化、以及端邊界的擴展,我們認為最重要的就是效率與性能的問題。

image.png

基於大數據的機器學習能力,移動端上會擁有更高效的 UI 編排能力,最終能讓 UI 渲染實現實時個性化。

image.png

基於最近比較熱的 WebAssembly 能力,讓瀏覽器突破 JavaScript 的限制,能擁有更大的想象空間。

作者|卓凌
編輯|橙子君
出品|阿里巴巴新零售淘系技術部

One More Thing

我們是 Rax、飛冰(ICE)、GCanvas 等炙手可熱開源項目的開山鼻祖,是你在阿里寫前端時繞不開的愛恨糾纏。想不想為集團的前端架構夯實地基讓百米高樓更加堅若磐石?想不想讓自己的代碼造福社區引人膜拜?想不想窺探窺探下一代渲染引擎(Kraken)和下一代手淘應用容器(PHA)的花容月貌?那麼,你現在看到的就是唯一的正確答案。

無聊的代碼千篇一律,有趣的崗位萬里挑一,終端架構的未來如此廣闊,需要各位鼎力相助,歡迎加入阿里淘系前端架構團隊!

我們是阿里巴巴淘系技術部 - 大前端技術架構團隊,誠邀各路小夥伴的加入,一起做大事!

簡歷可郵件投遞至[email protected] ,期待你的聯繫。

1、大比拼 | 下一代高性能跨平臺UI渲染引擎
2、Flutter 動態化方案探索
3、最火移動端跨平臺方案盤點:React Native、weex、Flutter
4、淺談 Hybrid App
5、其它一些無法被引用的內外部資源

關注「淘系技術」微信公眾號,一個有溫度有內容的技術社區~

image.png

Leave a Reply

Your email address will not be published. Required fields are marked *