
昨天跑的好好項目,今天跑不起來
我們在開發周期比較長的前端項目的時候,必然會遇到依賴管理的問題. 我們在開發項目的時候,我們用了大量的三方庫.這些三方的依賴庫時不時的會更新自己的代碼.
第三方依賴庫的代碼更新會很容易造成代碼運行的不穩定, 比如昨天還跑的好好的項目,另一位剛剛接手的同學重新安裝依賴之后項目就完全跑不起來了. 或者自己機器跑的好好的代碼,扔到打包機上重新打包之后就完全跑不起來.
因為三方依賴庫用的太多,很多時候并不能很快速的定位到項目為什么跑不起來. 特別是開發RN項目的時候,一個依賴更新的問題可能會定位一個大半天才能找到罪魁禍首(曾經的我為了這種事情浪費了大量的青春).
鎖定NPM依賴版本
對于那些你不熟悉,或者不能保證穩定的三方npm包,我這邊的做法是直接鎖定版本號
. 這件事情做的越早越好,不要盲目相信三方npm越更新性能越好. 他會時不時的讓你痛一下.讓你浪費大量的時間去尋找到底是誰影響了你的代碼正常運行.
第三方npm包有bug如何解決?
升級原有npm包版本
如果你發現了你的第三方npm有bug,建議不要盲目的升級版本.
第一步你需要先看這個npm包的 changelog
,如果有明確修復過這個bug, 才會建議你升級.但是不能保證升級之后可能會帶來其他bug.
修掉bug發布在公司私有源
但是我還是比較建議,在原來版本的npm包上修掉這個bug,并且修改npm包名為公司內部包,發布到公司私有npm源上.
如果因為npm版本的改動,導致項目不穩定,也可以縮小排查范圍,快速定位到是哪一個npm庫導致的問題.
例如: mobx => @公司源/mobx
小技巧: .npmrc配置
如果你有發布到公司私有源的三方npm包, 你可以嘗試修改.npmrc文件使用npm名的作用域直接指向公司私有源
例如:
@公司源:registry=http://npm.xxx.com
@tarojs:registry=http://npm.xxx.com
所有項目依賴統一管理
上面說到了我們將所有的有不穩定的npm包鎖定版本,保證項目長期維護可以正常運行. 現在我們團隊開發的跨端項目將近上百個. 為了保證上百個的項目可以長期穩定運行. 我將所有的依賴封裝成了一個npm庫,里面沒有任何的js代碼,只有穩定的依賴. 所有的項目都會引入這個核心的依賴,以保證所有項目可以穩定運行.
保證項目使用npm的差異化,強行指定版本
所有依賴全部統一之后,肯定會有項目因為一些原因不想使用個別的三方npm包. 這里就必須要提到package.json
依賴管理的 resolutions
屬性. 這樣npm就會將多版本共存的版本,強行指定某一版本,滿足個別項目的特定需求.
使用方法如下:
// package.json
{"resolutions": {"hoek": "4.2.1"}
}
當然你也可以使用這個工具,將依賴強制指定版本: https://www.npmjs.com/package/npm-force-resolutions
加速你的npm安裝速度
除了大家都知道的npm換源之外,npm依賴的執行文件下載也會拖慢你的依賴安裝速度.
以下是我們團隊使用的.npmrc
配置,對于一些npm依賴的執行文件, 可以使用該配置加速你的npm構建速度.
.npmrc文件的位置在你的home目錄下,你也可以在項目根目錄創建該文件.
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中的版本號規則
版本的格式: major.minor.patch
主版本號.次版本號.修補版本號
>version
必須大于某個版本
如:>1.1.2,表示必須大于1.1.2版
>=version
可大于或等于某個版本
如:>=1.1.2
,表示可以等于1.1.2,也可以大于1.1.2版本
<version
必須小于某個版本
如:<1.1.2
,表示必須小于1.1.2版本
<=version
可以小于或等于某個版本
如:<=1.1.2
,表示可以等于1.1.2,也可以小于1.1.2版本
~version
大概匹配某個版本
如果minor版本號指定了,那么minor版本號不變,而patch版本號任意
如果minor和patch版本號未指定,那么minor和patch版本號任意
如:~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
兼容某個版本
版本號中最左邊的非0數字的右側可以任意
如果缺少某個版本號,則這個版本號的位置可以任意
如:^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標識符
x的位置表示任意版本
如:1.2.x,表示可以1.2.0,1.2.1,.....,1.2.n
*標識符
任意版本,""也表示任意版本
如:*,表示>=0.0.0的任意版本
version1 - version2
大于等于version1,小于等于version2
如:1.1.2 - 1.3.1
,表示包括1.1.2和1.3.1以及他們建的任意版本
range1 || range2
滿足range1或者滿足range2,可以多個范圍
如:<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0
,表示滿足這3個范圍的版本都可以
***
公眾號“ **Alili丶前端大爆炸**”,關注后提供海量學習資料
