前言:
ReactNative是什么不必贅述;它的優(yōu)點(diǎn)以及好處也無(wú)需多言;直接上主菜;
1:平臺(tái)差異
著重于ios/android共用一套代碼,這樣可以省去人員投入;所以在js代碼中盡量采用一套代碼實(shí)現(xiàn);這樣的結(jié)果是很多現(xiàn)成的native模塊很可能得重新用js實(shí)現(xiàn)一遍;倘若新項(xiàng)目中用到的native模塊并不多;所有業(yè)務(wù)以及模塊采用js實(shí)現(xiàn)是個(gè)不錯(cuò)的方案;js中需要用到的值在native代碼的入口處一并傳過來(lái)例如
android:
ios:
以后涉及到業(yè)務(wù)變更時(shí)毋須修改兩次;差異化的地方加以區(qū)分;比如調(diào)用了native模塊的不得不采用分開的代碼實(shí)現(xiàn)的
即使ReactNative的口號(hào)是learn once write anywhere;我們也能稍加變動(dòng)實(shí)現(xiàn)write once run anywhere
2:瘦身native
所有的資源包括圖片字體等除了在native代碼里必須使用的;都放在了js端;與js打包并壓縮放在ios/android的工程目錄下(壓縮后能讓壓縮包的體積比如我的項(xiàng)目的壓縮包就只有400來(lái)K大大縮小apk/ipa包的體積,打包請(qǐng)移步第三部分);生成的apk/ipa里面就有了一份jsBundle以及對(duì)應(yīng)的資源;
app啟動(dòng)時(shí)候的第一個(gè)界面一般是歡迎或者登陸或者介紹頁(yè);該部分的頁(yè)面部分不會(huì)太多;采用native來(lái)實(shí)現(xiàn);并在后臺(tái)開始默默解壓此壓縮包到指定目錄(該目錄即為即將進(jìn)入的ReactNative頁(yè)面部分的入口,如果該目錄或者文件已經(jīng)存在;則說(shuō)明已經(jīng)解壓過了略過即可,我采用的目錄ios為/Docoment/xxx;安卓為/data/data/xxx);這樣做的好處在于以后需要更新jsBundle的時(shí)候直接下載壓縮包解壓后覆蓋該目錄的內(nèi)容即可(如有采用其他方式更新的比如codePush則不在此列舉之內(nèi);我并沒有采用codePush的更新方式;如有采用的請(qǐng)另尋方案);相應(yīng)的入口部分代碼就就的對(duì)應(yīng)壓縮后的目錄里的bundle
andriod的入口部分js位置即為指向指定目錄的filepath;
ios:
3:打包
打包的腳本和實(shí)現(xiàn)google一些能搜出一打來(lái);這里參考
https://segmentfault.com/a/1190000004189538
https://segmentfault.com/a/1190000004192816
我采用方式跟以上博客略有不同;在于我并沒有直接到包到對(duì)應(yīng)的資源目錄;而是后期處理過(比如壓縮)再拷貝過去;
我的打包部分命令其中對(duì)應(yīng)的目錄要預(yù)先建立好;如有更好的shell編程能力;在腳本里判斷沒有目錄先建目錄一樣;打包命令如下
ios:
react-native bundle --entry-file index.ios.js --bundle -output ./iosBundle/v1.0.0/index.ios.bundle--platform ios--assets-dest ./iosBundle/v1.0.0--dev false
android:
react-native bundle --entry-file index.android.js --bundle-output ./androidBundle/v1.0.0/index.android.jsbundle --platform android--assets-dest ./androidBundle/v1.0.0--dev false
版本號(hào)在于以后升級(jí)包的時(shí)候有用處;如果采用全量升級(jí)包;不用考慮;全部替換即可;如果是增量包;則要比對(duì)當(dāng)前的app端的包的版本;再同相應(yīng)的比對(duì)增量更新思路參考
https://segmentfault.com/a/1190000004352162
4:更新
2和3部分均有說(shuō)明;更新的過程就是下載對(duì)應(yīng)版本的壓縮包;解壓到指定的目錄覆蓋如果是全量更新則直接覆蓋即可;增量更新則與既有的合并;每個(gè)包都是知道自己的版本的;在比對(duì)的時(shí)候服務(wù)器上會(huì)放一個(gè)版本號(hào);每次啟動(dòng)去檢查自己的版本和服務(wù)器當(dāng)前版本即可知道需不需要更新即可
如果需要升級(jí)native代碼;則記得每次放在里面apk/ipa的包都是最早的;也就是第一個(gè)版本的壓縮包;這樣保證其可用;再通過比對(duì)jsBundle的版本做升級(jí)處理;
最后附上作品地址;大家體驗(yàn)下;順便提提bug
android:
ios:
參考文獻(xiàn):
https://segmentfault.com/a/1190000004189538
https://segmentfault.com/a/1190000004192816
https://segmentfault.com/a/1190000004352162