移動跨平臺方案對比:WEEX、React Native、Flutter和PWA

xiangzhihong發表於2019-08-30

移動跨平臺方案對比:WEEX、React Native、Flutter和PWA

本文主要對WEEX、React Native、Flutter和PWA幾大熱門跨平臺方案進行簡單的介紹和對比。內容選自《WEEX跨平臺開發實戰》 (WEEX專案負責人力薦,從入門到實戰,教你玩轉移動前端跨平臺開發!)

傳統的原生Android、iOS開發面臨著諸多難以解決的問題,例如開發週期長、迭代緩慢等,因此很多公司備受困擾。近年來,伴隨著“大前端”概念的提出和興起,湧現出一大批移動跨平臺開發框架和模式,為解決傳統移動開發問題找到了新的方向。

從早期的PhoneGap、Inoic等Hybrid混合技術,到現在耳熟能詳的React Native、WEEX和Flutter等跨平臺技術,藉助這些優秀的跨平臺開發框架,在不犧牲效能和體驗的前提下,開發進度和多端研發的問題得到有效解決。

移動跨平臺方案對比:WEEX、React Native、Flutter和PWA

WEEX是由阿里巴巴研發的一套移動跨平臺技術框架,最初是為了解決移動開發過程中頻繁發版和多端研發的問題而開發的。使用WEEX提供的跨平臺技術,開發者可以很方便地使用Web技術來構建具有可擴充套件的原生效能體驗的應用,並支援在Android、iOS、YunOS和Web等多平臺上部署。具體來說,當在專案中整合WeexSDK之後,就可以使用JavaScript(JS)和主流的前端框架來開發移動應用了。

同時,WEEX框架的結構是解耦的,渲染引擎與語法層分離,也不依賴任何特定的前端框架,目前,開發者可以使用Vue.js和Rax兩個前端框架來進行WEEX頁面開發。同時,WEEX的另一個主要目標是跟進流行的Web開發技術並將其與原生開發技術相結合,實現開發效率和執行效能的高度統一。

作為一套前端跨平臺技術框架,WEEX建立了一套原始碼轉換以及原生平臺與JavaScript通訊的機制。WEEX表面上是一個客戶端框架,但實際上它串聯起了從本地開發、雲端部署到分發的整個鏈路。

移動跨平臺方案對比:WEEX、React Native、Flutter和PWA

WEEX的整個工作流程圖如上,WEEX框架中最核心的部分是JavaScript Runtime。具體來說就是,當需要執行渲染操作時,在iOS環境下選擇基於JavaScriptCore的iOS系統提供的JSContext,在Android環境下使用基於JavaScriptCore的JavaScript引擎。

當JSBundle從伺服器端下載完成之後,WEEX在Android、iOS和Web端會執行一個JavaScript引擎來執行JSBundle,同時向各終端的渲染層傳送渲染指令,並排程客戶端的渲染引擎實現檢視渲染、事件繫結和處理使用者互動等操作。

由於Android、iOS和HTML5等終端最終使用的是原生的渲染引擎,也就是說使用同一套程式碼在不同終端上展示的樣式是相同的,並且WEEX使用原生引擎渲染的是原生的元件,所以在效能上要比傳統的WebView方案好很多。

當然,儘管WEEX已經提供了開發者所需要的最常用的元件和模組,但面對豐富多樣的移動應用研發需求,這些常用基礎元件還是遠遠不能滿足開發的需要,因此WEEX提供了靈活自由的擴充套件能力,開發者可以根據自身的情況定做屬於自己客戶端的元件和模組,從而豐富WEEX生態。

移動跨平臺方案對比:WEEX、React Native、Flutter和PWA

React Native是Facebook公司於2015年4月開源的跨平臺移動應用開發框架,它是Facebook早先開源的React框架在原生移動應用平臺上的衍生產物,目前主要支援iOS和Android兩大平臺。

React Native使用JavaScript語言來開發移動應用,但UI渲染、網路請求等功能均由原生平臺實現。具體來說就是,開發者編寫的JavaScript程式碼會通過中間層轉化為原生元件後再執行,因此熟悉Web前端開發的技術人員只需要很短的學習過程,就可以進-入移動應用開發領域,並在不犧牲使用者體驗的前提下提高開發效率。

