RN精進筆記(六)RN打離線包篇

React-Native打離線包

RN-App項目中js代碼和native代碼,其中js代碼的打包是動態(tài)的,打成jsbundle的過程中,js會將自己所需要的所有的文件(這里指你的js業(yè)務(wù)代碼中的require或者import部分)導(dǎo)入到bundle中。

RN-App項目的結(jié)構(gòu)

一個完整的RN-app程序通常包含以下幾個部分:

  1. native代碼部分-objc部分。引入react-native框架,代碼中新增的部分是Library部分。大小在2.2M左右,至于打成ipa包增大估計在6M~8M以內(nèi)。
pod 'React', :path => './node_modules/react-native', :subspecs => [
'Core',
'RCTImage',
'RCTNetwork',
'RCTText',
'RCTWebSocket',
'ART',
'RCTActionSheet',
'RCTGeolocation',
'RCTPushNotification',
'RCTSettings',
'RCTVibration',
'RCTLinkingIOS',
]
  1. js代碼部分-rn代碼依賴的第三方庫業(yè)務(wù)代碼等。這部分代碼是通過線上下載的代碼,不會打到ipa包中,可以通過熱加載的方式從服務(wù)端加載。這部分如果采用壓縮方式打包,大小不會超過1M。js打成bundle包(可以查看一下bundle包的代碼,發(fā)現(xiàn)里面全是壓縮了的js),然后放到服務(wù)器上,下載到APP本地更新。
1.js業(yè)務(wù)代碼:這部分代碼很少
2.react-native代碼:這部分代碼就是facebook的開源框架的js代碼,在打成bundle包時,不用擔(dān)心所有資源文件都會打包,js采用的是動態(tài)打包方式,只會將自身require或者import的部分打入bundle 包。
3.依賴的第三方庫:這里指的是我們的js業(yè)務(wù)代碼可能需要依賴一些優(yōu)秀的react開源框架,如react-native-navbar這種導(dǎo)航欄第三方庫,通過require加載,也會加載到我們的bundle包。有一個要注意的是,如果依賴的第三方庫不是純js代碼的話,就不能實現(xiàn)熱更新。
  1. 圖片資源部分。這部分通過打包命令打包時生成asset文件夾。
打包命令說明
react-native bundle
Options:
--entry-file Path to the root JS file, either absolute or relative to JS root [required]
--platform Either "ios" or "android"
--transformer Specify a custom transformer to be used (absolute path) [default: "/Users/babytree-mbp13/projects/xcodeProjects/AwesomeProject/node_modules/react-native/packager/transformer.js"]
--dev If false, warnings are disabled and the bundle is minified [default: true]
--prepack If true, the output bundle will use the Prepack format. [default: false]
--bridge-config File name of a a JSON export of __fbBatchedBridgeConfig. Used by Prepack. Ex. ./bridgeconfig.json
--bundle-output File name where to store the resulting bundle, ex. /tmp/groups.bundle [required]
--bundle-encoding Encoding the bundle should be written in (https://nodejs.org/api/buffer.html#buffer_buffer). [default: "utf8"]
--sourcemap-output File name where to store the sourcemap file for resulting bundle, ex. /tmp/groups.map
--assets-dest Directory name where to store assets referenced in the bundle
--verbose Enables logging [default: false]
打包步驟
  1. cd到工程目錄(index.ios.js&package.json存放的目錄),執(zhí)行打包命令.
react-native bundle --minify --entry-file ./index.ios.js --platform ios --bundle-output ./main.ios.jsbundle --assets-dest ./
  1. 命令執(zhí)行完生成.bundle文件

  2. 在Xcode中添加.bunldeassets,必須是Create folder references的方式。

  3. 修改jsCodeLocation

jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"index.ios" withExtendsion:@"jsbundle"];
  1. 另外一種打包命令,程序運行時執(zhí)行該命令。
curl 'http://localhost:8081/Examples/UIExplorer/UIExplorerApp.ios.bundle?platform=ios' -o main.jsbundle
或者
curl 'http://localhost:8081/index.ios.bundle?dev=false&minify=true&platform=ios' -o main.jsbundle
  1. 查看項目中的main.jsbundle或者main.os.jsbundle發(fā)現(xiàn)bundle文件里是壓縮了的js代碼,該部分代碼包括 業(yè)務(wù)js+react-native代碼+依賴第三方代碼
打包遇到的問題
  1. 離線包如果開啟了chrome調(diào)試,hui訪問調(diào)試服務(wù)器,而且會一直loading不出來。一直提示。。。
Loading from pre-bundled file...
  1. 如果bundle的名字是main.jsbundle,app會一直讀取舊的,改名就好了。。。非常奇葩的問題,我重新刪了app,clean工程都沒用,就是不能用main.jsbundle這個名字。這個問題貌似沒遇到過。。。

  2. 必須用Create folder references【藍色文件夾圖標(biāo)】的方式引入圖片的assets,否則引用不到圖片

  3. 執(zhí)行bundle命令之前,要保證相關(guān)的文件夾都存在

  4. To disable the developer menu for production builds:

For iOS open your project in Xcode and select Product → Scheme → Edit Scheme... (or press ? + <). Next, select Run from the menu on the left and change the Build Configuration to Release.
  1. over
使用react-native-webpack-server打包

重要,待補充

React-Native發(fā)布與熱更新

打包完成之后,要實現(xiàn)熱更新,還需要在原生代碼中做一些邏輯處理,簡單流程如下:

  1. 首先將上一步輸出的main.jsbundle文件放到服務(wù)器上,可以達成zip包下載,進一步壓縮文件大小。
  2. 在App啟動的時候,判斷RN代碼是否有更新,若有更新,則將更新的包下載下來;若沒有更新,則不做處理。(這部分類似于現(xiàn)有的jspatch更新)。
  3. 有新的更新,在加載RN的入口處,將url指向新的文件地址。
  4. 同時,為了保證安全性和下載流量,應(yīng)將main.jsbundle用密碼壓縮,在下載下來之后,再進行解壓處理。
  5. over
React-Native增量更新

待補充

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,238評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,430評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,134評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,893評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,653評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,136評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,212評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,372評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,888評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,738評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,482評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,179評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,588評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,829評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,610評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,916評論 2 372

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