Npm優(yōu)化的工程化相關問題
package-lock.json緩存了每個包的具體版本和下載鏈接,這樣就不需要再去遠程倉庫進行查詢,節(jié)約了安裝時間,提升了部署效率。package-lock.json文件作用就是鎖定依賴安裝結構,目的就是保證在任意機器和環(huán)境上執(zhí)行npm install都會得到完全相同的node_modules安裝結果。
我們知道單一的package.json不能確定唯一的依賴樹,這是因為:
- 不同版本的npm安裝依賴策略和算法不同
- npm install將根據(jù)package.json中的semver-range version更新依賴,某些依賴項自上次安裝以來,可能已經發(fā)布了新版本。
并不是所有的子依賴都有dependencies屬性,只有子依賴的依賴和當前已安裝在根目錄的node_modules中的依賴沖突后,才會有這個屬性。
至于要不要將lockfiles文件提交到代碼倉庫中,要看項目定位進行決定。
- 如果開發(fā)一個應用,建議將package-lock.json文件提交到代碼版本倉庫
- 如果開發(fā)目標是開發(fā)一個給外部使用的庫,可以復用主項目已經加載過的包,減少依賴重復和體積
- 如果開發(fā)的庫依賴精確的版本號的模塊,那么提交lockfiles到倉庫可能會造成同一個依賴不同版本都被下載的情況
- 如果作為庫開發(fā)者,真的有使用某個特定版本依賴的需要,一個更好的方式就是定義peerDependencies
因此,推薦做法是將packjson-lock.json一起提交到代碼庫中,不需要ignore。但是在執(zhí)行npm publish命令,發(fā)布一個庫的時候,應該被忽略而不是直接發(fā)布出去。
早期npm鎖定版本的方式使用npm-shrinkwrap.json,與package-lock.json不同點在于:npm包發(fā)布的時候默認將npm-shrinkwrap.json發(fā)布,因此類庫或組件需要慎重使用。使用package-lock.json是npm v5.x版本新增特性,而npm v5.6以上才逐步穩(wěn)定在5.0-5.6中間,對于package-lock.json的處理邏輯進行了幾次更新。
在npm v5.x版本中,npm install時都會根據(jù)package-lock.json文件下載,不管package.json內容究竟是什么
npm v5.1.0版本到npm v5.4.2,npm install會無視package-lock.json文件,下載最新的npm包并進行更新package-lock.json文件
npm 5.4.2版本后
- 如果項目只有package.json文件,npm install后生成一個package-lock.json文件;
- 如果項目中存在package.json和package-lock.json文件,同時package.json文件的semver-range版本和package-lock.json中版本兼容,即使此時有新的適用版本,npm install還是會根據(jù)package-lock.json進行更新
- 如果項目存在package.json和package-lock.json文件,同時package.json文件的semver-range版本和package-lock.json中版本不兼容,npm install時package-lock.json會將更新到兼容package.json的版本
- 如果package-lock.json和npm-shrinkwrap.json同時存在項目根目錄下,package-lock.json將會被忽略
npm設計的依賴類型聲明有以下幾種:
- dependencies項目依賴----------------------------全部被下載,會部署在生成環(huán)境中
- devDependencies開發(fā)依賴-------------------------不會被自動下載,只在開發(fā)環(huán)境中使用
- peerDependencies同版本依賴-----------------------
- bundledDependencies捆綁依賴----------------------
- optionalDependencies可選依賴----------------------
并不是只有在dependencies中的模塊才會被一起打包,也不是devDependencies中的依賴一定不會被打包,這取決于項目開發(fā)過程代碼是否進行了相關的依賴引用。其實dependencies、devDependencies更多是個規(guī)范作用。
注意:在bundledDependencies中指定的依賴包必須在dependencies、devDependencies中聲明過,否則在npm pack階段會進行報錯
peerDependencies主要用于:
- 插件不能單獨運行
- 插件正確運行的前提是核心依賴庫必須先下載安裝
- 不希望核心依賴庫被重復安裝
- 插件API的設計必須要符合核心依賴庫的插件編寫規(guī)范
- 在項目中同一插進體系下,核心依賴庫版本最好相同
最后,可以得到開發(fā)建議:
優(yōu)先使用npm v5.4.2以上的npm版本,以保證npm的最基本先進性和穩(wěn)定性
項目的第一次搭建使用npm install安裝依賴包,并提交package.json、package-lock.json文件,而不提交node_moduels目錄
其它項目成員首次checkout/clone項目代碼后,執(zhí)行一次npm install安裝依賴包
對于升級依賴包的需求:
- 依靠npm update命令升級到新的小版本
- 依靠npm install@升級大版本
- 也可以手動修改package.json中的版本號,并執(zhí)行npm install來升級版本
- 本地驗證升級后新版本無問題,提交新的package.json、package-lock.json文件
對于降級依賴包的需求:執(zhí)行npm install@命令,驗證沒有問題后,提交新的package.json、package-lock.json文件
刪除某些依賴:
- 執(zhí)行npm uninstall,驗證沒有問題后,提交新的package.json、package-lock.json文件
- 手動操作package.json刪除依賴,執(zhí)行npm install驗證沒有問題后,提交新的package.json、package-lock.json文件
任何團隊提交package.json、package-lock.json文件,其他成員需要拉取更新代碼,執(zhí)行npm isntall更新依賴
任何時候都不要修改package-lock.json
如果package-lock.json出現(xiàn)沖突或問題,建議將本地package-lock.json文件刪除,拉取遠程的package-lock.json文件和package.json,再執(zhí)行npm install命令
參考:《前端基礎建設和架構設計30講》