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

React-Native打離線包

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

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

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

  1. native代碼部分-objc部分塑径。引入react-native框架衔彻,代碼中新增的部分是Library部分薇宠。大小在2.2M左右,至于打成ipa包增大估計(jì)在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代碼澄港、依賴的第三方庫(kù)業(yè)務(wù)代碼等柄沮。這部分代碼是通過(guò)線上下載的代碼回梧,不會(huì)打到ipa包中,可以通過(guò)熱加載的方式從服務(wù)端加載祖搓。這部分如果采用壓縮方式打包狱意,大小不會(huì)超過(guò)1M。js打成bundle包(可以查看一下bundle包的代碼拯欧,發(fā)現(xiàn)里面全是壓縮了的js)详囤,然后放到服務(wù)器上,下載到APP本地更新镐作。
1.js業(yè)務(wù)代碼:這部分代碼很少
2.react-native代碼:這部分代碼就是facebook的開源框架的js代碼藏姐,在打成bundle包時(shí),不用擔(dān)心所有資源文件都會(huì)打包该贾,js采用的是動(dòng)態(tài)打包方式包各,只會(huì)將自身require或者import的部分打入bundle 包。
3.依賴的第三方庫(kù):這里指的是我們的js業(yè)務(wù)代碼可能需要依賴一些優(yōu)秀的react開源框架靶庙,如react-native-navbar這種導(dǎo)航欄第三方庫(kù)问畅,通過(guò)require加載,也會(huì)加載到我們的bundle包六荒。有一個(gè)要注意的是护姆,如果依賴的第三方庫(kù)不是純js代碼的話,就不能實(shí)現(xiàn)熱更新掏击。
  1. 圖片資源部分卵皂。這部分通過(guò)打包命令打包時(shí)生成asset文件夾。
打包命令說(shuō)明
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. 另外一種打包命令添祸,程序運(yùn)行時(shí)執(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. 查看項(xiàng)目中的main.jsbundle或者main.os.jsbundle發(fā)現(xiàn)bundle文件里是壓縮了的js代碼,該部分代碼包括 業(yè)務(wù)js+react-native代碼+依賴第三方代碼
打包遇到的問題
  1. 離線包如果開啟了chrome調(diào)試刃泌,hui訪問調(diào)試服務(wù)器凡壤,而且會(huì)一直loading不出來(lái)。一直提示耙替。亚侠。。
Loading from pre-bundled file...
  1. 如果bundle的名字是main.jsbundle俗扇,app會(huì)一直讀取舊的硝烂,改名就好了。铜幽。滞谢。非常奇葩的問題,我重新刪了app啥酱,clean工程都沒用爹凹,就是不能用main.jsbundle這個(gè)名字。這個(gè)問題貌似沒遇到過(guò)镶殷。禾酱。。

  2. 必須用Create folder references【藍(lán)色文件夾圖標(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打包

重要,待補(bǔ)充

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

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

  1. 首先將上一步輸出的main.jsbundle文件放到服務(wù)器上帽馋,可以達(dá)成zip包下載搅方,進(jìn)一步壓縮文件大小。
  2. 在App啟動(dòng)的時(shí)候绽族,判斷RN代碼是否有更新姨涡,若有更新,則將更新的包下載下來(lái)吧慢;若沒有更新涛漂,則不做處理。(這部分類似于現(xiàn)有的jspatch更新)。
  3. 有新的更新匈仗,在加載RN的入口處瓢剿,將url指向新的文件地址。
  4. 同時(shí)悠轩,為了保證安全性和下載流量间狂,應(yīng)將main.jsbundle用密碼壓縮,在下載下來(lái)之后哗蜈,再進(jìn)行解壓處理前标。
  5. over
React-Native增量更新

待補(bǔ)充

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坠韩,一起剝皮案震驚了整個(gè)濱河市距潘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌只搁,老刑警劉巖音比,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異氢惋,居然都是意外死亡洞翩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門焰望,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)骚亿,“玉大人,你說(shuō)我怎么就攤上這事熊赖±赐溃” “怎么了?”我有些...
    開封第一講書人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵震鹉,是天一觀的道長(zhǎng)俱笛。 經(jīng)常有香客問我,道長(zhǎng)传趾,這世上最難降的妖魔是什么迎膜? 我笑而不...
    開封第一講書人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮浆兰,結(jié)果婚禮上磕仅,老公的妹妹穿的比我還像新娘。我一直安慰自己簸呈,他們只是感情好榕订,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蝶棋,像睡著了一般卸亮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上玩裙,一...
    開封第一講書人閱讀 49,856評(píng)論 1 290
  • 那天兼贸,我揣著相機(jī)與錄音段直,去河邊找鬼。 笑死溶诞,一個(gè)胖子當(dāng)著我的面吹牛鸯檬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播螺垢,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼喧务,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了枉圃?” 一聲冷哼從身側(cè)響起功茴,我...
    開封第一講書人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎孽亲,沒想到半個(gè)月后坎穿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡返劲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年玲昧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篮绿。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡孵延,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出亲配,到底是詐尸還是另有隱情尘应,我是刑警寧澤,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布弃榨,位于F島的核電站菩收,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鲸睛。R本人自食惡果不足惜娜饵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望官辈。 院中可真熱鬧箱舞,春花似錦、人聲如沸拳亿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肺魁。三九已至电湘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背寂呛。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工怎诫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贷痪。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓幻妓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親劫拢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肉津,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

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