npm 包管理器的常用命令
測(cè)試環(huán)境為node>=8.1.3&&npm>=5.0.3
1, 安裝命令
//全局安裝
npm install 模塊名 -g
//本地安裝
npm install 模塊名
//一次性安裝多個(gè)
npm install 模塊1模塊2模塊3
//安裝開發(fā)時(shí)依賴包
npm install 模塊名 --save-dev
//安裝運(yùn)行時(shí)依賴包
npm install 模塊名--save
2, 查看安裝的目錄
//查看項(xiàng)目中模塊所在的目錄
npm root
//查看全局安裝的模塊所在目錄
npm root-g
3, 查看npm的所有命令命令
npm help
4,查看某個(gè)包的各種屬性
//查看某個(gè)包對(duì)于各種包的依賴關(guān)系
npm view 模塊名 dependencies
5,查看包的源文件地址
//查看包的源文件地址
npm view 模塊名repository.url
6
· 查看當(dāng)前模塊依賴的node最低版本號(hào)
npm view 模塊名 engines
· 查看模塊的當(dāng)前版本號(hào)
npm view 模塊名 version
//需要注意的是查看到的模塊版本是該模塊再遠(yuǎn)程倉(cāng)庫(kù)的版本號(hào)仍稀,并不是當(dāng)前項(xiàng)目中所依賴的版本號(hào)拳芙。
//查看當(dāng)前項(xiàng)目中應(yīng)用的某個(gè)模塊的版本號(hào)的命令為
npm list 模塊名 version
· 查看模塊的歷史版本和當(dāng)前版本
npm view 模塊名 versions
· 查看一個(gè)模塊的所有信息
npm view 模塊名
7察藐,查看npm使用的所有文件夾
npm help folders
8,用于更改包內(nèi)容后進(jìn)行重建
npm rebuild 模塊名
9舟扎,檢查包是否已經(jīng)過(guò)時(shí)
//此命令會(huì)列出所有已經(jīng)過(guò)時(shí)的包分飞,可以及時(shí)進(jìn)行包的更新
npm outdated
10,更新node模塊
npm update 模塊名
//當(dāng)然你也可以u(píng)pdate 該模塊到指定版本npm update 模塊名 @版本號(hào)
//如果安裝到最新版本可以使用以下命令npm install 模塊名@latest//如果當(dāng)前的版本號(hào)為2.5.1睹限,是沒辦法進(jìn)行npm update 模塊名 @2.3.1 將模塊版本號(hào)變?yōu)?.3.1的譬猫,當(dāng)然,你可以先uninstall羡疗,然后進(jìn)行install @2.3.1
11染服,卸載node模塊
npm uninstall 模塊名
12,訪問(wèn)package.json的字段文檔
npm help json
13叨恨,發(fā)布一個(gè)npm包的時(shí)候柳刮,需要檢驗(yàn)?zāi)硞€(gè)包名是否已經(jīng)存在
npm search 模塊名
14,npm init:引導(dǎo)你創(chuàng)建一個(gè)package.json文件,包括名稱秉颗、版本痢毒、作者這些信息
?· 清除npm的緩存
npm cache clean//慎重使用改命令
15, npm root 查看當(dāng)前包的安裝路徑,
? ? ?npm root -g 查看全局的包的安裝路徑
16蚕甥,npm -v 查看npm的版本
17哪替,查看某個(gè)模塊的bugs列表界面
npm bugs 模塊名//例如運(yùn)行npm bugs chai則會(huì)打開vue倉(cāng)庫(kù)的issue邑遏,效果如下圖
18躺彬,打開某個(gè)模塊的倉(cāng)庫(kù)界面
npm repo 模塊名
//例如運(yùn)行npm repo vue則會(huì)打開vue線上倉(cāng)庫(kù),效果如下圖
· 打開某個(gè)模塊的文檔
npm docs 模塊名
//例如運(yùn)行npm docs vue則會(huì)打開vue的readme.md文檔
· 打開某個(gè)模塊的主頁(yè)
npm home 模塊名
//例如運(yùn)行npm home vue則會(huì)打開vue模塊的主頁(yè)
· 查看當(dāng)前已經(jīng)安裝的模塊
npm list//當(dāng)然我們也可以限制輸入的模塊層級(jí)帝美,例如npm list--depth=0
· 清除未被使用到的模塊
//有時(shí)在我們使用npm list的時(shí)候敏释,可能會(huì)碰到一些問(wèn)題库快,就是有些模塊并沒有被項(xiàng)目引用使用,我們還是安裝了這些模塊钥顽,那么我們可以一鍵清除這些沒有使用到的模塊npm prune
版本控制
我們使用node開發(fā)時(shí)义屏,經(jīng)常需要依賴一些模塊,我們進(jìn)行了下載之后蜂大,便一直在該版本的模塊環(huán)境下進(jìn)行開發(fā)闽铐,但是線上的服務(wù)器一般都是根據(jù)依賴來(lái)配置文件,重新下載各個(gè)模塊奶浦,但是保不齊某個(gè)模塊的版本已經(jīng)更新了兄墅,這時(shí)線上的包會(huì)更新到最新的版本,但你的代碼還是依據(jù)老版本來(lái)寫的澳叉,這時(shí)可能會(huì)產(chǎn)生一些不知名的Bug,
首先看npm包的版本號(hào)的格式X.Y.Z,版本好的格式遵循semver 2.0規(guī)范隙咸,其中X為主版本號(hào),只有更新了不向下兼容的API時(shí)進(jìn)行修改主版本號(hào)成洗,Y為次版本號(hào)五督,當(dāng)模塊增加了向下兼容的功能時(shí)進(jìn)行修改,Z為修訂版本號(hào)瓶殃,當(dāng)模塊進(jìn)行了向下兼容的bug修改后進(jìn)行修改,這就是“語(yǔ)義化的版本控制”充包。
默認(rèn)情況下,當(dāng)用--save或者--save-dev安裝一個(gè)模塊時(shí)遥椿,npm通過(guò)脫字符(^)來(lái)限定所安裝模塊的主版本號(hào)基矮,而該脫字符對(duì)于不同的版本號(hào)有不同的更新機(jī)制
^1.2.1 代表的更新版本范圍為 >=1.2.1 && < 2.0.0
^0.2.1 代表的更新版本范圍為 >=0.2.1 && < 0.3.0
^0.0.2 代表的更新版本范圍為 0.0.2(相當(dāng)于鎖定為了0.0.2版本)
##### 對(duì)于上述字符的版本控制,我們可以來(lái)進(jìn)行一個(gè)嘗試:
首先可以看到package.json中對(duì)于vuex的版本依賴為^2.3.1
然后查看以下項(xiàng)目中安裝的vuex模塊的版本號(hào)
果然沒錯(cuò)冠场,改版本號(hào)為2.3.1家浇,接下來(lái)我們看一下vuex的歷史版本(npm view vuex versions)
可以看到2.3.1-2.5.0之后到了3.0.0,接下來(lái)運(yùn)行npm update vuex,查看以下更新后的版本
現(xiàn)在我們看到更新后的vuex版本號(hào)為2.5.0 < 3.0.0,可以驗(yàn)證第一條規(guī)范碴裙。
我們?cè)賮?lái)驗(yàn)證下主版本號(hào)為0的版本控制情況蓝谨,先將當(dāng)前項(xiàng)目依賴的vuex版本改為@0.6.1版本.
npm uninstall vuex
//卸載vuex成功
npm install vuex@0.6.1--save
//安裝vuex0.6.1版本成功
然后更新當(dāng)前項(xiàng)目中的vuex版本灌具,執(zhí)行代碼 npm update vuex
可以通過(guò)npm view vuex versions看到vuex的版本歷程,在0.6.3之上為0.7.0譬巫,所以當(dāng)使用脫字符(^)來(lái)控制版本號(hào)時(shí),當(dāng)主版本號(hào)為0督笆,即代表該模塊在快速構(gòu)建中時(shí)芦昔,更新項(xiàng)目時(shí)的版本范圍只能更新修訂版本號(hào)Z。
對(duì)于第三種情況娃肿,當(dāng)主版本和此版本都為0時(shí)咕缎,代表著該模塊處于一個(gè)極其不穩(wěn)定的狀態(tài),在執(zhí)行update時(shí)并不會(huì)進(jìn)行版本更新料扰。
波浪號(hào)(~)是限定模塊的次要版本凭豪,(以下規(guī)則測(cè)試方法同上,便不一 一測(cè)試)
~1.5.1允許安裝版本號(hào)大于1.5.1但小于1.6.0版本的模塊
~0.5.1允許安裝版本號(hào)為0.6.0
當(dāng)主版本號(hào)/次版本號(hào)/修訂版本號(hào)為X or x or *時(shí)晒杈,那么update或install是會(huì)下載該分支最新的版本號(hào)
(*)跟新或安裝模塊時(shí)會(huì)安裝>=0.0.0的最新版本
1.x 表示的更新范圍為>=1.0.0&&< 2.0.0
1.2.x 表示的更新范圍為>=1.2.0&&< 1.3.0
1嫂伞,當(dāng)然我們也可以把項(xiàng)目依賴的包固定在某一個(gè)版本,強(qiáng)制大家安裝相同的依賴樹拯钻,如下所示:
npm install react--save-E//此命令會(huì)將react的版本號(hào)進(jìn)行固定帖努,但是該方式只能控制項(xiàng)目中直接依賴的包的版本,無(wú)法控制項(xiàng)目模塊中依賴的包的版本號(hào)粪般,所以這種方式也無(wú)法讓不同的使用者得到相同的依賴樹拼余。
2,此外我們還可以使用npm shrinkwrap,可以將項(xiàng)目中的模塊版本進(jìn)行精確鎖定:
這時(shí)候只需要運(yùn)行命令 npm shrinkwrap,便會(huì)產(chǎn)生一個(gè)npm-shrinkwrap.json文件亩歹,這個(gè)文件保存了所有當(dāng)前使用的依賴模塊的版本:把該文件提交到git倉(cāng)庫(kù)中匙监,這樣其他人在clone你的項(xiàng)目的時(shí)候,執(zhí)行npm install命令時(shí)小作,npm檢測(cè)到該文件中的信息會(huì)完整的還原出完全相同的依賴樹亭姥,具體的使用方法如下:
npm install--save-dev react
//安裝reactnpm prune
//清除未被使用的模塊
npm shrinkwrap
但是使用這種方法,安裝一個(gè)模塊包的方式比較繁瑣躲惰。
3致份,使用yarn我們也可以得到模塊包精確控制的結(jié)果
yarn是一個(gè)與npm兼容的node包管理器,使用它安裝npm包础拨,會(huì)自動(dòng)在項(xiàng)目目錄創(chuàng)建一個(gè)yarn.lock文件氮块,該文件包含了當(dāng)前項(xiàng)目中所安裝的依賴包的版本信息,其他人在使用yarn安裝項(xiàng)目的依賴包時(shí)就可以通過(guò)該文件創(chuàng)建一個(gè)完全相同的依賴環(huán)境诡宗。
使用方法如下:
yarn init
//使用yarn創(chuàng)建一個(gè)項(xiàng)目
yarn add 模塊名
//使用yarn 安裝一個(gè)包
//還有很多yarn命令
此外滔蝉,yarn除了可以自動(dòng)幫我們鎖定依賴包的版本,yarn還在本地緩存已經(jīng)安裝過(guò)的包塔沃,當(dāng)再次安裝時(shí)蝠引,直接從本地讀取即可。安裝速度得到大大提升。但yarn的使用需要整個(gè)團(tuán)隊(duì)都去使用螃概,還是有一定的成本的矫夯。
綜上所述,目前大多數(shù)項(xiàng)目中較為簡(jiǎn)單的使用規(guī)范吊洼,在項(xiàng)目中依賴各個(gè)模塊時(shí)训貌,對(duì)于主版本號(hào)和次版本號(hào)都為0的不穩(wěn)定的項(xiàng)目,我們可以使用精確版本(exact),對(duì)于主版本號(hào)為0次版本號(hào)不為0的模塊和主版本號(hào)不為0的模塊冒窍,使用caret Range即脫字符(^)來(lái)控制版本递沪。當(dāng)然,我們也可以對(duì)項(xiàng)目依賴模塊的版本進(jìn)行精確鎖定综液。
SemVer(Semantic Versioning) 2.0.0
SemVer是一個(gè)對(duì)npm包版本進(jìn)行規(guī)范的模塊款慨,它對(duì)于npm包的版本號(hào)有著一系列的規(guī)則,以下為摘抄自SemVer 2.0.0中的規(guī)則:
1.在版本控制環(huán)節(jié)我們已經(jīng)說(shuō)過(guò)了谬莹,模塊的版本號(hào)采用X.Y.Z的格式檩奠,且都必須為非負(fù)的正整數(shù),依次為主版本號(hào)届良、次版本號(hào)笆凌,修改版本號(hào)。
2.當(dāng)規(guī)定版本的模塊進(jìn)行發(fā)布之后士葫,對(duì)于該模塊的任何修改乞而,都必須發(fā)布新版本。
3.主版本號(hào)為0.X.Y的模塊處于開發(fā)階段慢显,模塊并不穩(wěn)定。
4.主版本號(hào)在有不向下兼容的API發(fā)布時(shí)必須修改荚藻,在主版本號(hào)遞增時(shí)屋灌,次版本號(hào)和修訂版本號(hào)必須重新歸零。
5.次版本號(hào)再有向下兼容的API發(fā)布時(shí)進(jìn)行遞增修改应狱,在模塊中有API被棄用時(shí)也必須遞增次版本號(hào)共郭,當(dāng)此版本號(hào)遞增改變時(shí),修訂版本號(hào)Z必須歸零疾呻。
6.版本的優(yōu)先級(jí)就是各個(gè)版本的排序規(guī)則除嘹,判斷版本優(yōu)先級(jí)時(shí),必須把版本號(hào)從左至右分為主版本號(hào)岸蜗、此版本號(hào)尉咕、修訂版本號(hào)、以及先行版本號(hào)來(lái)進(jìn)行比較