Taro跨端開發(fā)之多業(yè)務(wù)模塊管理 React Native篇(上)

原生RN項(xiàng)目與Taro如何共存?

我們團(tuán)隊(duì)一開始就有實(shí)踐原生React Native的項(xiàng)目,很長(zhǎng)一段時(shí)間,

所有的業(yè)務(wù)模塊都是在一個(gè)項(xiàng)目里面開發(fā)維護(hù),時(shí)間久了這個(gè)項(xiàng)目就變成了一個(gè)巨無霸項(xiàng)目.

再加上后來引進(jìn)了基于Taro開發(fā)的rn項(xiàng)目,為了保證原生與Taro的RN共存,

不管是原生rn項(xiàng)目還是taro項(xiàng)目的package.json文件的main對(duì)外導(dǎo)出的索引文件格式都是一致的.

我們使用以下方案來維護(hù)我們的代碼.

使用npm來管理我們的業(yè)務(wù)模塊

RN業(yè)務(wù)的主工程

這是我最初實(shí)踐的方案,首先我們創(chuàng)建一個(gè)項(xiàng)目為RN的主工程.

里面沒有任何的業(yè)務(wù)代碼,只有在根目錄下有一個(gè)index.js的業(yè)務(wù)索引文件.

它大概是這樣的:


import { AppRegistry} from 'react-native';
import Module1 from 'Module1';
import Module2 from 'Module2';
import Module3 from 'Module3';
AppRegistry.registerComponent('Module1', () => Module1);
AppRegistry.registerComponent('Module2', () => Module2);
AppRegistry.registerComponent('Module3', () => Module3);

之前的一篇文章我已經(jīng)提到,我們所有的模塊依賴都是統(tǒng)一的,并且版本鎖死.

有興趣的可以點(diǎn)擊查看:

Taro跨端開發(fā)之依賴管理

所以我的主工程的依賴與業(yè)務(wù)模塊的依賴是保持一致的.

使用NPM管理業(yè)務(wù)模塊

我們會(huì)把所有的業(yè)務(wù)模塊當(dāng)成npm來管理,因?yàn)閚pm有很多的生命周期鉤子使用.

在統(tǒng)一了npm script 命令之后,很容易統(tǒng)一管理他們.

當(dāng)然這些業(yè)務(wù)模塊我們不會(huì)把他發(fā)布到npm服務(wù)器上,因?yàn)闃I(yè)務(wù)代碼會(huì)頻繁變動(dòng),如果每一次提交都要上傳到npm服務(wù)器,自然會(huì)添加開發(fā)人員的代碼管理成本(發(fā)布npm包很煩的)

所以我們使用 npm + git 地址來拉取我們的業(yè)務(wù)模塊.

例如:

主工程的package.json


{
"name": "base",
"version": "0.0.6",
"scripts": {
"build":"構(gòu)建rn的相關(guān)操作"
},
"dependencies": {
"公共依賴包": "1.0.0",
"Module1": "http://xxx.com/webfront/Module1.git",
"Module2": "http://xxx.com/webfront/Module2.git",
"Module3": "http://xxx.com/webfront/Module3.git",
}
}

業(yè)務(wù)模塊的package.json

業(yè)務(wù)模塊添加了postinstall,在使用npm拉取業(yè)務(wù)模塊成功之后,業(yè)務(wù)模塊會(huì)在 node_modules 中構(gòu)建自己的項(xiàng)目,提供主工程的index.js使用

{
"name": "buz",
"version": "0.0.1",
"main": "main.js", // main字段要指向rn的索引文件
"scripts": {
"build":"構(gòu)建rn的相關(guān)操作",
"postinstall":"npm run build"
},
"dependencies": {
"公共依賴包": "1.0.0"
}
}

統(tǒng)一對(duì)外輸出的main.js文件


"use strict";

// 根據(jù)端的環(huán)境變量判斷是否對(duì)外輸出什么文件

if (process.env.TARO_ENV === 'weapp' || process.env.TARO_ENV === 'h5') {
module.exports = require('./dist/index');
module.exports.default = module.exports
} else {
// taro系工程,標(biāo)準(zhǔn)對(duì)外輸出
Object.defineProperty(exports, "__esModule", {
value: true
});
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _app = _interopRequireDefault(require("./rn_temp/app"));
exports.APP = _app.default;
}

