Hotfix與iOS 動(dòng)態(tài)更新方案 JSPatch 與 React Native 的對比

JSPatch 是 iOS 平臺上的一個(gè)開源庫公般,只需接入極小的三個(gè)引擎文件抵卫,即可以用 JavaScript 調(diào)用和替換任意 Objective-C 方法横蜒,也就是說可以在 App 上線后通過下發(fā) JavaScript 腳本,實(shí)時(shí)修改任意 Objective-C 方法的實(shí)現(xiàn),達(dá)到修復(fù) Bug 或動(dòng)態(tài)運(yùn)營的目的蛮放。目前 JSPatch 被大規(guī)模應(yīng)用于熱修復(fù)(Hotfix),已有超過 2500 個(gè) App 接入辛燥。

雖然 JSPatch 目前大部分只用于熱修復(fù)筛武,但因?yàn)槠淇梢哉{(diào)用任意 Objective-C 方法,實(shí)際上它也可以做熱更新的工作挎塌,也就是動(dòng)態(tài)為 App 添加功能模塊徘六,并對這些功能模塊進(jìn)行實(shí)時(shí)更新,可以起到跟 React Native 一樣的作用榴都。我們從學(xué)習(xí)成本待锈、接入成本、開發(fā)效率嘴高、熱更新能力和性能體驗(yàn)這幾個(gè)方面來對比一下使用 React Native 和 JSPatch 做熱更新的差異竿音。

學(xué)習(xí)成本

React Native 是從 Web 前端開發(fā)框架 React 延伸出來的解決方案,主要解決的問題是 Web 頁面在移動(dòng)端性能低的問題拴驮,React Native 讓開發(fā)者可以像開發(fā) Web 頁面那樣用 React 的方式開發(fā)功能春瞬,同時(shí)框架會(huì)通過 JavaScript 與 Objective-C 的通信讓界面使用原生組件渲染,讓開發(fā)出來的功能擁有原生APP的性能和體驗(yàn)套啤。

這里會(huì)有一個(gè)學(xué)習(xí)成本的問題宽气,大部分 iOS 開發(fā)者并不熟悉 Web 前端開發(fā),當(dāng)他們需要一個(gè)動(dòng)態(tài)化的方案去開發(fā)一個(gè)功能模塊時(shí),若使用 React Native萄涯,就意味著他需要學(xué)習(xí) Web 前端的一整套開發(fā)技能绪氛,學(xué)習(xí)成本很高。所以目前一些使用 React Native 的團(tuán)隊(duì)里涝影,這部分功能的開發(fā)是由前端開發(fā)者負(fù)責(zé)枣察,而非終端開發(fā)者。

但前端開發(fā)者負(fù)責(zé)這部分功能也會(huì)有一些學(xué)習(xí)成本的問題燃逻,因?yàn)?React Native 還未十分成熟序目,出了 Bug 或有性能問題需要深入 React Native 客戶端代碼去排查和優(yōu)化。也就是說 React Native 是跨 Web 前端開發(fā)和終端開發(fā)的技術(shù)唆樊,要求使用者同時(shí)有這兩方面能力才能使用得當(dāng)宛琅,這不可避免地帶來學(xué)習(xí)成本的提高。

而 JSPatch 是從終端開發(fā)出發(fā)的一種方案逗旁,JSPatch 寫出來的代碼風(fēng)格與 Objective-C 原生開發(fā)一致,使用者不需要有 Web 前端的知識和經(jīng)驗(yàn)舆瘪,只需要有 iOS 開發(fā)經(jīng)驗(yàn)片效,再加上一點(diǎn) JavaScript 語法的了解,就可以很好地使用英古,對終端開發(fā)來說學(xué)習(xí)成本很低淀衣。

可以看一下同樣實(shí)現(xiàn)一個(gè)簡單的界面,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 是比較大的框架膨桥,據(jù)統(tǒng)計(jì)目前核心代碼里Objective-C 和 JavaScript 代碼加起來有 4w 行,接入后安裝包體積增大 1.8M 左右唠叛。而 JSPatch 是微型框架只嚣,只有 3 個(gè)文件 2k 行代碼,接入后增大 100K 左右艺沼。另外 React Native 需要搭建一套開發(fā)環(huán)境册舞,有很多依賴的庫,環(huán)境的搭建是一個(gè)痛點(diǎn)障般。而 JSPatch 無需搭建環(huán)境调鲸,只需拖入三個(gè)文件到工程中即可使用。

