React-Native端跨平臺開發(fā)技術(shù)分析

一蜻牢、跨平臺開發(fā)技術(shù)介紹

入門路線
2015年Facebook 推出了React Native讓跨平臺開發(fā)技術(shù)火了一把,去年阿里開源了weex也朝著越來越熱的趨勢發(fā)展。為了節(jié)省開發(fā)成本,我們也得默默的跟上他們的步伐。
接下來我們會暢談各類跨平臺開發(fā)技術(shù)的優(yōu)劣背零,告訴大家為什么要選擇RN進(jìn)行開發(fā)。

市場上主流APP分類:

  • Native App(原生)
    即傳統(tǒng)的原生APP開發(fā)模式,Android基于Java語言,底層調(diào)用Google的 API;iOS基于OC或者Swift語言,底層調(diào)用App官方提供的API无埃。體驗最好徙瓶。

    • 優(yōu)點
      • 直接依托于操作系統(tǒng),交互性最強(qiáng),性能最好
      • 相比于其它模式的交互,原生APP體驗是最優(yōu)的
      • 功能最為強(qiáng)大,特別是在與系統(tǒng)交互中,幾乎所有功能都能實現(xiàn)
      • 得益于原生是直接依托于系統(tǒng)的,所以可以直接調(diào)用官方提供的api,功能最為全面(比如本地資源操作,通知,動畫等)
    • 缺點
      • 開發(fā)成本高,無法跨平臺,不同平臺Android和iOS上都要各自獨立開發(fā)
      • Android上基于Java開發(fā),iOS上基于OC或Swift開發(fā),相互之間獨立,必須要有各自的開發(fā)人員
      • 門檻較高,原生人員有一定的入門門檻,相比廣大的前端人員而言,較少
      • 原生的一個很大特點就是獨立,所以不太容易入門,不像web前端一樣那么廣泛,而且Android,iOS都需要獨立學(xué)習(xí)
  • Web App
    即移動端的網(wǎng)站,將頁面部署在服務(wù)器上,然后用戶使用各大瀏覽器訪問,不是獨立APP,無法安裝和發(fā)布
    Web網(wǎng)站一般分兩種,MPA(Multi-page Application)和SPA(Single-page Application)。而Web App一般泛指后面的SPA形式開發(fā)出的網(wǎng)站(因為可以模仿一些APP的特性)

  • 優(yōu)點

    • 開發(fā)成本低,可以跨平臺,調(diào)試方便,web app一般只需要一個前端人員開發(fā)出一套代碼,然后即可應(yīng)用于各大主流瀏覽器(特殊情況可以代碼進(jìn)行下兼容),沒有新的學(xué)習(xí)成本,而且可以直接在瀏覽器中調(diào)試
    • 維護(hù)成本低,如果代碼合理,只需要一名前端就可以維護(hù)多個web app
    • 更新最為快速,由于web app資源是直接部署在服務(wù)器端的,所以只需要替換服務(wù)器端的文件,用戶訪問是就已經(jīng)更新了(當(dāng)然需要解決一些緩存問題)
    • 無需安裝App,不會占用手機(jī)內(nèi)存,通過瀏覽器即可訪問,無需安裝,用戶就會比較愿意去用
  • 缺點

    • 性能低,用戶體驗差嫉称,由于是直接通過的瀏覽器訪問,所以無法使用原生的API,操作體驗不好
    • 依賴于網(wǎng)絡(luò),頁面訪問速度慢,耗費流量侦镇,Web App每次訪問都需要去服務(wù)端加載資源訪問,所以必須依賴于網(wǎng)絡(luò),而且網(wǎng)速慢時訪問速度很不理想,特別是在移動端,如果網(wǎng)站優(yōu)化不好會無故消耗大量流量
    • 功能受限,大量功能無法實現(xiàn),只能使用Html5的一些特殊api,無法調(diào)用原生API,所以很多功能存在無法實現(xiàn)情況
    • 臨時性入口,用戶留存率低织阅,這既是它的優(yōu)點,也是缺點,優(yōu)點是無需安裝,確定是用完后有時候很難再找到,或者說很難專門為某個web app留存一個入口,導(dǎo)致用戶很難再次使用
  • Hybrid App
    即混合開發(fā),由Native通過JSBridge等方法提供統(tǒng)一的API,然后用Html5+JS來寫實際的邏輯,調(diào)用API,這種模式下,由于Android,iOS的API一般有一致性,而且最終的頁面也是在webview中顯示,所有有跨平臺效果

  • 優(yōu)點

    • 開發(fā)成本較低,可以跨平臺,調(diào)試方便壳繁。Hybrid模式下,由原生提供統(tǒng)一的API給JS調(diào)用,實際的主要邏輯有Html和JS來完成,而由于最終是放在webview中顯示的,所以只需要寫一套代碼即可,達(dá)到跨平臺效果,另外也可以直接在瀏覽器中調(diào)試,很為方便,最重要的是只需要一個前端人員稍微學(xué)習(xí)下JS api的調(diào)用即可,無需兩個獨立的原生人員闹炉,一般Hybrid中的跨平臺最少可以跨三個平臺:Android App,iOS App,普通webkit瀏覽器
    • 學(xué)習(xí)成本較低蒿赢,這種開發(fā)模式下,只需要前端人員關(guān)注一些原生提供的API,具體的實現(xiàn)無需關(guān)心,沒有新的學(xué)習(xí)內(nèi)容,只需要前端人員即可開發(fā)。
    • 功能更加完善,性能和體驗要比起web app好太多渣触,因為可以調(diào)用原生api,所以很多功能只要原生提供出就可以實現(xiàn),另外性能也比較接近原生了
    • 部分性能要求的頁面可用原生實現(xiàn)羡棵,這應(yīng)該是Hybrid模式的最多一個好處了,因為這種模式是原生混合web,所以我們完全可以將交互強(qiáng),性能要求高的頁面用原生寫,然后一些其它頁面用JS寫,嵌入webview中,達(dá)到最佳體驗
  • 缺點

    • 相比原生,性能仍然有較大損耗,這種模式受限于webview的性能桎梏,相比原生而言有不少損耗,體驗無法和原生相比
    • 不適用于交互性較強(qiáng)的app昵观,這種模式的主要應(yīng)用是:一些新聞閱讀類,信息展示類的app;但是不適用于一些交互較強(qiáng)或者性能要求較高的app(比如動畫較多就不適合)
  • React Native App
    Facebook發(fā)起的開源的一套新的APP開發(fā)方案,使用JS+部分原生語法來實現(xiàn)功能晾腔。初次學(xué)習(xí)成本較高,但是在入門后,經(jīng)過良好的封裝也能夠?qū)崿F(xiàn)大部分的跨平臺舌稀。而且體驗很好啊犬。

    • 優(yōu)點
      • 雖然說開發(fā)成本大于Hybrid模式,但是小于原生模式,大部分代碼可復(fù)用,相比于原生模式,這種模式是統(tǒng)一用JS寫代碼,所以往往只需要一名成員投入學(xué)習(xí),即可完成跨平臺app的開發(fā),而且后續(xù)代碼封裝的好,很多功能可復(fù)用
      • 性能體驗高于Hybrid,不遜色與原生壁查,這種模式和Hybrid不一樣,Hybrid中的view層實際上還是dom,但是這種模式的view層是虛擬dom,所以性能要高于Hybrid,距離原生差距不大
        這種模式可以認(rèn)為是用JS寫原生,即頁面用JS寫,然后原生通過Bridge技術(shù)分析JS,將JS內(nèi)容單獨渲染成原生Android和iOS,所以也就是為什么性能不遜色原生
      • 開發(fā)人員單一技術(shù)棧,一次學(xué)習(xí),跨平臺開發(fā)觉至,這種模式是統(tǒng)一由JS編寫,有著獨特的語法,所以只需要學(xué)習(xí)一次,即可同時開發(fā)Android和iOS
      • 社區(qū)繁榮,遇到問題容易解決,這應(yīng)該是React Native的很大一個優(yōu)勢,不像Hybrid模式和原生模式一樣各自為營,這種模式是Facebook統(tǒng)一發(fā)起的,所以有一個統(tǒng)一的社區(qū),里面有大量資源和活躍的人員,對開發(fā)者很友好
    • 缺點
      • 雖然可以部分跨平臺,但并不是Hybrid中的一次編寫,兩次運行那種,而是不同平臺代碼有所區(qū)別
      • 這種模式實際上還是JS來寫原生,所以Android和iOS中的原生代碼會有所區(qū)別,如果需要跨平臺,對開發(fā)人員有一定要求
        當(dāng)然了,如果發(fā)展了有一定時間,組件庫夠豐富了,那么其實影響也就不大了,甚至?xí)菻ybrid更快
      • 開發(fā)人員學(xué)習(xí)有一定成本睡腿,雖然社區(qū)已經(jīng)比較成熟了,但是一個新的普通前端學(xué)習(xí)起來還是有一定學(xué)習(xí)成本的,無法像Hybrid模式一樣平滑
  • Weex app
    Weex最底層的原理是和React-Native相同的语御,就是將JS代碼渲染成原生組件,只不過在業(yè)務(wù)代碼層面席怪,Weex和React-Native有差別

    • 優(yōu)點
      • 一套代碼跨平臺应闯,只要遵循特定的語法規(guī)則,完全可以達(dá)到一套代碼多個平臺運行
      • 核心就是在web環(huán)境下挂捻,將源碼編譯成web中顯示的Html dom對象等碉纺,在原生環(huán)境下編譯成原生組件。而React-Native中刻撒,它是JS寫原生代碼骨田,不同平臺代碼是不一樣的,雖然有大部分可以復(fù)用声怔,但并不是完全一套代碼多個平臺态贤。
      • 語法接近H5,基本用法和H5一致醋火,特別是后來改成了支持VUE.JS后悠汽,使用起來更是很方便。
    • 缺點
      • 社區(qū)相比React-Native不足芥驳,是一個比較大的缺點介粘,目前相比React-Native是新生,坑更多一點

