iOS 動態更新方案 JSPatch 與 React Native 的對比
JSPatch 是 iOS 平臺上的一個開源庫,只需接入極小的三個引擎檔案,即可以用 JavaScript 呼叫和替換任意 Objective-C 方法,也就是說可以在 App 上線後通過下發 JavaScript 指令碼,實時修改任意 Objective-C 方法的實現,達到修復 Bug 或動態運營的目的。目前 JSPatch 被大規模應用於熱修復(Hotfix),已有超過 2500 個 App 接入。
雖然 JSPatch 目前大部分只用於熱修復,但因為其可以呼叫任意 Objective-C 方法,實際上它也可以做熱更新的工作,也就是動態為 App 新增功能模組,並對這些功能模組進行實時更新,可以起到跟
學習成本
React Native 是從 Web 前端開發框架 React 延伸出來的解決方案,主要解決的問題是 Web 頁面在移動端效能低的問題,React Native 讓開發者可以像開發 Web 頁面那樣用 React 的方式開發功能,同時框架會通過 JavaScript 與 Objective-C 的通訊讓介面使用原生元件渲染,讓開發出來的功能擁有原生APP的效能和體驗。
這裡會有一個學習成本的問題,大部分 iOS 開發者並不熟悉 Web 前端開發,當他們需要一個動態化的方案去開發一個功能模組時,若使用 React Native,就意味著他需要學習 Web 前端的一整套開發技能,學習成本很高。所以目前一些使用 React Native 的團隊裡,這部分功能的開發是由前端開發者負責,而非終端開發者。
但前端開發者負責這部分功能也會有一些學習成本的問題,因為 React Native 還未十分成熟,出了 Bug 或有效能問題需要深入 React Native 客戶端程式碼去排查和優化。也就是說 React Native 是跨 Web 前端開發和終端開發的技術,要求使用者同時有這兩方面能力才能使用得當,這不可避免地帶來學習成本的提高。
而 JSPatch 是從終端開發出發的一種方案,JSPatch 寫出來的程式碼風格與 Objective-C 原生開發一致,使用者不需要有 Web 前端的知識和經驗,只需要有 iOS 開發經驗,再加上一點 JavaScript 語法的瞭解,就可以很好地使用,對終端開發來說學習成本很低。
可以看一下同樣實現一個簡單的介面,React Native 和 JSPatch 程式碼的對比:
//React Native
class HelloWorld extends Component {
render() {
return (
<View style={styles.btnArea}>
<View style={styles.btnWrapper}>
<TouchableHighlight underlayColor="#ED5F37” onPress={this.login}
activeOpacity={0.7}>
<Text style={styles.btn}>登入</Text>
</TouchableHighlight>
</View>
</View>
);
}
login(){
};
}
var styles = StyleSheet.create({
btnArea: {
justifyContent: 'center',
marginLeft: 20,
marginRight: 20,
marginTop: 100,
flexDirection: 'row',
},
btnWrapper: {
backgroundColor: '#FC6E50',
borderRadius: 5,
flex: 1
},
btn: {
paddingTop: 10,
paddingBottom: 10,
color: '#ffffff',
textAlign: 'center',
},
});
//JSPatch
require('UIColor, UIScreen, UIButton')
defineClass('HelloWord : UIView', {
initWithFrame: function(frame) {
if(self = super.initWithFrame(frame)){
var screenWidth = UIScreen.mainScreen().bounds().width
var loginBtn = UIButton.alloc().initWithFrame({x: 20, y: 50, width: screenWidth - 40, height: 30});
loginBtn.setBackgroundColor(UIColor.greenColor())
loginBtn.setTitle_forState("Login", 0)
loginBtn.layer().setCornerRadius(5)
loginBtn.addTarget_action_forControlEvents(self, 'handleBtn', 1<<6);
self.addSubview(loginBtn);
}
return self;
},
handleBtn: function() {
}
})
接入成本
接入成本上,React Native 是比較大的框架,據統計目前核心程式碼裡 Objective-C 和 JavaScript 程式碼加起來有 4w 行,接入後安裝包體積增大 1.8M 左右。而 JSPatch 是微型框架,只有 3 個檔案 2k 行程式碼,接入後增大 100K 左右。另外 React Native 需要搭建一套開發環境,有很多依賴的庫,環境的搭建是一個痛點。而 JSPatch 無需搭建環境,只需拖入三個檔案到工程中即可使用。
React Native 是大框架,維護起來成本也會增大,在效能調優和 Bug 查詢時,必須深入瞭解整個框架的原理和執行流程,此外 React Native 目前還未達到穩定狀態,升級時踩坑不可避免。相對來說 JSPatch 接入後的維護成本會低一些,因為 JSPatch 只是作為很薄的一層轉介面,沒有太多規則和框架,也就沒有太多坑,本身程式碼量小,需要深入瞭解去除錯 Bug 或效能調優時成本也低。
開發效率
在 UI 層上目前 HTML + CSS 的方式開發效率是比手寫佈局高的,React Native 也是用近似 HTML+CSS 去繪製 UI,這方面開發效率相對 JSPatch 會高一些,但 JSPatch 也可以藉助 iOS 一些成熟的庫去提高效率,例如使用 Masonry,讓 UI 的開發效率不會相差太多。邏輯層方面的開發效率雙方是一樣的。
此外,React Native 在開發效率上的另一個優勢是支援跨平臺,React Native 本意是複用邏輯層程式碼,UI 層根據不同平臺寫不同的程式碼,但 UI 層目前也可以通過 ReactMix 之類的工具做到跨平臺,所以UI層和邏輯層程式碼都能得到一定程度的複用。而 JSPatch 目前只能用於 iOS 平臺,沒有跨平臺能力。
實際上跨平臺有它適用和不適用的場景,跨平臺有它的代價,就是需要兼顧每個平臺的特性,導致效果不佳。
跨平臺典型的適用場景是電商活動頁面,以展示為主,重開發效率輕互動體驗,但不適用於功能性的模組。對 Android 來說目前熱更新方案十分成熟,Android 十分自由,可以直接用原生開發後生成 diff 包下發執行,這種無論是開發效率和效果都是最好的。所以若是重體驗的功能模組,Android 使用原生的熱更新方案,iOS 使用 JSPatch 開發,會更適合。
JSPatch 也做了一些事情嘗試提高開發效率,例如做了 Xcode 程式碼提示外掛 JSPatchX,讓用 JavaScript 呼叫 Objective-C 程式碼時會出現程式碼提示,另外跟 React Native 一樣有開發時可以實時重新整理介面檢視修改效果的功能,目前仍在繼續做一些措施和工具提高開發效率。
熱更新能力
React Native 和 JSPatch 都能對用其開發出來的功能模組進行熱更新,這也是這種方案最大的好處。不過 React Native 在熱更新時無法使用事先沒有做過橋接的原生元件,例如需要加一個傳送簡訊功能,需要用到原生 MessageUI.framework 的介面,若沒有在編譯時加上提供給 JavaScript 的介面,是無法呼叫到的。而 JSPatch 可以呼叫到任意已在專案裡的元件,以及任意原生 framework 介面,不需要事先做橋接,在熱更新的能力上,相對來說 JSPatch 的能力和自由度會更高一些。
效能體驗
使用 React Native 和 JSPatch 效能上會比原生差點,但都能得到比純 H5 頁面或 hybrid 更好的效能和體驗。
JSPatch 的效能問題主要在於 JavaScript 和 Objective-C 的通訊,每次呼叫 Objective-C 方法都要通過 Objective-C Runtime 介面,並進行引數轉換。runtime 介面呼叫帶來的耗時一般不會成為瓶頸,引數轉換則需要注意避免在 JavaScript 和 Objective-C 之間傳遞大的資料集合物件。JSPatch 在效能方面也針對開發功能做了不少優化,盡力減少了 JavaScript 和 Objective-C 的通訊,GitHub 專案主頁上有完整的小 App Demo,目前來看並沒有碰到太多效能問題。
React Native 的效能問題會複雜一些,因為框架本身的模組初始化/React 元件初始化/JavaScript 渲染邏輯等會消耗不少時間和記憶體,這些地方若使用或優化不當都會對效能和體驗造成影響。JavaScript 和 Objective-C 的通訊也是一個耗效能的點,不過這點上 React Native 優化得比較好,沒有成為主要消耗點。
在效能和體驗問題上,兩者有不同的效能消耗點,從最終效果來看兩者差別不大。
總結
框架 | 學習成本 | 接入成本 | 熱更新能力 | 開發效率 | 效能體驗 |
---|---|---|---|---|---|
React Native | 高 | 高 | 中 | 高,跨平臺 | 高 |
JSPatch | 低 | 低 | 高 | 中,不跨平臺 | 高 |
總的來說,JSPatch在學習成本、接入成本、熱更新能力上佔優,而 React Native 在開發效率和跨平臺能力上佔優(見表 1),大家可以根據需求的不同選用不同的熱更新方案。JSPatch 目前仍在不斷髮展中,後續會致力於提高開發效率,完善周邊支援,歡迎參與這個開源專案的開發。
相關推薦
iOS 動態更新方案 JSPatch 與 React Native 的對比
JSPatch 是 iOS 平臺上的一個開源庫,只需接入極小的三個引擎檔案,即可以用 JavaScript 呼叫和替換任意 Objective-C 方法,也就是說可以在 App 上線後通過下發 JavaScript 指令碼,實時修改任意 Objective-C 方法的實
Flutter 與React Native 對比
最近做了兩個React Native(以後簡稱RN)的專案,重新Review一下相關的專案程式碼,期望下次使用的時候可以有更好的結構,更好的規範和約束已幫助大家減少bug,提高開發效率; 在做了一些原生Android開發,iOS開發和基於Cordova的混合開發之後,對
Angular團隊公布路線圖,並演示怎樣與React Native集成
content ogl date pda andro 演講稿 服務 團隊 stat 本文來源於我在InfoQ中文站翻譯的文章,原文地址是:http://www.infoq.com/cn/news/2015/06/angular-2-react-native-roadmap
iOS原生專案(Objective-C)整合React Native(0.57.3版本)圖文教程--(3)style的全部有效屬性
iOS原生專案(Objective-C)整合React Native(0.57.3版本)圖文教程–(3)style的全部有效屬性 Valid style props: [ "alignContent", "alignItems", "alignSelf", "aspe
iOS原生專案(Objective-C)整合React Native(0.57.3版本)圖文教程--(2)整合過程
iOS原生專案(Objective-C)整合React Native(0.57.3版本)圖文教程–(1)基本環境 iOS原生專案(Objective-C)整合React Native(0.57.3版本)圖文教程–(2)整合過程 文章目錄 iOS原生
iOS原生專案(Objective-C)整合React Native(0.57.3版本)圖文教程--(1)基本環境
文章目錄 iOS原生專案(Objective-C)整合React Native(0.57.3版本)圖文教程--(1)基本環境 1. Homebrew 2. Node 3. Yarn 4. react-nat
一次掌握 React 與 React Native 兩個框架
此係列文章將整合我的 React 視訊教程與 React Native 書籍中的精華部分,給大家介紹 React 與 React Native 結合學習的方法。 1. 軟體開發語言與框架的學習本質 我們在開始系列文章的技術點內容前,花一點時間探討一下軟體開發語言以及框架的學習本質,相對於整個技術點的講解,花這
React 與 React Native 底層共識:React 是什麼
此係列文章將整合我的 React 視訊教程與 React Native 書籍中的精華部分,給大家介紹 React 與 React Native 結合學習的方法,此小節主要介紹 React 的底層原理與機制。 目前 React 可以說是前端世界最火熱的框架,具有高效能以及容易上手的特性,而且在掌握了 Reac
《React Native 精解與實戰》書籍連載「Android 平臺與 React Native 混合開發」
此文是我的出版書籍《React Native 精解與實戰》連載分享,此書由機械工業出版社出版,書中詳解了 React Native 框架底層原理、React Native 元件佈局、元件與 API 的介紹與程式碼實戰,以及 React Native 與 iOS、Android 平臺的混合開發底層原理講解與程式
JavaScript Nodejs React Js 與React Native之間的關係是怎樣的?
JavaScript是一種(最好的)程式語言, 主要作為前端開發中用來增加網頁的動態功能,比如操作DOM, 讀取使用者輸入, 動畫效果, 提 交伺服器請求(Ajax).JavaScript 是什麼? - 前端開發 NodeJs 是基於JavaScript的,可以做為後臺開發的語言. 提供了很多系統級的AP
iOS 熱更新方案
以下是iOS app熱更新的幾種方案, 由於蘋果在2017年3月左右更新了開發者協議, 禁止需要線上稽核的應用進行熱更新, 所以請大家慎用 (企業版不需要提交稽核當然是可以使用的) 一、JSPatch 熱更新時,從伺服器拉去js指令碼。理論上可以修改和新建所有的模
輕量級低風險 iOS 熱更新方案
點選上方“iOS開發”,選擇“置頂公眾號”關鍵時刻,第一時間送達!我們都知道蘋果對 Hotfix
react native 熱更新與程式簡單除錯
1.如何開啟Developer Menu 模擬器:ctrl+m 真機:搖一搖手機即可 2.除錯及熱更新準備工作:當真機使用資料線或者模擬器時可以忽略,建議
從零開始搭建Detox自動化測試框架測試React Native (IOS/Andriod)也許是全網最全的教程 持續更新中
構建APP並執行用例 構建APP 編譯 debug模式 detox build --configuration ios.sim.debug release模式 detox build --configuration ios.sim.release 5.2 執
React Native和原生iOS Objective-C的互動解決方案
用一個RCTRootView作為iOS裡一個Controller的view。在RN層的左上角返回按鈕點選後pop回iOS層。發現無法執行,除錯發現controller的navigationCont的值是空的。發現與RN互動的這個self地址和iOS層的self並不是同一個
React-Native與iOS原生的整合步驟
需求: 最近準備在公司專案中使用RN,但羅馬不是一天建成的,沒辦法將專案中所有的程式碼都換成RN,而且我也不認為全換成RN就是好的,所以準備先將專案中的一些頁面改成RN開發。這篇文章就是與iOS原生整合的步驟。 我將專案更新到了github上,裡面有很多我自己的
React Native iOS詳細打包步驟(2018.04更新)
1.在自己專案的ios資料夾下新建一個資料夾取名bundle(ps:ios資料夾和node_modules資料夾在同一級目錄下,這個bundle資料夾名稱隨意取,後面要用到,但是記得在相應地方改一下就好了) 2.為了方便,將打包命令寫到專案package.json檔案裡,
React Native 與原生之間的通訊(iOS)
本文將講述下在原生和React Native之間的通訊方式。方式和邏輯綜合了自己的思維方式,主要參考了React Native中文官方文件,因為感覺它講的方式有些不妥,所以就按自己思路組織了下文。 雖然發覺一遍文章要把所有通訊方式講清楚不太科學,不過把思路講講倒是可以,
iOS客戶端React-Native增量更新實踐
市場上現存方案:微軟的 CodePush 以及React-Native中文網的Pushy,大家可根據公司實際情況酌情選擇。 處於安全性的考慮,公司禁止向第三方平臺上傳原始碼相關檔案,所以要自己動手實現。 增量更新主要實現流程 1.使用react-nativ
【REACT NATIVE 系列教程之十一】外掛的安裝、使用與更新(示例:REACT-NATIVE-TAB-NAVIGATOR)
本篇主要來詳細介紹如何安裝、升級外掛及講解一個react-native-tab-navigator的示例。本文舉例使用的外掛:react-native-tab-navigator ,選項卡形式的導航1. 通過 https://www.npmjs.com 找到我們想使用的外掛, 搜尋:react-native