React Native 是大框架挽荡,維護(hù)起來成本也會(huì)增大藐石,在性能調(diào)優(yōu)和 Bug 查找時(shí),必須深入了解整個(gè)框架的原理和執(zhí)行流程定拟,此外 React Native 目前還未達(dá)到穩(wěn)定狀態(tài)于微,升級時(shí)踩坑不可避免。相對來說 JSPatch 接入后的維護(hù)成本會(huì)低一些,因?yàn)?JSPatch 只是作為很薄的一層轉(zhuǎn)接口角雷,沒有太多規(guī)則和框架祸穷,也就沒有太多坑,本身代碼量小勺三,需要深入了解去調(diào)試 Bug 或性能調(diào)優(yōu)時(shí)成本也低雷滚。

開發(fā)效率

在 UI 層上目前 HTML + CSS 的方式開發(fā)效率是比手寫布局高的,React Native 也是用近似 HTML+CSS 去繪制 UI吗坚,這方面開發(fā)效率相對 JSPatch 會(huì)高一些祈远,但 JSPatch 也可以借助 iOS 一些成熟的庫去提高效率,例如使用 Masonry商源,讓 UI 的開發(fā)效率不會(huì)相差太多车份。邏輯層方面的開發(fā)效率雙方是一樣的。

此外牡彻,React Native 在開發(fā)效率上的另一個(gè)優(yōu)勢是支持跨平臺扫沼,React Native 本意是復(fù)用邏輯層代碼,UI 層根據(jù)不同平臺寫不同的代碼庄吼,但 UI 層目前也可以通過 ReactMix 之類的工具做到跨平臺缎除,所以UI層和邏輯層代碼都能得到一定程度的復(fù)用。而 JSPatch 目前只能用于 iOS 平臺总寻,沒有跨平臺能力器罐。
實(shí)際上跨平臺有它適用和不適用的場景,跨平臺有它的代價(jià)渐行,就是需要兼顧每個(gè)平臺的特性轰坊,導(dǎo)致效果不佳。

跨平臺典型的適用場景是電商活動(dòng)頁面祟印,以展示為主肴沫,重開發(fā)效率輕交互體驗(yàn),但不適用于功能性的模塊旁理。對 Android 來說目前熱更新方案十分成熟樊零,Android 十分自由,可以直接用原生開發(fā)后生成 diff 包下發(fā)運(yùn)行孽文,這種無論是開發(fā)效率和效果都是最好的驻襟。所以若是重體驗(yàn)的功能模塊,Android 使用原生的熱更新方案芋哭,iOS 使用 JSPatch 開發(fā)沉衣,會(huì)更適合。

JSPatch 也做了一些事情嘗試提高開發(fā)效率减牺,例如做了 Xcode 代碼提示插件 JSPatchX豌习,讓用 JavaScript 調(diào)用 Objective-C 代碼時(shí)會(huì)出現(xiàn)代碼提示存谎,另外跟 React Native 一樣有開發(fā)時(shí)可以實(shí)時(shí)刷新界面查看修改效果的功能,目前仍在繼續(xù)做一些措施和工具提高開發(fā)效率肥隆。

熱更新能力

React Native 和 JSPatch 都能對用其開發(fā)出來的功能模塊進(jìn)行熱更新既荚,這也是這種方案最大的好處。不過 React Native 在熱更新時(shí)無法使用事先沒有做過橋接的原生組件栋艳,例如需要加一個(gè)發(fā)送短信功能恰聘,需要用到原生 MessageUI.framework 的接口,若沒有在編譯時(shí)加上提供給 JavaScript 的接口吸占,是無法調(diào)用到的晴叨。而 JSPatch 可以調(diào)用到任意已在項(xiàng)目里的組件,以及任意原生 framework 接口矾屯,不需要事先做橋接兼蕊,在熱更新的能力上,相對來說 JSPatch 的能力和自由度會(huì)更高一些件蚕。