業(yè)務(wù)模塊之間相互調(diào)試

業(yè)務(wù)與業(yè)務(wù)之間肯定會(huì)有相互聯(lián)調(diào)的情況,以上的方案業(yè)務(wù)模塊只能獨(dú)立運(yùn)行自己的代碼,當(dāng)我們想要跳轉(zhuǎn)到其他RN頁面的時(shí)候,那就不行了.

其實(shí)我們可以讓所有的業(yè)務(wù)模塊跟主模塊一樣,在開發(fā)調(diào)試的時(shí)候引入所有的業(yè)務(wù)模塊.

這樣所有的業(yè)務(wù)代碼都可以跑起來了,區(qū)別只在于其他業(yè)務(wù)模塊放在node_modules中,不能修改代碼.

該方案的優(yōu)劣勢(shì)

該方案建議中型的項(xiàng)目推薦

優(yōu)點(diǎn):

  1. 可以原生RN與Taro共存,只要對(duì)外導(dǎo)出的main規(guī)范一致,主工程就可以作為統(tǒng)一模塊注冊(cè)

  2. 所有業(yè)務(wù)模塊單獨(dú)維護(hù),避免了項(xiàng)目巨無霸的產(chǎn)生

  3. 業(yè)務(wù)與業(yè)務(wù)之間也可以相互跳轉(zhuǎn),單獨(dú)一個(gè)業(yè)務(wù)模塊也可以拉起完整的rn項(xiàng)目

缺點(diǎn):

  1. npm install 項(xiàng)目的時(shí)候會(huì)非常耗時(shí),因?yàn)椴粏我惭b依賴,業(yè)務(wù)模塊也會(huì)在postinstall的時(shí)候構(gòu)建項(xiàng)目.

  2. 業(yè)務(wù)模塊更新之后,必須要重新npm install

尾巴

該方案面向中等大小項(xiàng)目的rn項(xiàng)目,要是你跟我一樣幾十個(gè)業(yè)務(wù)模塊在同時(shí)開發(fā).會(huì)帶來更大的挑戰(zhàn).

后續(xù)文章我會(huì)介紹基于Taro的RN端終極管理辦法.

同時(shí)也會(huì)解決以上所有的缺點(diǎn).

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末劲阎,一起剝皮案震驚了整個(gè)濱河市赖草,隨后出現(xiàn)的幾起案子翘地,更是在濱河造成了極大的恐慌,老刑警劉巖锄俄,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硝训,死亡現(xiàn)場(chǎng)離奇詭異泼掠,居然都是意外死亡校镐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門树酪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浅碾,“玉大人,你說我怎么就攤上這事续语〈剐唬” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵疮茄,是天一觀的道長(zhǎng)埂陆。 經(jīng)常有香客問我苛白,道長(zhǎng),這世上最難降的妖魔是什么焚虱? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮懂版,結(jié)果婚禮上鹃栽,老公的妹妹穿的比我還像新娘。我一直安慰自己躯畴,他們只是感情好民鼓,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蓬抄,像睡著了一般丰嘉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嚷缭,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天饮亏,我揣著相機(jī)與錄音,去河邊找鬼阅爽。 笑死路幸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的付翁。 我是一名探鬼主播简肴,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼百侧!你這毒婦竟也來了砰识?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤佣渴,失蹤者是張志新(化名)和其女友劉穎辫狼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體观话,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡予借,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了频蛔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灵迫。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖晦溪,靈堂內(nèi)的尸體忽然破棺而出瀑粥,到底是詐尸還是另有隱情,我是刑警寧澤三圆,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布狞换,位于F島的核電站避咆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏修噪。R本人自食惡果不足惜查库,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望黄琼。 院中可真熱鬧樊销,春花似錦、人聲如沸脏款。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撤师。三九已至剂府,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剃盾,已是汗流浹背腺占。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留万俗,地道東北人湾笛。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像闰歪,于是被迫代替她去往敵國(guó)和親嚎研。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344