ReactNative 與 Weex 淺整理

React Native

  • React Native著力于提高多平臺開發的開發效率 —— 僅需學習一次,編寫任何平臺。(Learn once, write anywhere)

  • Facebook已經在多項產品中使用了React Native,并且將持續地投入建設React Native。

React Native 是Facebook的一個開源框架,React Native使你能夠在Javascript和React的基礎上獲得完全一致的開發體驗,構建世界一流的原生APP。官方的標語為“ Learn once, write anywhere”,僅需學習一次,編寫任何平臺。是目前App混合式開發的主要技術之一。

原生組件

使用React Native,你可以使用標準的平臺組件,例如iOS的UITabBar或安卓的Drawer。 這使你的app獲得平臺一致的視覺效果和體驗,并且獲得最佳的性能和流暢性。 使用對應的React component,就可以輕松地把這些原生組件整合到你的React Native應用中, 例如TabBarIOS和DrawerLayoutAndroid。

異步執行

在Javascript代碼和原生平臺之間的所有操作都是異步執行的,并且原生模塊還可以根據需要創建新的線程。這意味著你可以在主線程解碼圖片,然后在后臺將它保存到磁盤,或者在不阻塞UI的情況下計算文字大小和界面布局等等。所以React Native開發的app天然具備流暢和反應靈敏的優勢。Javascript和原生代碼之間的通訊是完全可序列化的,這使得我們可以借助Chrome開發者工具去調試應用,而不論應用運行在模擬器還是真機上。

觸摸事件處理

React Native實現了一個強大的觸摸事件處理系統,可以在復雜的View層次關系下正確地處理觸摸事件。同時還提供了高度封裝的組件如TouchableHighlight等,可以直接嵌入到ScrollView或者其它的元素中,無需額外配置。

彈性盒(Flexbox)和樣式

控制view的布局應當簡單易行,這就是為什么React Native從web中借鑒了Flexbox模型。Flexbox讓大多數常見的UI布局構建變得簡單(譬如帶有外襯margin和內襯padding,且堆疊在一起的多個矩形)。React Native還支持多種常見的web樣式,例如fontWeight等。抽象樣式表提供了一個高性能的機制來聲明所有的樣式和布局,并且可以直接應用到你的組件中。

兼容通用標準

React Native致力于改進視圖代碼的編寫方式。除此之外,我們還吸納了web生態系統中的通用標準,并在必要的時候為這些API提供兼容層。如此一來,npm上的許多庫就可以在React Native中直接使用。這樣的兼容層有XMLHttpRequest, window.requestAnimationFrame, navigator.geolocation等。我們還在努力增加更多的API,并且十分歡迎開源社區進行貢獻。

擴展性

使用React Native,無需編寫一行原生代碼即可創造一款不錯的app。盡管如此,使用自定義的原生視圖和模塊來擴展React Native也非常容易 —— 這意味著你現有的所有工作都可以被復用,你喜歡的各種原生庫都可以被導入。

入門

React Native看起來很像React,只不過其基礎組件是原生組件而非web組件。要理解React Native應用的基本結構,首先需要了解一些基本的React的概念,比如JSX語法、組件、state狀態以及props屬性。

import React, { Component } from 'react';
import { AppRegistry, Text } from 'react-native';

class HelloWorldApp extends Component {
  render() {
    return (
      <Text>Hello world!</Text>
    );
  }
}

// 注意,這里用引號括起來的'HelloWorldApp'必須和你init創建的項目名一致
AppRegistry.registerComponent('HelloWorldApp', () => HelloWorldApp);

初看這段代碼,可能覺得并不像JavaScript——沒錯,這是“未來”的JavaScript.

首先你需要了解ES2015 (也叫作ES6)——這是一套對JavaScript的語法改進的官方標準。但是這套標準目前還沒有在所有的瀏覽器上完整實現,所以目前而言web開發中還很少使用。React Native內置了對ES2015標準的支持,你可以放心使用而無需擔心兼容性問題。上面的示例代碼中的import、from、class、extends、以及() =>箭頭函數等新語法都是ES2015中的特性。

學習地址

Weex

  • 一次編寫,多端運行。
    Weex 提供強大的跨平臺能力,可以使用相同的 API 開發 Web,Android 和 iOS 應用。 同時,我們對接口了豐富的擴展能力。 這樣,當您需要擴展原生組件或模塊時,這將非常方便。

與 Web App、HTML5 App 或 hybrid App 不同,您可以使用 Weex 構建一個真正的原生應用。更貼心的是你的代碼只需使用 HTML、CSS、JavaScript 可以構建原生應用,上手非常簡單。但實際上,應用的底層是 Objective-C 或 Java, 同時,Weex 提供很多 native 組件或模塊供開發人員使用。

整體架構

