ReactNative - 打離線包 (二) 攜程 Moles-Packer 框架命令打包

ReactNative - 打離線包 (二) 攜程 Moles-Packer 框架命令打包

Moles-Packer 是由攜程框架團(tuán)隊(duì)研發(fā)的酪穿,與攜程 Moles 框架配套使用的 React Native 打包和拆包工具吉嚣,同時(shí)支持原生的 React Native 項(xiàng)目管跺。

安裝

執(zhí)行命令進(jìn)行 Moles-Packer 的安裝

npm install -g moles-packer

Moles Packer 安裝完成后飞蹂,將創(chuàng)建兩個(gè)命令:

  • moles-packer
    用于項(xiàng)目構(gòu)建系奉,可編譯業(yè)務(wù)代碼并將其打包,也可同時(shí)創(chuàng)建公包。

  • moles-packer-common
    僅用于創(chuàng)建公包及相應(yīng)的元數(shù)據(jù)文件炼杖。

可通過命令進(jìn)行 moles-packer 版本的查詢

moles-packer -v
moles-packer-common -v

上述操作步驟如下:


具體操作步驟如下
具體操作步驟如下

Moles-Packer 參數(shù)詳解

Options

  --bundle [<bundle.js>] 指示將構(gòu)建結(jié)果合并輸出,該文件將被保存在 --output 指定的目錄中, 默認(rèn)情況下 bundle 中不包含公包模塊盗迟,除非使用 --standalone 選項(xiàng)坤邪。
  --common-input 指定公包目錄,并在構(gòu)建過程中使用該目錄中的預(yù)制公包及其元數(shù)據(jù)文件罚缕。
  --common-modules 指定公包中所包含的模塊艇纺,多個(gè)模塊之間使用逗號(hào)分隔。
  --common-output 指定公包輸出目錄怕磨。當(dāng)選項(xiàng)值是相對(duì)路徑時(shí)喂饥,如果以 . 或 .. 起始,則相對(duì)于當(dāng)前工作目錄肠鲫;否則認(rèn)為相對(duì)于 --output 選項(xiàng)所指定的輸出目錄员帮。
  --dev 開發(fā)模式下構(gòu)建的代碼,在運(yùn)行時(shí)可以輸出更多的調(diào)試信息导饲。
  --entry 指定入口文件名稱讹语。 默認(rèn)為 index.js
  --exec-on-required 當(dāng)且僅當(dāng)模塊首次被實(shí)際使用時(shí)鹅搪,執(zhí)行其相應(yīng)的定義程序。
  --input 指定項(xiàng)目目錄。默認(rèn)為當(dāng)前目錄
  --minify 默認(rèn)情形下抡草,Moles Packer 將保持輸出代碼的可讀性句占,不對(duì)其進(jìn)行壓縮和混淆千扔。
  --output 指定輸出目錄砸烦。默認(rèn)為./build,如果該目錄不存在听盖,Moles Packer 會(huì)自動(dòng)創(chuàng)建胀溺。 如果該目錄已經(jīng)存在裂七,其中的文件有可能被覆蓋。
  --platform 指定構(gòu)建輸出結(jié)果適用的操作系統(tǒng)平臺(tái)仓坞。如: ios
  --standalone 是否輸出可獨(dú)立運(yùn)行的 bundle 文件背零。該選項(xiàng)應(yīng)與 --bundle 和 --platform 選項(xiàng)配合使用。

Moles-Packer 打包準(zhǔn)備

Moles-Packer 對(duì) React Native 版本有要求

React Native 版本要求

由上可知无埃,Moles-Packer暫時(shí)還不支持 React Native 的 0.38.0 以上的版本, 目前 React Native 的最新版本為 0.40.0 徙瓶。

0.38.0使用moles-packer

因此,構(gòu)建 React Native 工程需要使用 0.37.0 以下的版本嫉称。

Moles-Packer 打包

首先你得有個(gè) React Native 的工程侦镇。這里以空工程打包為例:
1.創(chuàng)建適合 Moles-Packer 的 React Native 版本

react-native init ReactNativeV37 --version 0.37.0 

2.執(zhí)行打包命令

moles-packer --entry index.ios.js --platform ios --standalone --output ./ios/build --verbose 

3.查看執(zhí)行完打包命令后的結(jié)果

[MOLES_PACKER] -- options parsed --

  name            value                                              
  --------------  ---------------------------------------------------
  base            "/Users/QCL/ReactNative/ReactNativeV37"   
  bundle          true                            
  commonOutput    "BASE/ios/build/moles.common"   
  dev             false                           
  entry           "BASE/index.ios.js"             
  execOnRequired  false                           
  input           "BASE/"                         
  isCLI           true                            
  metaOutput      "BASE/ios/build/moles.meta.json"
  minify          false                           
  output          "BASE/ios/build"                
  platform        "ios"                                     
  single          false                           
  standalone      true                            
  verbose         true                            

