熱門跨平臺方案對比:WEEX、React Native、Flutter和PWA

原文鏈接:https://mp.weixin.qq.com/s?__biz=MjM5MTA1MjAxMQ==&mid=2651233590&idx=2&sn=f5b3f70b6efce30c0a45604d466bdcc7&chksm=bd4944b28a3ecda455cd336939224dc2d5ffa3de6888791d516ac433d24382567b64ed6751b0&scene=0&xtrack=1&key=c38930807a42c0fa09674d91304efecb16e996bb94ee

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

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

WEEX

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

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

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

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生態。

React Native

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

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

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

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

在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也將變得更快、更輕量、更強大。

Flutter

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

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

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

作爲Flutter框架的重要組成部分,Widget是Flutter應用界面開發的基本內容,每個Widget都是界面的不可變聲明。在Flutter應用開發中,Widget是不能直接更新的,需要通過Widget的狀態來間接更新,這是因爲Flutter的Widget借鑑了現代響應式框架的構建過程,它有自己特有的狀態。當Widget的狀態發生變化時,Widget會重新構建用戶界面,並且Flutter會對比前後的不同,以確保底層渲染樹從一個狀態轉換到下一個狀態時所需的更改最小。

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

PWA

PWA,全稱爲Progressive Web App,是谷歌公司在2015年提出的漸進式網頁開發技術。PWA結合了一系列的現代Web技術,並使用多種技術來增強Web App的功能,最終可以讓網頁應用獲得媲美原生應用的體驗。相比於傳統的網頁技術,漸進式Web技術是一個橫跨Web技術及原生App開發的技術解決方案,具有可靠、快速且可參與等諸多特點。

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

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

其中,Service Worker表示離線緩存文件,其本質是Web應用程序與瀏覽器之間的代理服務器。開發者可以在網絡可用時將其作爲瀏覽器和網絡之間的代理,也可以在離線或者網絡極差的環境下使用其中的緩存內容。

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

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

對比與分析

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

如上表所示,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作爲新晉的跨平臺技術方案,目前還處測試階段,商用的案例也很少。不過,谷歌的號召力一直很強,未來究竟如何發展讓我們拭目以待。

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章