作為一個跨平臺技術框架,React Native從上到下可以分為JavaScript層、C++層和原生層。其中,C++層主要用於實現動態連結庫(.so檔案),以作為中間適配層進行橋接,並實現JavaScript端與原生平臺的雙向通訊。

移動跨平臺方案對比:WEEX、React Native、Flutter和PWA

在React Native的三層架構中,最核心的就是中間的C++層,C++層最核心的功能就是封裝JavaScriptCore,用於執行對JavaScript的解析。同時,原生平臺提供的各種原生模組(如網路請求模組、ViewGroup元件模組)和JavaScript端提供的各種模組(如JS EventEmiter模組)都會在C++層實現的.so檔案中被儲存起來,最終通過C++層中儲存的對映實現兩端的互動。React Native框架的工作原理如下圖。

移動跨平臺方案對比:WEEX、React Native、Flutter和PWA

在React Native的開發過程中,大多數情況下開發人員並不需要了解React Native框架的具體細節,只需要專注JavaScript端的程式碼邏輯實現即可。但需要注意的是,由於JavaScript程式碼執行在獨立的JavaScript執行緒中,所以在JavaScript中不能處理耗時的操作,如fetch網路請求、圖片載入和資料持久化等。

最終,JavaScript程式碼會被打包成一個bundle檔案並自動新增到應用程式的資源目錄下,而應用程式最終載入的也是打包後的bundle檔案。React Native的打包指令碼位於/node_modules/react-native/local-cli目錄下,打包後通過metro模組壓縮成bundle檔案。通常bundle檔案只包含打包的JavaScript程式碼,並不包含圖片、多媒體等靜態資源,而打包後的靜態資源會被複制到對應的平臺資原始檔夾中。

總體來說,React Native使用JavaScript來編寫應用程式,然後呼叫原生元件執行頁面渲染操作,在提高了開發效率的同時又保留了原生的使用者體驗。並且,伴隨著Facebook重構React Native工作的完成,React Native也將變得更快、更輕量、更強大。

移動跨平臺方案對比:WEEX、React Native、Flutter和PWA

Flutter是谷歌公司開源的移動跨平臺框架,其歷史最早可以追溯到2015年的Sky專案,該專案可以同時執行在Android、iOS和Fuchsia等包含Dart虛擬機器的平臺上,並且效能無限接近原生平臺。與React Native和WEEX使用JavaScript作為程式語言,以及使用平臺自身引擎渲染介面不同,Flutter直接選擇使用2D繪圖引擎庫Skia來渲染介面。

移動跨平臺方案對比:WEEX、React Native、Flutter和PWA

如上圖,Flutter框架主要由Framework層和Engine層組成,我們基於Framework層開發的App最終會執行在Engine層上。其中,Engine是Flutter提供的獨立虛擬機器,正是由於它的存在,Flutter程式才能執行在不同的平臺上,實現跨平臺執行的能力。

與React Native和WEEX使用原生元件渲染介面不同,Flutter並不需要使用原生元件來渲染介面,而是使用自帶的渲染引擎(Engine層)來繪製頁面元件(Flutter顯示單元),並且Dart程式碼會通過AOT被編譯為對應平臺的原生程式碼,實現與平臺的直接通訊,不需要通過JavaScript引擎進行橋接,也不需要使用原生平臺的Dalvik虛擬機器。Engine層的渲染架構圖如下。

移動跨平臺方案對比:WEEX、React Native、Flutter和PWA
作為Flutter框架的重要組成部分,Widget是Flutter應用介面開發的基本內容,每個Widget都是介面的不可變宣告。在Flutter應用開發中,Widget是不能直接更新的,需要通過Widget的狀態來間接更新,這是因為Flutter的Widget借鑑了現代響應式框架的構建過程,它有自己特有的狀態。當Widget的狀態發生變化時,Widget會重新構建使用者介面,並且Flutter會對比前後的不同,以確保底層渲染樹從一個狀態轉換到下一個狀態時所需的更改最小。

總體來說,Flutter是目前最好的跨平臺解決方案之一,它只用一套程式碼便可生成Android和iOS兩種平臺上的應用,很大程度上減少了App的開發和維護成本。同時,Dart語言強大的效能表現和豐富的特性,也使得跨平臺開發變得更加便利。而不足的是,Flutter還處於初期測試階段,許多功能還不是特別完善,而全新的Dart語言也增加了開發者的學習成本。Flutter要完全替代Android和iOS原生開發,還有比較長的路要走。

