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


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

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

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

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是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是谷歌公司開源的移動跨平台框架,其歷史最早可以追溯到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,全稱為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作為新晉的跨平台技術方案,目前還處測試階段,商用的案例也很少。不過,谷歌的號召力一直很強,未來究竟如何發展讓我們拭目以待。

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

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

    本文轉載於網絡 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM