ReactNative介紹

ReactNative 發(fā)展歷史

起源

React Native 想法來源于2013年的 Facebook 內(nèi)部黑客馬拉松(hackathon)
React Native: A year in review

In the beginning: React Native’s roots
In the essence of Facebook’s hacker culture, React Native started as a hackathon project in the summer of 2013. Similar to React, React Native seemed like a boldly unconventional idea. It wasn’t clear this would actually work. How was touch negotiation between JS and native ScrollViews going to work? What about performance, and what about debugging? None of these challenges stopped the engineers from focusing and pushing forward.

React Native: Bringing modern web techniques to mobile

隨著React的快速發(fā)展瞭亮,F(xiàn)acebook越發(fā)感受到 React 以及 Web 技術的優(yōu)勢礼烈,同時Native在““Move fast” 這一塊的糟糕表現(xiàn)科吭,所以就引發(fā)了將Web先進技術引進Native的開發(fā),

  • 快速開發(fā)(Rapid development velocity):刷新瀏覽器即可生效,不必等待重新編譯 App
  • 快速迭代(Rapid iteration cycle):Web 一天兩版豺憔,產(chǎn)品迭代周期更短
  • 快速反饋(Immediate testing feedback):Web 發(fā)布立即觸達用戶爵政,A/B test 等實驗結果立等可取碴裙,產(chǎn)品演進更快

為了實現(xiàn)這個目標钢悲,F(xiàn)aceBook嘗試過三種方案

  1. Using WebViews 点额,通過Native提供容器舔株,使用Web進行開發(fā)。這樣能全面利用Web的開發(fā)經(jīng)驗并且具備WEB技術的一樣可擴展性还棱,但最終渲染性能并不理想载慈,而且因為全部是Web技術開發(fā)也沒有沉淀很好的Native技術
  2. Porting React to native,把React移植到native實現(xiàn)珍手,15年推出了iOS componentkit 以及在17年推出了Android Litho 办铡。實現(xiàn)了很多React的特性,例如可預測性UI琳要、聲明式寡具。但沒有實現(xiàn)提升效率的初衷,仍然需要重新編譯稚补。另外需要進行雙端適配童叠。而且Web React的生態(tài)建設也不能直接復用。
  3. Scripting native课幕,通過 JavaScript 調(diào)用 Native API厦坛。既能擁有 Web 開發(fā)的快速迭代能力五垮,還不局限于 Web 技術,同時也沒有脫離 JavaScript 生態(tài)杜秸,似乎是個完美的方案放仗,然而實踐并沒有那么簡單。主要是Native環(huán)境和JS環(huán)境來回通信撬碟,過多的通信承載以及引起的UI線程阻塞都會帶來性能損害诞挨。 但最終幸運的是React整體的技術模型仍然可以向著正確的方向演進

發(fā)展

2015

unveil three new technologies that we’ve been using internally at Facebook for some time: GraphQL, Relay, and React Native.

React Native is a framework for native environments that allows developers to build first-class iOS and Android user interfaces with no browser/WebView involved

2016

2017

  • February 14, 2017:Using Native Driver for Animated持偏,支持Native驅(qū)動動畫,早期動畫實現(xiàn)在JS線程中氨肌,這容易因JS線程Block造成動畫的跳幀鸿秆。
  • March 13, 2017:Better List Views in React Native,提供FlatList和SectionList更好的支持列表實現(xiàn)怎囚。同時也提到了一些注意事項卿叽,譬如非屏幕部分是異步渲染,所以在快速滑動的時候可能會引起白屏。
  • March 13, 2017:Introducing Create React Native App附帽,推出官方腳手架支持App創(chuàng)建
  • August 7, 2017:React Native Performance in Marketplace埠戳,介紹 Facebook 在其 React Native 主應用(Marketplace)上的性能優(yōu)化實踐,后續(xù)計劃優(yōu)化編譯時的性能優(yōu)化探索蕉扮,如Prepack整胃,期望大幅削減 React Native core 的初始化耗時
    image

2018

  • January 18, 2018:Implementing Twitter’s App Loading Animation in React Native,Twitter動畫的一些實踐喳钟,并且在動畫方面有一些成果屁使,F(xiàn)ade、Scale奔则、Hide
  • March 22, 2018:Building <InputAccessoryView> For React Native蛮寂,支持 InputAccessoryView組件
  • May 7, 2018:Using TypeScript with React Native,支持TS語言
  • June 14, 2018:State of React Native 2018易茬,介紹團隊正在對整體架構進行重構升級酬蹋,旨在使得框架更加輕量和更加監(jiān)控,主要聚焦三個方面
    1. 針對高優(yōu)先級的更新可以在任何線程同步調(diào)用JS線程抽莱,以及取代每次UI更新需要經(jīng)歷三層線程模型范抓,使得JS線程可以根據(jù)。
    2. 合并異步渲染以及簡化異步數(shù)據(jù)處理
    3. 輕量化橋?qū)崿F(xiàn)食铐,JS和Native之間橋交互性能更高效
  • July 4, 2018:Releasing 0.56匕垫,發(fā)布 0.56,升級 Babel虐呻、Android SDK象泵、Xcode、Flow 等依賴版本
  • November 1, 2018:Open Source Roadmap斟叼,計劃精簡核心模塊偶惠,并開源 Facebook 內(nèi)部的一些基建
  • January 7, 2019: The State of the React Native Community in 2018,說明2018計劃更好地支持 Native & React Native 混合 App犁柜,核心團隊啟動了架構升級計劃(Fabric)洲鸠,包括重構線程模型、支持 React async rendering 能力馋缅、簡化 React Native core 等大改。

2019

2020

ReactNative 運行原理

系統(tǒng)設計

整體由React治泥、JavaScript、Bridge遮精、Native四層組成居夹,Native負責UI更新及交互處理,JavaScript調(diào)用Native能力實現(xiàn)業(yè)務功能本冲,Bridge則為兩者之間提供通信橋梁

  • 最上層提供類 React 支持吮播,運行在JavaScriptCore提供的 JavaScript 運行時環(huán)境中
  • Bridge 層將 JavaScript 與 Native 環(huán)境連接起來,JSON用來傳遞UI更新信息眼俊,Shadow Tree 用來定義 UI 效果及交互功能意狠,Native Modules 提供 Native 功能(比如藍牙),二者之間通過 JSON 消息相互通信
    • 異步(asynchronous):不依賴于同步通信
    • 可序列化(serializable):保證一切 UI 操作都能序列化成 JSON 并轉換回來
    • 批處理(batched):對 Native 調(diào)用進行排隊疮胖,批量處理

系統(tǒng)分層

image

系統(tǒng)結構(Android)(引用)

image

線程模型

React Native 中主要有3種線程

  • UI Thread:Android/iOS(或其它平臺)應用中的主線程
  • Shadow Thread:進行布局計算和構造 UI 界面的線程
  • JS Thread:React或其它JavaScript 代碼都在這個線程執(zhí)行

此外环戈,還有一類 Native Modules 線程,不同的 Native Module 可以運行在不同的線程中http://chain-react-bridging.surge.sh/dist/96efedea67e784036f946c487a06cdc9.png

線程工作流程

image

[圖片上傳失敗...(image-e9c98f-1588644627850)]

線程交互流程

image

啟動流程

  • 啟動RN App
  • 加載JavaScript VM澎灸、JavaScript Bundle院塞、NativeModule
  • 執(zhí)行JavaScript bundle
  • native調(diào)用、shadow tree創(chuàng)建性昭、布局拦止、NativeView創(chuàng)建
  • View渲染

整體啟動流程

image

官方啟動時間模塊劃分

image

渲染流程

事件傳遞

image

首次渲染

image

更新渲染

image

架構演進

2018 年 6 月啟動了架構升級計劃 Fabric,重構線程模型并簡化 React Native Core糜颠,以更好地支持 Native & React Native 混合 App

以前架構問題:

  • 異步:無法將 JavaScript 邏輯直接與許多需要同步的 Native API 集成
  • 同步橋支持差:在官方代碼注釋中提到汹族,同步橋存在嚴重的性能問題,并且會引入線程BUG
  • 通信性能瓶頸:JS與Native通信采用消息隊列的方式其兴,傳輸過程中需要將要傳遞的消息序列化為JSON顶瞒。當傳輸數(shù)據(jù)量變大時,橋上會出現(xiàn)擁塞

改進方向

React 層

提供 CodeGen 工具來保證消息通信的類型安全元旬,以解決 JavaScript 與 Native 通信中被廣為詬病的 Bridge API 數(shù)據(jù)類型問題

JavaScript 層

上層 JavaScript 代碼需要一個運行時環(huán)境榴徐,在 React Native 中這個環(huán)境是 JSC(JavaScriptCore)守问。不同于之前直接將 JavaScript 代碼輸入給 JSC,新的架構中引入了一層 JSI(JavaScript Interface)坑资,作為 JSC 之上的抽象耗帕,用來屏蔽 JavaScript 引擎的差異,允許換用不同的 JavaScript 引擎(如Hermes)

Bridge 層

劃分成 Fabric 和 TurboModules 兩部分袱贮,分別負責 UI 管理與 Native 模塊

Fabric 期望以更現(xiàn)代化的方式去實現(xiàn) React Native 的渲染層仿便,簡化之前渲染流程中復雜跨線程交互(React -> Native -> Shadow Tree -> Native UI)。具體的字柠,直接在 C++層創(chuàng)建 JavaScript 與 Native 共享的 Shadow Tree探越,并通過 JSI 層將 UI 操作接口暴露給 JavaScript,允許 JavaScript 直接控制高優(yōu)先級的 UI 操作窑业,甚至允許同步調(diào)用(應對列表快速滾動钦幔、頁面切換、手勢處理等場景)

TurboModules 之前所有 Native Modules(無論是否需要用到)都要在應用啟動時進行初始化常柄,因為 Native 不知道 JavaScript 將會調(diào)用哪些功能模塊鲤氢。而新的TurboModules 允許按需加載 Native 模塊,并在模塊初始化之后直接持有其引用西潘,不再依靠消息通信來調(diào)用模塊功能卷玉。因此,應用的啟動時間也會有所提升

Native 層

精簡核心模塊喷市,將非核心部分拆分出去作為社區(qū)模塊獨立更新維護相种,理論上 React Native 應該是通用的,對平臺無感知品姓,這是能夠支持Web寝并、Windows等不同平臺的關鍵
雖然 Native 不在 React Native 的掌控中,無法垂直地深入優(yōu)化腹备,但可以進行橫向的精簡衬潦,將非核心的部分代碼拆分出去作為社區(qū)模塊,如 AsyncStorage植酥、ImageStore镀岛、MaskedViewIOS、NetInfo 等等友驮。一方面縮減包體積漂羊,另一方面也有利于這些模塊的獨立更新維護

[圖片上傳失敗...(image-3798ee-1588644627850)]


參考
CHANGELOG
The New React Native Architecture Explained
React.js Conf 2016 - Tadeu Zagallo - Optimising React Native: Tools and Tips
Bridging in React Native
React Native - Fabric review-2018-07-25
How React Native constructs app layouts (and how Fabric is about to change it)
React Native
ReactNative源碼篇

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市喊儡,隨后出現(xiàn)的幾起案子拨与,更是在濱河造成了極大的恐慌,老刑警劉巖艾猜,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件买喧,死亡現(xiàn)場離奇詭異,居然都是意外死亡匆赃,警方通過查閱死者的電腦和手機淤毛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來算柳,“玉大人低淡,你說我怎么就攤上這事∷蚕睿” “怎么了蔗蹋?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長囱淋。 經(jīng)常有香客問我猪杭,道長,這世上最難降的妖魔是什么妥衣? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任皂吮,我火速辦了婚禮,結果婚禮上税手,老公的妹妹穿的比我還像新娘蜂筹。我一直安慰自己,他們只是感情好芦倒,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布艺挪。 她就那樣靜靜地躺著,像睡著了一般兵扬。 火紅的嫁衣襯著肌膚如雪麻裳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天周霉,我揣著相機與錄音掂器,去河邊找鬼。 笑死俱箱,一個胖子當著我的面吹牛国瓮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播狞谱,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼乃摹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了跟衅?” 一聲冷哼從身側響起孵睬,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎伶跷,沒想到半個月后掰读,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秘狞,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年蹈集,在試婚紗的時候發(fā)現(xiàn)自己被綠了烁试。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡拢肆,死狀恐怖减响,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情郭怪,我是刑警寧澤支示,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站鄙才,受9級特大地震影響颂鸿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咒循,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一据途、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叙甸,春花似錦颖医、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至僚祷,卻和暖如春佛致,著一層夾襖步出監(jiān)牢的瞬間晌缘,已是汗流浹背确垫。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工崖飘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留马胧,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓坪创,卻偏偏與公主長得像承绸,于是被迫代替她去往敵國和親枯怖。 傳聞我的和親對象是個殘疾皇子蜕琴,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345