[MOLES_PACKER] -- Process common bundle --
[COMMON] Create common bundle ( ios )
[2017-1-16 14:25:15] <START> Initializing Packager
[2017-1-16 14:25:15] <START> Building in-memory fs for JavaScript
[2017-1-16 14:25:15] <END>   Building in-memory fs for JavaScript (164ms)
[2017-1-16 14:25:15] <START> Building Haste Map
[2017-1-16 14:25:15] <END>   Building Haste Map (96ms)
[2017-1-16 14:25:15] <END>   Initializing Packager (333ms)
[2017-1-16 14:25:15] <START> Transforming modules
[2017-1-16 14:25:15] <END>   Transforming modules (385ms)
bundle: start
bundle: finish
bundle: Writing bundle output to: .moles/common.ios.jsbundle
bundle: Writing sourcemap output to: .moles/common.ios.sourcemap.json
bundle: Done writing bundle output
bundle: Done writing sourcemap output
[COMMON] Re-create common bundle ( ios )
[COMMON] Minify common bundle ( ios )
[COMMON] COMMON BUNDLE: /Users/QCL/ReactNative/ReactNativeV37/ios/build/moles.common/common.ios.jsbundle ( ios )
[COMMON] COMMON META: /Users/QCL/ReactNative/ReactNativeV37/ios/build/moles.common/common.ios.json ( cross )
[MOLES_PACKER] Common modules ready.
[MOLES_PACKER] -- Process business code --
[SOURCE] index.ios.js ( entry )
[BUNDLE] - ( top )
[BUNDLE] index.ios.js ( entry )
[BUNDLE] - ( bottom )
[TARGET] index.ios.jsbundle ( bundle )
[TARGET] moles.meta.json ( meta )
[MOLES_PACKER] -- end --
[MOLES_PACKER] See /Users/QCL/ReactNative/ReactNativeV37/ios/build
目錄層級(jí)

4.將 index.ios.jsbundle 引入工程

index.ios.jsbundle

5.修改 AppDelegate.m 中的源碼

NSURL *jsCodeLocation;

// jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];
jsCodeLocation = [NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"index.ios.jsbundle" ofType:nil]];
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                    moduleName:@"ReactNativeV37"
                                             initialProperties:nil
                                                 launchOptions:launchOptions];

6.如果要離線真機(jī)測(cè)試或打包上傳應(yīng)用, 需要進(jìn)行如下修改

因?yàn)?ReactNative 自帶 Chrome 的 Debug 模式, 因此需要修改成 Release ,來關(guān)閉掉 Debug 模式


修改Release

7.打包上傳或真機(jī)調(diào)試澎埠,與iOS工程無異虽缕。
具體步驟如下:


打包過程
打包過程

打包過程中的問題

問題1: 找不到的 node-haste 模塊

[MOLES_PACKER] -- Process common bundle --
module.js:474
throw err;
       ^

Error: Cannot find module 'node-haste/lib/DependencyGraph/docblock.js'
at Function.Module._resolveFilename (module.js:472:15)
at Function.Module._load (module.js:420:25)
at Module.require (module.js:500:17)
at require (internal/module.js:20:19)
at _create_common (/usr/local/lib/node_modules/moles-packer/lib/packCommon.js:37:17)
at _ME (/usr/local/lib/node_modules/moles-packer/lib/packCommon.js:282:18)
at _ME (/usr/local/lib/node_modules/moles-packer/lib/pack.js:22:22)
at Object. (/usr/local/lib/node_modules/moles-packer/bin/pack.js:4:1)
at Module._compile (module.js:573:32)
at Object.Module._extensions..js (module.js:582:10)

解決方案

npm install -g node-haste

問題2:找不到的 transform-es5-property-mutators 插件

[MOLES_PACKER] Common modules ready.
[MOLES_PACKER] -- Process business code --
[SOURCE] index.ios.js ( entry )
start ... react / es2015 ... /usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/options/option-manager.js:176
throw new ReferenceError(messages.get("pluginUnknown", plugin, loc, i, dirname));
^

ReferenceError: Unknown plugin "transform-es5-property-mutators" specified in "base" at 0, attempted to resolve relative to "/Users/QCL/ReactNative/v031"
at /usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/options/option-manager.js:176:17
at Array.map (native)
at Function.normalisePlugins (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/options/option-manager.js:154:20)
at OptionManager.mergeOptions (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/options/option-manager.js:229:36)
at OptionManager.init (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/options/option-manager.js:374:12)
at File.initOptions (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/index.js:216:65)
at new File (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/index.js:139:24)
at Pipeline.transform (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/pipeline.js:46:16)
at _transform_react (/usr/local/lib/node_modules/moles-packer/lib/transform.js:137:24)
at _one (/usr/local/lib/node_modules/moles-packer/lib/transform.js:110:9)

