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

昨天跑的好好項(xiàng)目,今天跑不起來

我們?cè)陂_發(fā)周期比較長的前端項(xiàng)目的時(shí)候,必然會(huì)遇到依賴管理的問題.
我們?cè)陂_發(fā)項(xiàng)目的時(shí)候,我們用了大量的三方庫.這些三方的依賴庫時(shí)不時(shí)的會(huì)更新自己的代碼.

第三方依賴庫的代碼更新會(huì)很容易造成代碼運(yùn)行的不穩(wěn)定,
比如昨天還跑的好好的項(xiàng)目,另一位剛剛接手的同學(xué)重新安裝依賴之后項(xiàng)目就完全跑不起來了.
或者自己機(jī)器跑的好好的代碼,扔到打包機(jī)上重新打包之后就完全跑不起來.

因?yàn)槿揭蕾噹煊玫奶?很多時(shí)候并不能很快速的定位到項(xiàng)目為什么跑不起來.
特別是開發(fā)RN項(xiàng)目的時(shí)候,一個(gè)依賴更新的問題可能會(huì)定位一個(gè)大半天才能找到罪魁禍?zhǔn)?曾經(jīng)的我為了這種事情浪費(fèi)了大量的青春).

鎖定NPM依賴版本

對(duì)于那些你不熟悉,或者不能保證穩(wěn)定的三方npm包,我這邊的做法是直接鎖定版本號(hào).
這件事情做的越早越好,不要盲目相信三方npm越更新性能越好.
他會(huì)時(shí)不時(shí)的讓你痛一下.讓你浪費(fèi)大量的時(shí)間去尋找到底是誰影響了你的代碼正常運(yùn)行.

第三方npm包有bug如何解決?

升級(jí)原有npm包版本

如果你發(fā)現(xiàn)了你的第三方npm有bug,建議不要盲目的升級(jí)版本.

第一步你需要先看這個(gè)npm包的 changelog,如果有明確修復(fù)過這個(gè)bug,
才會(huì)建議你升級(jí).但是不能保證升級(jí)之后可能會(huì)帶來其他bug.

修掉bug發(fā)布在公司私有源

但是我還是比較建議,在原來版本的npm包上修掉這個(gè)bug,并且修改npm包名為公司內(nèi)部包,發(fā)布到公司私有npm源上.

如果因?yàn)閚pm版本的改動(dòng),導(dǎo)致項(xiàng)目不穩(wěn)定,也可以縮小排查范圍,快速定位到是哪一個(gè)npm庫導(dǎo)致的問題.

例如: mobx => @公司源/mobx

小技巧: .npmrc配置

如果你有發(fā)布到公司私有源的三方npm包,
你可以嘗試修改.npmrc文件使用npm名的作用域直接指向公司私有源

例如:

@公司源:registry=http://npm.xxx.com
@tarojs:registry=http://npm.xxx.com

所有項(xiàng)目依賴統(tǒng)一管理

上面說到了我們將所有的有不穩(wěn)定的npm包鎖定版本,保證項(xiàng)目長期維護(hù)可以正常運(yùn)行.
現(xiàn)在我們團(tuán)隊(duì)開發(fā)的跨端項(xiàng)目將近上百個(gè). 為了保證上百個(gè)的項(xiàng)目可以長期穩(wěn)定運(yùn)行.
我將所有的依賴封裝成了一個(gè)npm庫,里面沒有任何的js代碼,只有穩(wěn)定的依賴.
所有的項(xiàng)目都會(huì)引入這個(gè)核心的依賴,以保證所有項(xiàng)目可以穩(wěn)定運(yùn)行.

保證項(xiàng)目使用npm的差異化,強(qiáng)行指定版本

所有依賴全部統(tǒng)一之后,肯定會(huì)有項(xiàng)目因?yàn)橐恍┰虿幌胧褂脗€(gè)別的三方npm包.
這里就必須要提到package.json依賴管理的 resolutions屬性.
這樣npm就會(huì)將多版本共存的版本,強(qiáng)行指定某一版本,滿足個(gè)別項(xiàng)目的特定需求.

