React Native打包之Moles Packer

注:本篇跟Moles Packer提供的文檔地址內(nèi)容類似妆兑,僅是加入了自己在操作過程中出現(xiàn)的問題

遺留問題

Module AppRegistry is not a registered callable module

自己打包生成的common.ios.jsbundle背蟆,運行就會出現(xiàn)此問題豌研,但是把官方demo的common.ios.jsbundle copy到自己的項目中,就不會出現(xiàn)這種問題贬丛,不知道各位大神有沒有出現(xiàn)撩银,歡迎討論

Moles Packer

安裝

版本要求 moles_packer >= 0.1.9

# 全局安裝
npm install -g moles-packer

# 全局安裝完成后,將在系統(tǒng)中創(chuàng)建兩個命令
moles-pack -v
moles-pack-common -v

創(chuàng)建應(yīng)用

創(chuàng)建

# 創(chuàng)建一個工作區(qū)并切換到該目錄豺憔,后續(xù)的創(chuàng)建和構(gòu)建操作都將在此目錄中完成额获。
mkdir workspace
cd workspace

# 創(chuàng)建一個名為 v037 的應(yīng)用。
# 命令執(zhí)行完成名恭应,將在工作區(qū)創(chuàng)建一個應(yīng)用同名目錄抄邀,存放與應(yīng)用有關(guān)的一切。
react-native init v037 --version 0.37.0

# 切換到應(yīng)用目錄昼榛,并檢查其版本撤摸。
cd v037
react-native --version
# 本機運行結(jié)果
# react-native-cli: 2.0.1
# react-native: 0.37.0

運行

通過打開Xcode運行或react-native run-ios

使用Moles Packer進行構(gòu)建

# 切換到應(yīng)用目錄。
cd v037

# 構(gòu)建一個適用于 iOS 平臺的可獨立運行的版本褒纲。
# 打開 --verbose 開關(guān)可獲取更多構(gòu)建細節(jié)。
moles-packer --entry index.ios.js --platform ios --standalone --output ./build --verbose

構(gòu)建完成钥飞,在./build目錄下生成以下目錄

.
├── index.ios.jsbundle
├── moles.common
│   ├── common.ios.jsbundle
│   └── common.ios.json
└── moles.meta.json

在模擬器中運行構(gòu)建結(jié)果

  • 用構(gòu)建結(jié)果取代應(yīng)用源代碼

  • 需啟動一個本地HTTP服務(wù)莺掠,并且通過該服務(wù)訪問index.ios.jsbundle文件

    • 本機使用XAMPP,window電腦可使用WAMP(親測读宙,使用node的http-server彻秆,會下載鏈接)
    • http://localhost/index.ios.jsbundle,具體URL根據(jù)個人配置略有不同
    !function(_){_.__DEV__=!1,_.__BUNDLE_START_TIME__=Date.now()}("undefined"!=typeof global?global:"undefined"!=typeof self?self:this);
    