解決方案

npm install -g babel-plugin-transform-es5-property-mutators

問題3: 找不到的 es2015 模塊

[MOLES_PACKER] -- Process business code --
[SOURCE] index.ios.js ( entry )
start ... react / es2015 ... /usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/options/option-manager.js:334
        throw e;
        ^

Error: Couldn't find preset "es2015" relative to directory "/Users/QCL/ReactNative/ReactNativeV37"
    at /usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/options/option-manager.js:299:19
    at Array.map (native)
    at OptionManager.resolvePresets (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/options/option-manager.js:270:20)
    at OptionManager.mergePresets (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/options/option-manager.js:259:10)
    at OptionManager.mergeOptions (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/options/option-manager.js:244:14)
    at OptionManager.init (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/options/option-manager.js:374:12)
    at File.initOptions (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/index.js:216:65)
    at new File (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/index.js:139:24)
    at Pipeline.transform (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/pipeline.js:46:16)
    at _transform_react (/usr/local/lib/node_modules/moles-packer/lib/transform.js:137:24)

解決方案:

npm install babel-preset-es2015

問題4: 找不到 stage-0 模塊

[MOLES_PACKER] -- Process business code --
[SOURCE] index.ios.js ( entry )
start ... react / es2015 ... /usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/options/option-manager.js:334
        throw e;
        ^

Error: Couldn't find preset "stage-0" relative to directory "/Users/QCL/ReactNative/ReactNativeV37"
    at /usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/options/option-manager.js:299:19
    at Array.map (native)
    at OptionManager.resolvePresets (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/options/option-manager.js:270:20)
    at OptionManager.mergePresets (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/options/option-manager.js:259:10)
    at OptionManager.mergeOptions (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/options/option-manager.js:244:14)
    at OptionManager.init (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/options/option-manager.js:374:12)
    at File.initOptions (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/index.js:216:65)
    at new File (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/file/index.js:139:24)
    at Pipeline.transform (/usr/local/lib/node_modules/moles-packer/node_modules/babel-core/lib/transformation/pipeline.js:46:16)
    at _transform_react (/usr/local/lib/node_modules/moles-packer/lib/transform.js:137:24)

解決方案:

npm install babel-preset-stage-0

問題3和問題4的
解決方案二:

使用 subl 打開 package.json

subl package.json

在 packjson.json 的 devDependencies 中添加如下代碼:

"babel-preset-stage-0": "6.16.0",
"babel-preset-es2015": "6.18.0"

添加完成后,如下:

{
  "name": "ReactNativeV37",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start",
    "test": "jest"
  },
  "dependencies": {
    "react": "15.3.2",
    "react-native": "0.37.0"
  },
  "jest": {
    "preset": "jest-react-native"
  },
  "devDependencies": {
    "babel-jest": "18.0.0",
    "babel-preset-react-native": "1.9.1",
    "jest": "18.1.0",
    "jest-react-native": "18.0.0",
    "react-test-renderer": "15.3.2",
    "babel-preset-stage-0": "6.16.0",
    "babel-preset-es2015": "6.18.0"
  }
}

最后執(zhí)行

npm install

參考文章

我在 Github 提的 issues
從零開始蒲稳,使用 Moles Packer
React Native 版本
CtripMoles 的簡(jiǎn)書

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伍派,隨后出現(xiàn)的幾起案子江耀,更是在濱河造成了極大的恐慌,老刑警劉巖诉植,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祥国,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡晾腔,警方通過查閱死者的電腦和手機(jī)舌稀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灼擂,“玉大人壁查,你說我怎么就攤上這事√抻Γ” “怎么了睡腿?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)峻贮。 經(jīng)常有香客問我席怪,道長(zhǎng),這世上最難降的妖魔是什么纤控? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任挂捻,我火速辦了婚禮,結(jié)果婚禮上船万,老公的妹妹穿的比我還像新娘刻撒。我一直安慰自己惜辑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布疫赎。 她就那樣靜靜地躺著盛撑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捧搞。 梳的紋絲不亂的頭發(fā)上抵卫,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音胎撇,去河邊找鬼介粘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛晚树,可吹牛的內(nèi)容都是我干的姻采。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼爵憎,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼慨亲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宝鼓,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤刑棵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后愚铡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛉签,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年沥寥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碍舍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邑雅,死狀恐怖片橡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蒂阱,我是刑警寧澤锻全,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站录煤,受9級(jí)特大地震影響鳄厌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜妈踊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一了嚎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦歪泳、人聲如沸萝勤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)敌卓。三九已至,卻和暖如春伶氢,著一層夾襖步出監(jiān)牢的瞬間趟径,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工癣防, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜗巧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓蕾盯,卻偏偏與公主長(zhǎng)得像幕屹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子级遭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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