npm 組件包頻繁發佈問題

項目組件庫開發問題:

項目和組件庫同時開發帶來了很多問題和不便,主要是業務初期版本號快速增長導致的:版本號過多,版本號傳遞過程中的繁瑣以及組件庫反覆安裝的痛苦

  1. npm包版本號的快速增長帶來了以下幾個問題:

調試變得不方便
之前真機測試只要發佈測試環境即可,但是現在要先發布npm包,安裝npm包,然後再發布測試環境,從一個步驟變成了三個步驟。

聯調困難
版本號的快速更新導致每次都要通知相關同學新的版本號,這中間還容易產生錯誤,導致安裝了錯誤的版本或者沒有及時更新。給測試同學增加了負擔。

醜陋的包版本號
一個小小的功能上線了幾十個版本,從1.0.0增長到了1.0.3X,既挑戰了自己的容忍度,也挑戰了合作方的安全感。

  1. 解決思路
    調試時使用npm link:npm link可以讓項目和要使用的npm包之間建立符號連接。
    換句話說,如果在項目A中使用組件包B,之前要把B打包併發布,然後項目A安裝B,打包併發布測試環境才能驗證,現在只需要B打包一下,A直接打包併發布測試環境即可(A打包時獲取的是B在本地的打包文件, 即寫在B package.json中的main文件)
在B包裏:
npm link // 相當於npm install B -g
在A包裏:
npm link B // 代碼無需修改,package.json中引用B的包會自動指向本地B的打包文件
A包發佈測試環境測試
使用npm link的方式,所有的小調整都不需要發包就可以驗證正確性,
尤其是對於不能確定正確的測試性改動,更加具有優越性。需要注意的是,
去掉了npm包的版本控制之後,一定要在git上做好代碼版本控制,否則有可能會出現丟失代碼的情況。

發佈時使用tag:

tag可以用來指帶版本號,用戶可以使用npm install <name>@<tag>安裝
對於絕大部分用戶,都是用npm install來安裝所有依賴的,這種情況下,系統會自動安裝最新的版本號,需要注意的是,
我們會經常發出測試版本,這時候用戶如果安裝,那麼就會拉取到一個有問題的測試版本,所以我們需要使用tag來區分版本。

另外,在聯調階段,反覆告知對方,我們的版本號從1.3.1改成1.3.x了是很蠢的,
所以可以指定一個tag維持版本的傳遞。同時,在B包裏使用npm info來觀察各個tag的版本號。
npm publish --tag <tag>
使用latest來設置用戶npm install默認安裝的版本,使用alpha來設置測試版本,當測試版本測試完畢之後,使用

npm dist-tag add <pkg>@<version> [<tag>]
來切換不同tag的版本號,例如,1.3.1已經測試完成,我們可以使用
npm dist-tag add [email protected] latest來把原本屬於alpha的分支切到latest。tag不加的話默認是latest。

當然,還可以通過mpm dist-tag add來添加你自己的tag。

package.json與package-lock.json
package.json:用於標註項目中對各個npm包的依賴。
package-lock.json:用於記錄當前狀態下實際安裝的各個npm package的具體來源和版本號。
由於package.json中默認是@tencent/newsH5Ad: '^1.3.1',^指的是向後兼容,這就導致npm i的時候,裝得庫的版本和之前裝得並不一樣(有可能版本號會更新一些),而這個時候若是npm包開發者沒有遵守——”相同的大版本號的包,接口保持兼容“——沒錯了,說的就是我——就會出現兼容性問題。爲了解決這個問題,所以纔有了package-lock.json。

在npm的不同版本下,package-lock.json有不同的表現。最新的在npm 5.4.2版本之後:

如果改了package.json,且package.json和lock文件不同,那麼執行npm i時npm會根據package中的版本號以及語義含義去下載最新的包,並更新至lock。如果兩者是同一狀態,那麼執行npm i都會根據lock下載,不會理會package實際包的版本是否有新。
說到這裏,package-lock.json就是yarn.lock的某種實現,其實就應該使用yarn, 使用npm i真是自討苦吃……

 版本號前的字符含義
說幾個不太容易記得
~version:大概某個版本 ~1.2.1就是>=1.2.1 && <1.3.0
^version:向後兼容 ^1.2.1就是>=1.2.1 && <2.0.0

版本號格式:主版本號.次版本號.修補版本號

主版本號:新增功能,兼容老版本
次版本號:修復bug,兼容老版本
修補版本號:新的架構調整,不兼容老版本
具體可以看《package.json中 npm依賴包版本前的符號的意義》

原文地址

發佈了65 篇原創文章 · 獲贊 17 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章