跨平臺開發(fā)的四個流派:

  • Web 流:也被稱為 Hybrid 技術(shù)晚树,它基于 Web 相關(guān)技術(shù)來實現(xiàn)界面及功能
    Web 流最常被吐槽的就是性能慢(這里指內(nèi)嵌 HTML 的性能姻采,不考慮網(wǎng)絡(luò)加載時間),以下是主要原因
    • 早期瀏覽器實現(xiàn)比較差,沒有進(jìn)行優(yōu)化
    • CSS 過于復(fù)雜慨亲,計算起來更耗時
    • DOM 提供的接口太有限婚瓜,使得難以進(jìn)行優(yōu)化

除了性能問題, Web 流更嚴(yán)重的問題是功能缺失刑棵,比如 iOS 8 就新增 4000+ API巴刻,而 Web 標(biāo)準(zhǔn)需要漫長的編寫和評審過程,增加 4000 API 這輩子是等不到了蛉签。

  • 代碼轉(zhuǎn)換流:將某個語言轉(zhuǎn)成 Objective-C胡陪、Java 或 C#,然后使用不同平臺下的官方工具來開發(fā)

    • 為了保證APP體驗碍舍,寫原生代碼是必須的柠座,但不同平臺下的官方語言不一樣,這會導(dǎo)致同樣的邏輯要寫兩次以上片橡,于是就有人想到了通過代碼轉(zhuǎn)換的方式來減少工作量妈经,比如將 Java 轉(zhuǎn)成 Objective-C。
      這種方式雖然聽起來不是很靠譜捧书,但它卻是成本和風(fēng)險都最小的吹泡,因為代碼轉(zhuǎn)換后就可以用官方提供的各種工具了,和普通開發(fā)區(qū)別不大经瓷,因此不用擔(dān)心遇到各種詭異的問題爆哑,不過需要注意生成的代碼是否可讀,不可讀的方案就別考慮了舆吮。
    • 雖然代碼轉(zhuǎn)換這種方式風(fēng)險小揭朝,但我覺得對于很多小 APP 來說共享不了多少代碼,因為這類應(yīng)用大多數(shù)圍繞 UI 來開發(fā)的歪泳,大部分代碼都和 UI 耦合萝勤,所以公共部分不多。
      在目前的所有具體方案中呐伞,只有 j2objc 可以嘗試敌卓,其它都不成熟。
  • 編譯流:將某個語言編譯為二進(jìn)制文件伶氢,生成動態(tài)庫或打包成 apk/ipa/xap 文件
    編譯流比前面的代碼轉(zhuǎn)換更進(jìn)一步趟径,它直接將某個語言編譯為普通平臺下的二進(jìn)制文件,這種做法有明顯的優(yōu)缺點:

    • 優(yōu)點
      • 可以重用一些實現(xiàn)很復(fù)雜的代碼癣防,比如之前用 C++ 實現(xiàn)的游戲引擎蜗巧,重寫一遍成本太高
      • 編譯后的代碼反編譯困難
      • 或許性能會好些(具體要看實現(xiàn))
    • 缺點
      • 如果這個工具本身有 Bug 或性能問題,定位和修改成本會很高
      • 編譯后體積不小蕾盯,尤其是如果要支持 ARMv8 和 x86 的話
  • 虛擬機(jī)流:通過將某個語言的虛擬機(jī)移植到不同平臺上來運行
    除了編譯為不同平臺下的二進(jìn)制文件幕屹,還有另一種常見做法是通過虛擬機(jī)來支持跨平臺運行,比如 JavaScript 和 Lua 都是天生的內(nèi)嵌語言,所以在這個流派中很多方案都使用了這兩個語言望拖。

    • 不過虛擬機(jī)流會遇到兩個問題:一個是性能損耗渺尘,另一個是虛擬機(jī)本身也會占不小的體積。
    • React Native 的思路簡單來說就是在不同平臺下使用平臺自帶的 UI 組件说敏。同時 React Native 和 Web 扯不上太多關(guān)系鸥跟,我們熟知的 Web 是指 W3C 定義的那些規(guī)范,比如 HTML盔沫、CSS医咨、DOM,而 React Native 主要是借鑒了 CSS 中的 Flexbox 寫法架诞,還有 navigator拟淮、XMLHttpRequest 等幾個簡單的 API,更別說完全沒有 Web 的開放性侈贷,所以 React Native 和 HTML 5 完全不是一回事惩歉。
    • React Native 比傳統(tǒng) Objective-C 和 UIView 的學(xué)習(xí)成本低多了等脂,熟悉 JavaScript 的開發(fā)者應(yīng)該半天內(nèi)就能寫個使用標(biāo)準(zhǔn) UI 的界面俏蛮,而且用 XML+CSS 畫界面也遠(yuǎn)比 UIView 中用 Frame 進(jìn)行手工布局更易讀
    • 它目前已經(jīng)有組件倉庫了,而且在 github 上都有 500 多倉庫了上遥,其中有 sqlite搏屑、Camera 等原生組件,隨著這些第三方組件的完善粉楚,基于 React Native 開發(fā)越來越不需要寫原生代碼了辣恋。