性能體驗(yàn)

使用 React Native 和 JSPatch 性能上會(huì)比原生差點(diǎn)孙技,但都能得到比純 H5 頁面或 hybrid 更好的性能和體驗(yàn)。

JSPatch 的性能問題主要在于 JavaScript 和 Objective-C 的通信骤坐,每次調(diào)用 Objective-C 方法都要通過 Objective-C Runtime 接口绪杏,并進(jìn)行參數(shù)轉(zhuǎn)換。runtime 接口調(diào)用帶來的耗時(shí)一般不會(huì)成為瓶頸纽绍,參數(shù)轉(zhuǎn)換則需要注意避免在 JavaScript 和 Objective-C 之間傳遞大的數(shù)據(jù)集合對象。JSPatch 在性能方面也針對開發(fā)功能做了不少優(yōu)化势似,盡力減少了 JavaScript 和 Objective-C 的通信拌夏,GitHub 項(xiàng)目主頁上有完整的小 App Demo,目前來看并沒有碰到太多性能問題履因。

React Native 的性能問題會(huì)復(fù)雜一些障簿,因?yàn)榭蚣鼙旧淼哪K初始化/React 組件初始化/JavaScript 渲染邏輯等會(huì)消耗不少時(shí)間和內(nèi)存,這些地方若使用或優(yōu)化不當(dāng)都會(huì)對性能和體驗(yàn)造成影響栅迄。JavaScript 和 Objective-C 的通信也是一個(gè)耗性能的點(diǎn)站故,不過這點(diǎn)上 React Native 優(yōu)化得比較好,沒有成為主要消耗點(diǎn)毅舆。

在性能和體驗(yàn)問題上西篓,兩者有不同的性能消耗點(diǎn),從最終效果來看兩者差別不大憋活。

總結(jié)
E5FDFD5E-3CEB-4931-9A1C-0F97CABDF929.png

總的來說岂津,JSPatch在學(xué)習(xí)成本、接入成本悦即、熱更新能力上占優(yōu)吮成,而 React Native 在開發(fā)效率和跨平臺能力上占優(yōu)(見表 1)橱乱,大家可以根據(jù)需求的不同選用不同的熱更新方案。JSPatch 目前仍在不斷發(fā)展中粱甫,后續(xù)會(huì)致力于提高開發(fā)效率泳叠,完善周邊支持,歡迎參與這個(gè)開源項(xiàng)目的開發(fā)茶宵。

@bang原文鏈接
擴(kuò)展JSPatch實(shí)現(xiàn)原理詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末危纫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子节预,更是在濱河造成了極大的恐慌叶摄,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件安拟,死亡現(xiàn)場離奇詭異蛤吓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)糠赦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門会傲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拙泽,你說我怎么就攤上這事淌山。” “怎么了顾瞻?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵泼疑,是天一觀的道長。 經(jīng)常有香客問我荷荤,道長退渗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任蕴纳,我火速辦了婚禮会油,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘古毛。我一直安慰自己翻翩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布稻薇。 她就那樣靜靜地躺著嫂冻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颖低。 梳的紋絲不亂的頭發(fā)上絮吵,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機(jī)與錄音忱屑,去河邊找鬼蹬敲。 笑死暇昂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的伴嗡。 我是一名探鬼主播急波,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瘪校!你這毒婦竟也來了澄暮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤阱扬,失蹤者是張志新(化名)和其女友劉穎泣懊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體麻惶,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡馍刮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窃蹋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卡啰。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖警没,靈堂內(nèi)的尸體忽然破棺而出匈辱,到底是詐尸還是另有隱情,我是刑警寧澤杀迹,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布亡脸,位于F島的核電站,受9級特大地震影響树酪,放射性物質(zhì)發(fā)生泄漏梗掰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一嗅回、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摧茴,春花似錦绵载、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至购裙,卻和暖如春懂版,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躏率。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工躯畴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留民鼓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓蓬抄,卻偏偏與公主長得像丰嘉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子嚷缭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容