使用方法如下:

// package.json 
{
    "resolutions": {
        "hoek": "4.2.1"
    }
}

當(dāng)然你也可以使用這個(gè)工具,將依賴強(qiáng)制指定版本:
https://www.npmjs.com/package/npm-force-resolutions

加速你的npm安裝速度

除了大家都知道的npm換源之外,npm依賴的執(zhí)行文件下載也會(huì)拖慢你的依賴安裝速度.

以下是我們團(tuán)隊(duì)使用的.npmrc配置,對(duì)于一些npm依賴的執(zhí)行文件,
可以使用該配置加速你的npm構(gòu)建速度.

.npmrc文件的位置在你的home目錄下,你也可以在項(xiàng)目根目錄創(chuàng)建該文件.

chromedriver-cdnurl=https://npm.taobao.org/mirrors/chromedriver
couchbase-binary-host-mirror=https://npm.taobao.org/mirrors/couchbase/v{version}
debug-binary-host-mirror=https://npm.taobao.org/mirrors/node-inspector
electron-mirror=https://npm.taobao.org/mirrors/electron/
flow-bin-binary-host-mirror=https://npm.taobao.org/mirrors/flow/v
fse-binary-host-mirror=https://npm.taobao.org/mirrors/fsevents
fuse-bindings-binary-host-mirror=https://npm.taobao.org/mirrors/fuse-bindings/v{version}
git4win-mirror=https://npm.taobao.org/mirrors/git-for-windows
gl-binary-host-mirror=https://npm.taobao.org/mirrors/gl/v{version}
grpc-node-binary-host-mirror=https://npm.taobao.org/mirrors
hackrf-binary-host-mirror=https://npm.taobao.org/mirrors/hackrf/v{version}
leveldown-binary-host-mirror=https://npm.taobao.org/mirrors/leveldown/v{version}
leveldown-hyper-binary-host-mirror=https://npm.taobao.org/mirrors/leveldown-hyper/v{version}
mknod-binary-host-mirror=https://npm.taobao.org/mirrors/mknod/v{version}
node-sqlite3-binary-host-mirror=https://npm.taobao.org/mirrors
node-tk5-binary-host-mirror=https://npm.taobao.org/mirrors/node-tk5/v{version}
nodegit-binary-host-mirror=https://npm.taobao.org/mirrors/nodegit/v{version}/
operadriver-cdnurl=https://npm.taobao.org/mirrors/operadriver
phantomjs-cdnurl=https://npm.taobao.org/mirrors/phantomjs
profiler-binary-host-mirror=https://npm.taobao.org/mirrors/node-inspector/
puppeteer-download-host=https://npm.taobao.org/mirrors
python-mirror=https://npm.taobao.org/mirrors/python
rabin-binary-host-mirror=https://npm.taobao.org/mirrors/rabin/v{version}
sass-binary-site=https://npm.taobao.org/mirrors/node-sass
sodium-prebuilt-binary-host-mirror=https://npm.taobao.org/mirrors/sodium-prebuilt/v{version}
sqlite3-binary-site=https://npm.taobao.org/mirrors/sqlite3
utf-8-validate-binary-host-mirror=https://npm.taobao.org/mirrors/utf-8-validate/v{version}
utp-native-binary-host-mirror=https://npm.taobao.org/mirrors/utp-native/v{version}
zmq-prebuilt-binary-host-mirror=https://npm.taobao.org/mirrors/zmq-prebuilt/v{version}
sentrycli_cdnurl=https://npm.taobao.org/mirrors/sentry-cli

附錄 : NPM中的版本號(hào)規(guī)則

版本的格式: major.minor.patch

主版本號(hào).次版本號(hào).修補(bǔ)版本號(hào)

>version

必須大于某個(gè)版本

如:>1.1.2,表示必須大于1.1.2版

>=version

可大于或等于某個(gè)版本