二、RN開發(fā)環(huán)境搭建

React Native (簡稱RN)是Facebook于2015年4月開源的跨平臺移動應(yīng)用開發(fā)框架模软,是Facebook早先開源的UI框架 React 在原生移動應(yīng)用平臺的衍生產(chǎn)物伟骨,目前支持iOS和安卓兩大平臺。RN使用Javascript語言燃异,類似于HTML的JSX携狭,以及CSS來開發(fā)移動應(yīng)用,因此熟悉Web前端開發(fā)的技術(shù)人員只需很少的學(xué)習(xí)就可以進(jìn)入移動應(yīng)用開發(fā)領(lǐng)域

三单默、創(chuàng)建我們第一個RN項目

  • React Native項目創(chuàng)建
react-native init YochiProject
cd YochiProject
react-native run-ios(運行iOS應(yīng)用)
react-native run-android(運行安卓應(yīng)用)
對應(yīng)的目錄下分別為Android和iOS工程
  • 打開WebStorm,導(dǎo)入我們的項目即可開始開發(fā)了



運行成功后的效果 點擊模擬器command+R刷新
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末忘瓦,一起剝皮案震驚了整個濱河市搁廓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖境蜕,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件线欲,死亡現(xiàn)場離奇詭異,居然都是意外死亡汽摹,警方通過查閱死者的電腦和手機(jī)李丰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逼泣,“玉大人趴泌,你說我怎么就攤上這事±” “怎么了嗜憔?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長氏仗。 經(jīng)常有香客問我吉捶,道長,這世上最難降的妖魔是什么皆尔? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任呐舔,我火速辦了婚禮,結(jié)果婚禮上慷蠕,老公的妹妹穿的比我還像新娘珊拼。我一直安慰自己,他們只是感情好流炕,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布澎现。 她就那樣靜靜地躺著,像睡著了一般每辟。 火紅的嫁衣襯著肌膚如雪剑辫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天渠欺,我揣著相機(jī)與錄音妹蔽,去河邊找鬼。 笑死峻堰,一個胖子當(dāng)著我的面吹牛讹开,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捐名,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼旦万,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了镶蹋?” 一聲冷哼從身側(cè)響起成艘,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤赏半,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后淆两,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體断箫,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年秋冰,在試婚紗的時候發(fā)現(xiàn)自己被綠了仲义。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡剑勾,死狀恐怖埃撵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情虽另,我是刑警寧澤暂刘,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站捂刺,受9級特大地震影響谣拣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜族展,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一森缠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧苛谷,春花似錦辅鲸、人聲如沸格郁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽例书。三九已至锣尉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間决采,已是汗流浹背自沧。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留树瞭,地道東北人拇厢。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像晒喷,于是被迫代替她去往敵國和親孝偎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345