1.概述
每個(gè)項(xiàng)目的根目錄下面,一般都有一個(gè)package.json文件,定義了這個(gè)項(xiàng)目所需要的各種模塊,以及項(xiàng)目的配置信息(比如名稱、版本、許可證等元數(shù)據(jù))。npm install命令根據(jù)這個(gè)配置文件,自動(dòng)下載所需的模塊,將package.json中的模塊安裝到node-modules文件夾下,也就是配置項(xiàng)目所需的運(yùn)行和開(kāi)發(fā)環(huán)境。
生成package.json文件
package.json文件可以手工編寫(xiě),也可以使用npm init命令自動(dòng)生成。這個(gè)命令采用互動(dòng)方式,要求用戶回答一些問(wèn)題,然后在當(dāng)前目錄生成一個(gè)基本的package.json文件。所有問(wèn)題之中,只有項(xiàng)目名稱(name)和項(xiàng)目版本(version)是必填的,其他都是選填的。注:如果你一路按回車確認(rèn)感覺(jué)有些麻煩,你可以直接加一個(gè)-y參數(shù),這樣npm就直接給我們生成了,即npm init -y。有了package.json文件,直接使用npm install命令,就會(huì)在當(dāng)前目錄中安裝所需要的模塊。
如果一個(gè)模塊不在package.json文件之中,可以單獨(dú)安裝這個(gè)模塊,并使用相應(yīng)的參數(shù),將其寫(xiě)入package.json文件之中。
$ npm install express --save
$ npm install express --save-dev
package.json里面不能有注釋,有會(huì)報(bào)錯(cuò)
2.name
package.json中最重要的屬性是name和version兩個(gè)屬性,這兩個(gè)屬性是必須要有的,否則模塊就無(wú)法install,這兩個(gè)屬性一起形成了一個(gè)npm模塊的唯一標(biāo)識(shí)符。模塊中內(nèi)容變更的同時(shí),模塊版本也應(yīng)該一起變化。
name屬性就是你的模塊名稱
3.version
項(xiàng)目版本
4.description
一個(gè)描述,方便別人了解你的模塊作用,搜索(npm search)的時(shí)候也有用,格式為字符串。
5.keywords
關(guān)鍵字。方便使用者在 npm search中搜索。格式為字符串。
6.scripts字段
npm 允許在package.json文件里面,使用scripts字段定義腳本命令。
{
// ...
"scripts": {
"build": "node build.js",
"preinstall": "echo here it comes!"
}
}
上面代碼build命令對(duì)應(yīng)的腳本是node build.js。
命令行下使用npm run命令,就可以執(zhí)行這段腳本。
$ npm run build
# 等同于執(zhí)行
$ node build.js
這些定義在package.json的命令(scripts)就稱為 npm 腳本。它的優(yōu)點(diǎn)很多。
1.npm 提供的很多輔助功能。
2.用戶不需要知道怎么測(cè)試你的項(xiàng)目,只要運(yùn)行npm run test即可。
查看當(dāng)前項(xiàng)目的所有 npm 腳本命令,可以使用的npm run命令。
$ npm run
7.dependencies字段
dependencies字段指定了項(xiàng)目運(yùn)行所依賴的模塊,格式為對(duì)象。該對(duì)象的各個(gè)成員,分別由模塊名和對(duì)應(yīng)的版本要求組成,表示依賴的模塊及其版本范圍。
"deependencies": {
"browserify": "~13.0.0",
"karma-browserify": "~5.0.1"
}
版本格式如下:
1.指定版本:比如1.2.2,遵循“大版本.次要版本.小版本”的格式規(guī)定,安裝時(shí)只安裝指定版本。
2.波浪號(hào)(~)+指定版本:比如~1.2.2,表示安裝1.2.x的最新版本(不低于1.2.2),但是不安裝1.3.x,也就是說(shuō)安裝時(shí)不改變大版本號(hào)和次要版本號(hào)。
3.插入號(hào)(^)+指定版本:比如^1.2.2,表示安裝1.x.x的最新版本(不低于1.2.2),但是不安裝2.x.x,也就是說(shuō)安裝時(shí)不改變大版本號(hào)。需要注意的是,如果大版本號(hào)為0,則插入號(hào)的行為與波浪號(hào)相同,這是因?yàn)榇藭r(shí)處于開(kāi)發(fā)階段,即使是次要版本號(hào)變動(dòng),也可能帶來(lái)程序的不兼容。
4.latest:安裝最新版本。
默認(rèn)在版本發(fā)布上,一個(gè)版本有三部分:X, Y, Z,分別指代大版本,小版本,與查缺補(bǔ)漏版本。比如1.2.3,那么就是大版本1,小版本2,bugfix版本3。bugfix版本不會(huì)影響任何功能,小版本變更往往是增加新功能,也不會(huì)影響使用。而大版本變更往往會(huì)帶來(lái)使用層面不兼容的情況。
8.devDependencies字段
devDependencies指定項(xiàng)目開(kāi)發(fā)所需要的模塊,格式為對(duì)象。該對(duì)象的各個(gè)成員和dependencies字段的相同。
9.安裝dependencies字段和dependencies字段
package.json文件可以手工編寫(xiě),也可以使用npm init命令自動(dòng)生成。
$ npm init
這個(gè)命令采用互動(dòng)方式,要求用戶回答一些問(wèn)題,然后在當(dāng)前目錄生成一個(gè)基本的package.json文件。所有問(wèn)題之中,只有項(xiàng)目名稱(name)和項(xiàng)目版本(version)是必填的,其他都是選填的。
有了package.json文件,直接使用npm install命令,就會(huì)在當(dāng)前目錄中安裝所需要的模塊。
$ npm install
如果一個(gè)模塊不在package.json文件之中,可以使用相應(yīng)的參數(shù),單獨(dú)安裝這個(gè)模塊,安裝后會(huì)自動(dòng)寫(xiě)入package.json文件之中。
--save參數(shù)表示將該模塊寫(xiě)入dependencies屬性,--save-dev表示將該模塊寫(xiě)入devDependencies屬性。
$ npm install express --save
$ npm install express --save-dev
上面代碼表示單獨(dú)安裝express模塊。
注意:dependencies可以叫做線上依賴,devDependencies叫做開(kāi)發(fā)依賴,區(qū)別舉個(gè)例子來(lái)說(shuō),使用webpack開(kāi)發(fā)一個(gè)vue項(xiàng)目,需要依賴vue,以及一些編譯過(guò)程中的需要的sass插件等,開(kāi)發(fā)完打包時(shí),vue屬于線上依賴,sass插件屬于開(kāi)發(fā)依賴,打包時(shí)候nodejs會(huì)根據(jù)--save還是--save-dev來(lái)判斷,線上依賴會(huì)一起打包到項(xiàng)目里面,開(kāi)發(fā)依賴不會(huì)打包。
10.engines 字段
指明了該項(xiàng)目所需要的node.js版本。也可以指定適用的npm版本
"engines": {
"node": ">= 4.0.0",
"npm": ">= 3.0.0"
},
11.Repository字段
用于指示源代碼存放的位置
"repository" :{
"type" : "git",
"url" : "http://github.com/npm/npm.git"
}
"repository" :{
"type" : "svn",
"url" : "http://v8.googlecode.com/svn/trunk/"
}
12.browserslist
眾所周知為兼容所有瀏覽器,有的CSS屬性需要對(duì)不同的瀏覽器加上前綴。
Autoprefixer使用Browserlist來(lái)確定哪些瀏覽器版本將得到支持從而添加前綴。格式為數(shù)組。
"browserslist": [
"> 1%", //全球有超過(guò)1%的人使用的瀏覽器
"last 2 versions", //根據(jù)CanIUse.com追蹤的最后兩個(gè)版本的所有瀏覽器
"not ie <= 8" // 不支持ie8及以下
]
13.private
設(shè)為true這個(gè)包將不會(huì)發(fā)布到NPM平臺(tái)下。