如:>=1.1.2比庄,表示可以等于1.1.2趾娃,也可以大于1.1.2版本

<version

必須小于某個(gè)版本

如:<1.1.2冬骚,表示必須小于1.1.2版本

<=version

可以小于或等于某個(gè)版本

如:<=1.1.2,表示可以等于1.1.2掘鄙,也可以小于1.1.2版本

~version

大概匹配某個(gè)版本

如果minor版本號(hào)指定了,那么minor版本號(hào)不變,而patch版本號(hào)任意

如果minor和patch版本號(hào)未指定半开,那么minor和patch版本號(hào)任意

如:~1.1.2,表示>=1.1.2 <1.2.0赃份,可以是1.1.2寂拆,1.1.3奢米,1.1.4,.....纠永,1.1.n

如:~1.1鬓长,表示>=1.1.0 <1.2.0,可以是同上

如:~1渺蒿,表示>=1.0.0 <2.0.0痢士,可以是1.0.0,1.0.1茂装,1.0.2怠蹂,.....,1.0.n少态,1.1.n城侧,1.2.n,.....彼妻,1.n.n

^version

兼容某個(gè)版本

版本號(hào)中最左邊的非0數(shù)字的右側(cè)可以任意

如果缺少某個(gè)版本號(hào)嫌佑,則這個(gè)版本號(hào)的位置可以任意

如:^1.1.2 ,表示 >=1.1.2 <2.0.0侨歉,可以是 1.1.2屋摇,1.1.3,.....幽邓,1.1.n炮温,1.2.n,.....牵舵,1.n.n

如:^0.2.3 柒啤,表示>=0.2.3 <0.3.0,可以是0.2.3畸颅,0.2.4担巩,.....,0.2.n

如:^0.0没炒,表示 >=0.0.0 <0.1.0涛癌,可以是0.0.0,0.0.1送火,.....拳话,0.0.n

x標(biāo)識(shí)符

x的位置表示任意版本

如:1.2.x,表示可以1.2.0漾脂,1.2.1假颇,.....,1.2.n

*標(biāo)識(shí)符

任意版本骨稿,""也表示任意版本

如:*笨鸡,表示>=0.0.0的任意版本

version1 - version2

大于等于version1姜钳,小于等于version2

如:1.1.2 - 1.3.1,表示包括1.1.2和1.3.1以及他們建的任意版本

range1 || range2

滿足range1或者滿足range2形耗,可以多個(gè)范圍

如:<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0哥桥,表示滿足這3個(gè)范圍的版本都可以

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市激涤,隨后出現(xiàn)的幾起案子拟糕,更是在濱河造成了極大的恐慌,老刑警劉巖倦踢,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件送滞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡辱挥,警方通過查閱死者的電腦和手機(jī)犁嗅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晤碘,“玉大人褂微,你說我怎么就攤上這事≡耙” “怎么了宠蚂?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長童社。 經(jīng)常有香客問我求厕,道長,這世上最難降的妖魔是什么叠洗? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任甘改,我火速辦了婚禮旅东,結(jié)果婚禮上灭抑,老公的妹妹穿的比我還像新娘。我一直安慰自己抵代,他們只是感情好腾节,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荤牍,像睡著了一般案腺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上康吵,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天劈榨,我揣著相機(jī)與錄音,去河邊找鬼晦嵌。 笑死同辣,一個(gè)胖子當(dāng)著我的面吹牛拷姿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旱函,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼响巢,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了棒妨?” 一聲冷哼從身側(cè)響起踪古,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎券腔,沒想到半個(gè)月后伏穆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纷纫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年蜈出,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涛酗。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铡原,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出商叹,到底是詐尸還是另有隱情燕刻,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布剖笙,位于F島的核電站卵洗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏弥咪。R本人自食惡果不足惜过蹂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望聚至。 院中可真熱鬧酷勺,春花似錦、人聲如沸扳躬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贷币。三九已至击胜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間役纹,已是汗流浹背偶摔。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留促脉,地道東北人辰斋。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓信不,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亡呵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抽活,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345