Weex 表面上是一個客戶端技術,但實際上它串聯起了從本地開發環境到云端部署和分發的整個鏈路。開發者首先可以在本地像撰寫 web 頁面一樣撰寫一個 app 的頁面,然后編譯成一段 JavaScript 代碼,形成 Weex 的一個 JS bundle;在云端,開發者可以把生成的 JS bundle 部署上去,然后通過網絡請求或預下發的方式傳遞到用戶的移動應用客戶端;在移動應用客戶端里,WeexSDK 會準備好一個 JavaScript 引擎,并且在用戶打開一個 Weex 頁面時執行相應的 JS bundle,并在執行過程中產生各種命令發送到 native 端進行的界面渲染或數據存儲、網絡通信、調用設備功能、用戶交互響應等移動應用的場景實踐;同時,如果用戶沒有安裝移動應用,他仍然可以在瀏覽器里打開一個相同的 web 頁面,這個頁面是使用相同的頁面源代碼,通過瀏覽器里的 JavaScript 引擎運行起來的。

952288D6-E103-4094-A12F-9B01FAA6610A.png
云端部署和分發

Weex 的 JS bundle 可以作為 web 開發中的一段靜態資源進行部署和下發。幾乎可以復用 HTML5 所有的工程體系和最佳實踐。比如在本地開發環境通過部署工具將 JS bundle 部署到 CDN、通過 CMS 或搭建平臺把業務數據和模塊化的前端組件自動化拼接生成 JS bundle、通過服務端 JS bundle 的流量和日志統計頁面的訪問情況、通過 AppCache 或類似的方式對 JS bundle 在客戶端進行緩存或預加載以降低網絡通信的成本等。

客戶端 JavaScript 引擎

Weex 的 iOS 和 Android 客戶端中都會運行一個 JavaScript 引擎,來執行 JS bundle,同時向各端的渲染層發送規范化的指令,調度客戶端的渲染和其它各種能力。我們在 iOS 下選擇了 JavaScriptCore 內核,而在 Android 下選擇了 UC 提供的 v8 內核。無論是從性能還是穩定性方面都提供了強有力的保障。

為了讓整個移動應用的資源利用得更好,我們在客戶端提供的 JavaScript 引擎是單例的,即所有 JS bundle 公用一個 JavaScript 內核實例,同時對每個 JS bundle 在運行時進行了上下文的隔離,使得每個 JS bundle 都能夠高效安全的工作。我們還把 Vue 2.0 這樣的 JS Framework 做了預置,開發者不必把 JS Framework 打包在每個 JS bundle 里,從而大大減少了 JS bundle 的體積,也就進一步保障了頁面打開的速度。

客戶端渲染層

Weex 目前提供了 iOS 和 Android 兩個客戶端的 native 渲染層。每個端都基于 DOM 模型設計并實現了標準的界面渲染接口供 JavaScript 引擎調用。并且結合 web 標準和 native 的特點和優勢實現了一套統一的組件和模塊。Weex 在性能方面的表現也是非常優異的,尤其是界面首屏加載時間、native 下長列表的資源開銷和復用情況、CPU、內存、幀率 等關鍵指標。當然,盡管 Weex 官方已經提供了一組開發者最常用的組件和模塊,但面對豐富多樣的移動應用研發需求,團隊也難免會力不從心,為此我們提供了靈活自由的橫向擴展能力,開發者可以根據自身的情況定制屬于自己的客戶端組件和模塊,進一步豐富 Weex 在客戶端上的能力。

瀏覽器渲染

Weex 除了提供 iOS 和 Android 的客戶端渲染層之外,還基于 Vue 2.0 對官方的所有組件和模塊進行了封裝,開發者可以基于 Vue 2.0 用同一套源代碼構建出在瀏覽器中相同效果的頁面。并且同樣可以橫向擴展。

擴展

Weex 和 Web 平臺的差異
如何使用 iOS
如何使用 Android
如何使用 HTML5

學習地址

React Native 對比 Weex

對比 React Native Weex
社區支持 React Native社區則比較活躍,可以參考的項目和資料也比較豐富 Weex開源較晚,互聯網上相關資料還比較少,社區規模較小
App數量 33 (不知名應用居多) 8(阿里系應用淘寶、天貓等)
開發環境 brew install node brew install node
初始化工具 npm install -g yarn react-native-cli npm install -g weex-toolkit@beta
環境 brew install node brew install node
組件 34組件相對較多 16 更輕量級
學習成本 javascript,React.js,ES6,ReactNative javascript,Vue.js,ES6,Weex
debug工具 Nuclide Devtools 實現了Chrome Debugging Protocol
Hello World 必須安裝環境 無需安裝環境 支持線上預覽dotwe、App效果預覽
平臺 Android、iOS Android、iOS、H5

下面附上一張性能對比圖

r&w.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內容