移動跨平臺方案對比:WEEX、React Native、Flutter和PWA

PWA,全稱為Progressive Web App,是谷歌公司在2015年提出的漸進式網頁開發技術。PWA結合了一系列的現代Web技術,並使用多種技術來增強Web App的功能,最終可以讓網頁應用獲得媲美原生應用的體驗。

相比於傳統的網頁技術,漸進式Web技術是一個橫跨Web技術及原生App開發的技術解決方案,具有可靠、快速且可參與等諸多特點。

具體來說就是,當使用者從手機主螢幕啟動應用時,不用考慮網路的狀態就可以立刻載入出網頁。並且相比傳統的網頁載入速度,PWA的載入速度是非常快的,這是因為PWA使用了Service Worker 等先進技術。除此之外,PWA還可以被新增到使用者的主螢幕上,不用從應用商店進行下載即可通過網路應用程式Manifest為使用者提供媲美原生App的使用體驗。

作為一種全新的Web技術方案,PWA需要依賴一些重要的技術元件,它們協同工作,為傳統的Web應用程式注入活力。

移動跨平臺方案對比:WEEX、React Native、Flutter和PWA

其中,Service Worker表示離線快取檔案,其本質是Web應用程式與瀏覽器之間的代理伺服器。開發者可以在網路可用時將其作為瀏覽器和網路之間的代理,也可以在離線或者網路極差的環境下使用其中的快取內容。

Manifest則是W3C的技術規範,它定義了基於JSON的清單,為開發人員提供了一個集中放置與Web應用程式關聯的後設資料的地點。Manifest是PWA開發中的重要一環,它為開發人員控制應用程式提供了可能。

目前,PWA還處於起步階段,使用的廠商也是諸如Twitter、淘寶、微博等大平臺。不過,PWA作為谷歌公司主推的一項技術標準,已經被Edge、Safari和FireFox等主流瀏覽器所支援。可以預見的是,PWA必將成為又一革命性技術方案。

移動跨平臺方案對比:WEEX、React Native、Flutter和PWA

在當前諸多的跨平臺方案中,React Native、WEEX和Flutter無疑是最優秀的。而從不同的細節來看,三大跨平臺框架又有各自的優點和缺點:

移動跨平臺方案對比:WEEX、React Native、Flutter和PWA

如上表所示,React Native和WEEX採用的技術方案大體相同,它們都使用JavaScript來開發跨平臺應用,通過將中間層轉換為原生的元件後再利用原生的渲染引擎執行渲染操作。與React Native和WEEX使用原生平臺渲染引擎不同,Flutter直接使用Skia引擎來渲染檢視,和平臺沒有直接的關係。就目前跨平臺框架的實現技術來看,JavaScript在跨平臺應用開發中可謂佔據半壁江山,大有“一統天下”的趨勢。

從效能方面來看,Flutter理論上是最好的,React Native和WEEX次之,並且都好於傳統的WebView方案。但從目前的實際應用來看,它們之間卻並沒有太大的差距,特別是和0.5.0版本以上的React Native對比,效能體驗上的差異並不明顯。

而從社群和社群角度來看,React Native和Flutter無疑是最活躍的,React Native經過4年多的發展已經成長為跨平臺開發的實際領導者,並擁有各類豐富的第三方庫和大量的開發群體。Flutter作為新晉的跨平臺技術方案,目前還處測試階段,商用的案例也很少。不過,谷歌的號召力一直很強,未來究竟如何發展讓我們拭目以待。

移動跨平臺方案對比:WEEX、React Native、Flutter和PWA

《WEEX跨平臺開發實戰》是一本系統介紹WEEX跨平臺應用開發的書籍,涵蓋了WEEX開發的方方面面,主要由基礎知識、高階應用開發和專案實戰三部分組成。第一部分重點介紹WEEX開發的基礎知識,後兩部分則重點介紹WEEX開發的進階知識和專案實戰。

本書也是一本WEEX入門與實戰類書籍,適合有一定前端開發基礎或者移動端開發基礎的讀者閱讀。因此,無論你是前端開發者,還是移動端開發者,都可以通過對本書的學習來掌握移動跨平臺應用開發的技能。

相關文章