昨天跑的好好項(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è)范圍的版本都可以