!function(r){"use strict";function t(r,t){r in u||(u[r]={factory:t,hasError:!1,isInitialized:!1,exports:void 0})}function i(r){var t=u[r];
......
```

  • 在Xcode中,更改AppDelegate.m文件唇兑,在模擬器中重新啟動應(yīng)用酒朵,此時運行的包就是我們剛剛打好的bundle包
//  jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];

  jsCodeLocation = [NSURL URLWithString:@"http://localhost/index.ios.jsbundle"];

模仿moles-packer項目過程

按上述步驟生成項目

  • 并添加如下三個.ios.js文件
.
├── __tests__
├── android
├── build
├── index.android.js
├── index.ios.js
├── ios
├── node_modules
├── package.json
├── reactcommonbridge1.ios.js
├── reactcommonbridge2.ios.js
└── reactseperatedbridge.ios.js

通過Moles Packer構(gòu)建打包成bundle文件

構(gòu)建命令

moles-packer --entry reactcommonbridge1.ios.js --platform ios --bundle --verbose
moles-packer --entry reactcommonbridge2.ios.js --platform ios --bundle --verbose
moles-packer --entry reactseperatedbridge.ios.js --platform ios --bundle --verbose

構(gòu)建成功后的build目錄,構(gòu)建后均為index.ios.jsbundle扎附,自行更改包名

.
├── moles.common
│   ├── common.ios.jsbundle
│   └── common.ios.json
├── moles.meta.json
├── reactcommonbridge1.ios.jsbundle
├── reactcommonbridge2.ios.jsbundle
└── reactseperatedbridge.ios.jsbundle

模仿moles-packer項目出現(xiàn)的問題

  • 出現(xiàn)如下問題蔫耽,在項目環(huán)境中運行npm install moles-packer
start ... react / es2015 ... /Users/liupuyan/.nvm/versions/node/v5.11.0/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/liupuyan/Desktop/workspace/rn37demo"
  • 若React Native版本為0.38.0之上,會出現(xiàn)如下問題
[MOLES_PACKER] -- Process common bundle --

    [MOLES_PACKER] react-native v0.38.0 has not been supported yet. We will try to handle it.
  • 本機使用0.37.0留夜,出現(xiàn)如下問題
[MOLES_PACKER] -- Process common bundle --
module.js:341
throw err;
^

Error: Cannot find module 'node-haste/lib/DependencyGraph/docblock.js'

解決方案:全局安裝node-haste `npm install -g node-haste`
  • 項目中實際模塊名ReactExample匙铡,但是打包后模塊名統(tǒng)一是MOLES,如果更改則出現(xiàn)如下問題
Application ReactExample has not been registered. This is either due to a require() error during initialization or failure to call AppRegistry.registerComponent.

Moles Packer命令詳解

版本要求 moles_packer >= 0.3.0

全局安裝完成后碍粥,將在系統(tǒng)中創(chuàng)建兩個命令

  • moles-pack
    • 用于項目構(gòu)建鳖眼,可編譯業(yè)務(wù)代碼并將其打包,也可同時創(chuàng)建公包
  • moles-pack-common
    • 僅用于創(chuàng)建公包及相應(yīng)的元數(shù)據(jù)文件
# 打印幫助信息嚼摩。
moles-packer --help

# 顯示版本钦讳。
moles-packer --version

參數(shù)詳解

缺省值是指該選項缺省時,程序默認的選項值
選項缺省值是指該選項存在但未賦值時枕面,程序默認的選項值

--bundle 選項為例:

moles-packer
# 此時愿卒,--bundle 選項值為其“缺省值”。

moles-packer --bundle
# 此時膊畴,--bundle 選項值為其“選項值缺省”值掘猿。
  • --bundle [<bundle.js>]
    • 指示將構(gòu)建結(jié)果合并輸出,該文件將被保存在--output指定的目錄中
OUTPUT/index.ios.jsbundle       # 適用于 iOS 平臺的業(yè)務(wù)包或可獨立運行的程序包
OUTPUT/index.android.jsbundle   # 適用于 Android 平臺的業(yè)務(wù)包或或獨立運行的程序包
OUTPUT/index.jsbundle           # 跨平臺的業(yè)務(wù)包
+ Moles Packer 構(gòu)建的可獨立運行的程序包唇跨,必須是平臺相關(guān)的稠通,故其文件名中也包括平臺名稱
+ bundle文件中默認不包含公包模塊,除非使用了`--standalone`選項
  • --deve

    • 在開發(fā)模式下構(gòu)建的代碼买猖,在運行時可以輸出更多的調(diào)試信息
  • --entry <entry/file/basename>

    • 缺省值 index.js
    • 指定入口文件名稱
  • --platform ios | android | cross

    • 缺省值 cross
      指定構(gòu)建輸出結(jié)果適用的操作系統(tǒng)平臺
      如果打包結(jié)果需要跨平臺通用改橘,開發(fā)人員須確保業(yè)務(wù)代碼中沒有引用平臺相關(guān)的模塊,否則請分別執(zhí)行命令玉控,以獲取平臺相關(guān)的業(yè)務(wù)包
  • --standalone

    • 是否輸出可獨立運行的bundle文件
    • 該選項應(yīng)與--bundle--platform選項配合使用
  • --minify

    • 默認情形下飞主,Moles Packer 將保持輸出代碼的可讀性,不對其進行壓縮和混淆高诺。如需獲得更小尺寸的構(gòu)建結(jié)果碌识,請打開 --minify開關(guān)
  • --verbose

    • 打開此開關(guān)可獲取更多構(gòu)建細節(jié)
  • --input <path/to/project/dir>\

    • 缺省值 . 當前目錄
    • 指定項目目錄
  • --output <path/to/output/dir>

    • 缺省值 ./build 當前目錄的build子目錄
    • 指定輸出目錄(不存在則創(chuàng)建,如果存在虱而,則會覆蓋相關(guān)文件)
  • --help

    • 打印幫助信息
    • 出現(xiàn)該參數(shù)筏餐,其他所有參數(shù)將被忽略
  • -h

    • 等同于--help
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市牡拇,隨后出現(xiàn)的幾起案子魁瞪,更是在濱河造成了極大的恐慌穆律,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件导俘,死亡現(xiàn)場離奇詭異峦耘,居然都是意外死亡,警方通過查閱死者的電腦和手機旅薄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門辅髓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赋秀,你說我怎么就攤上這事利朵。” “怎么了猎莲?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵绍弟,是天一觀的道長。 經(jīng)常有香客問我著洼,道長樟遣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任身笤,我火速辦了婚禮豹悬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘液荸。我一直安慰自己瞻佛,他們只是感情好,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布娇钱。 她就那樣靜靜地躺著伤柄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪文搂。 梳的紋絲不亂的頭發(fā)上适刀,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音煤蹭,去河邊找鬼笔喉。 笑死,一個胖子當著我的面吹牛硝皂,可吹牛的內(nèi)容都是我干的常挚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼稽物,長吁一口氣:“原來是場噩夢啊……” “哼待侵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起姨裸,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤秧倾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后傀缩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體那先,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年赡艰,在試婚紗的時候發(fā)現(xiàn)自己被綠了售淡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡慷垮,死狀恐怖揖闸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情料身,我是刑警寧澤汤纸,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站芹血,受9級特大地震影響贮泞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜幔烛,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一啃擦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饿悬,春花似錦令蛉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至傲宜,卻和暖如春运杭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背函卒。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工辆憔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人报嵌。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓虱咧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锚国。 傳聞我的和親對象是個殘疾皇子腕巡,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件血筑、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,104評論 4 62
  • A bizarre fatal car accident,anunknown sum of money,attra...
    薛詩雅閱讀 1,506評論 0 0
  • 二寶在睡覺绘沉,大寶覺得房間里很熱煎楣,他一跑進來就嫻熟地將空調(diào)調(diào)成25度。嘴里念著:25度才涼快呢…… 我如果說车伞,弟弟...
    豆蔻媽閱讀 557評論 0 0
  • 文/山雨 雨中 我看著那一片片精靈 它曾經(jīng)那樣輝煌 站在高高地樹頂上 迎風招展 任陽光雨露將它滋養(yǎng) 那生機盎然的模...
    如影泡幻閱讀 596評論 0 5