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

阿里雲開發者發表於2020-09-22

簡介: 前端這門技術,從誕生髮展至今不過寥寥十餘年。如果說前十年是 PC 前端的時代,那後十年一定是屬於移動前端的時代。特別是隨著網路制式的發展,移動裝置在全球範圍內得到了空前的普及,在前端領域,Hybird Web、React Native、Weex、Flutter 等等一系列新的移動前端技術也如同雨後春筍般冒出來,今天來和大家分享一下我對「移動前端開發和 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)的花容月貌?那麼,你現在看到的就是唯一的正確答案。

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

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

簡歷可郵件投遞至zhuoling.lcl@alibaba-inc.com ,期待你的聯絡。

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

相關文章