你真的了解package.json嗎枢泰?來(lái)看看吧遇西,這可能是最全的package解析
企業(yè)常說(shuō)需要有項(xiàng)目經(jīng)驗(yàn)的人棵磷,那經(jīng)驗(yàn)僅僅只是代碼和功能模塊開發(fā)的經(jīng)驗(yàn)嗎胚鸯,深入理解package.json文件也能讓別人對(duì)你刮目相看喲,以下將一一分析每個(gè)字段的真實(shí)含義鳖目。
在我們搭建的每一個(gè)項(xiàng)目的根目錄下一般默認(rèn)都會(huì)有一個(gè)package.json文件扮叨,它定義了當(dāng)前項(xiàng)目所需要的各種模塊以及依賴文件同時(shí)也包含了項(xiàng)目的配置信息例如名稱、版本领迈、許可證等等彻磁。
當(dāng)我們拿到一個(gè)項(xiàng)目運(yùn)行命令npm install的時(shí)候,會(huì)根據(jù)package.json文件中的配置自動(dòng)下載所需的模塊狸捅,生成node_modules(用來(lái)存放用包管理工具下載安裝的包的文件夾)
一衷蜓、package.json是什么?
package.json文件是一個(gè)JSON對(duì)象尘喝,從后綴名.json就可以看出磁浇,該對(duì)象的每一個(gè)成員就是當(dāng)前項(xiàng)目的一項(xiàng)設(shè)置,比如name就是項(xiàng)目名稱朽褪,version是項(xiàng)目版本號(hào)置吓。
{
"name": "vue-project",
"version": "0.1.0",
}
以上代碼就是定義了項(xiàng)目名稱以及版本號(hào)
Package.json就是一個(gè)對(duì)象,對(duì)象中包含了多項(xiàng)屬性缔赠,在企業(yè)項(xiàng)目中我們關(guān)注較多的devDependencies 和 dependencies字段也就是項(xiàng)目運(yùn)行運(yùn)行和開發(fā)環(huán)境所依賴的模塊
那其它的字段又表示什么衍锚?有什么重要的意義?
二嗤堰、配置字段詳細(xì)剖析
1戴质、name
package.json文件中最重要的就是name和version字段,這兩項(xiàng)是必填的。名稱和版本一起構(gòu)成一個(gè)標(biāo)識(shí)符置森,該標(biāo)識(shí)符被認(rèn)為是完全唯一的斗埂。對(duì)包的更改應(yīng)該與對(duì)版本的更改一起進(jìn)行符糊。
name必須是字符串凫海,不能以.或_開頭,不能有大寫字母男娄,因?yàn)槊Q最終成為URL的一部分因此不能包含任何非URL安全字符行贪。 npm官方建議我們不要使用與核心節(jié)點(diǎn)模塊相同的名稱。不要在名稱中加js或node模闲。如果需要可以使用engines來(lái)指定運(yùn)行環(huán)境建瘫。
該名稱會(huì)作為參數(shù)傳遞給require,因此它應(yīng)該是簡(jiǎn)短的尸折,但也需要具有合理的描述性啰脚。
2、version
Version項(xiàng)目版本號(hào)实夹, x.x.x的格式, 符合語(yǔ)義化版本規(guī)則(遵循“大版本.次要版本.小版本”的格式規(guī)定)橄浓,在項(xiàng)目每次發(fā)布時(shí)需提交新的且唯一版本號(hào)
3、description
項(xiàng)目描述信息亮航,description是字符串荸实,便于用戶在npm上搜索到我們的項(xiàng)目。
"description": "vue-elementui",
4缴淋、keywords
keywords是一個(gè)字符串組成的數(shù)組准给,便于用戶在npm上搜索到我們的項(xiàng)目
"keywords":["node.js","vue", "element"],
5、homepage
homepage項(xiàng)目的主頁(yè)地址重抖。
"homepage": "https://github.com/owner"
6露氮、bugs
項(xiàng)目問(wèn)題反饋的Url或報(bào)告問(wèn)題的郵箱地址。
"bugs":{"url":"https://github.com/owner","email":"xufang_2016@163.com"},
若只設(shè)置url钟沛,則bugs可用字符串來(lái)代替對(duì)象畔规。
"bugs":"https://github.com/owner",
7、license
項(xiàng)目許可證讹剔,讓使用者知道如何使用此項(xiàng)目,有何權(quán)限來(lái)使用我們的模塊油讯,以及使用該模塊有限制等
"license" : "BSD-3-Clause"
8、author,contributors
Author表示一個(gè)person對(duì)象
Contributors表示person的數(shù)組延欠,相當(dāng)于一群person
包含了作者及貢獻(xiàn)者(我們的模塊開發(fā)者以及眾多貢獻(xiàn)者)
一個(gè)對(duì)象中包含name陌兑、url和email
"author": {
"name": "fangfang",
"email": "xufang_2016@163.com",
"url": " http://www.itiedu.cn"
}
"contributors":[{"name":" fangfang","email":" xufang_2016@163.com ","url": " http://www.itiedu.cn }]
9、files
files是一個(gè)文件數(shù)組由捎,描述了將軟件包作為依賴項(xiàng)安裝時(shí)要包括的條目兔综。如果在數(shù)組里面聲明了一個(gè)文件夾,那也會(huì)包含文件夾中的文件。某些特殊文件和目錄也被包括或排除在外软驰,無(wú)論它們是否存在于文件數(shù)組中涧窒。
簡(jiǎn)而言之,下載依賴包所包含的文件
10锭亏、main
主文件纠吴,也是項(xiàng)目的入口文件,默認(rèn)值是項(xiàng)目根目錄下的index.js慧瘤。
"main": "./index.js",
11戴已、browser
如果要在客戶端使用模塊,則應(yīng)使用browser字段來(lái)代替main字段锅减。
12糖儡、bin
bin用來(lái)指定各個(gè)內(nèi)部命令對(duì)應(yīng)的可執(zhí)行文件的位置。
"bin": {
"mybuild": "./bin/mybuild.js"
}
上面代碼指定怔匣,mybuild命令對(duì)應(yīng)的可執(zhí)行文件為 bin 子目錄下的 mybuild.js握联。當(dāng)本地安裝myapp時(shí),Npm會(huì)尋找這個(gè)文件每瞒,在./node_modules/.bin/
目錄下建立符號(hào)鏈接(快捷方式)金闽。在上面的例子中,mybuild.js會(huì)建立符號(hào)鏈接./node_modules/.bin/mybuild独泞。
./node_modules/.bin/`目錄會(huì)在運(yùn)行時(shí)加入系統(tǒng)的PATH變量呐矾,因此在運(yùn)行npm時(shí),就可以不帶路徑懦砂,直接通過(guò)命令來(lái)調(diào)用這些腳本蜒犯。
npx mybuild
所有node_modules/.bin/
目錄下的命令,都可以用npm run [命令]
或npx [命令]
的格式運(yùn)行荞膘。bin中引用的文件需以#!/usr/bin/envnode
開頭
13罚随、man
用來(lái)指定當(dāng)前模塊的man文檔的位置
"man" :[ "./doc/doc.1" ]
14、directories
用來(lái)標(biāo)識(shí)模塊結(jié)構(gòu)的方法羽资,類似于commonjs包規(guī)范的介紹淘菩,想查看npm中的package.json,就可以看到doc屠升、lib潮改、man目錄及位置
15、repository
代碼存放的地址
"repository": {
"type" : "git",
"url" : "https://github.com/npm/XXX.git"
}
16腹暖、scripts
scripts指定了運(yùn)行腳本命令的npm命令行縮寫
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build"
},
比如serve指定了項(xiàng)目運(yùn)行命令npm run serve
npm run build表示項(xiàng)目打包
17汇在、config
用于添加命令行的環(huán)境變量
"config":{
"name" : "fang",
"config" : { "port" : "8080" },
"scripts" : { "serve": "vue-cli-service serve"}
},
可以通過(guò)輸入命令npm config set來(lái)修改值
npm config set fang:port 8088
18、devDependencies 和 dependencies
dependencies脏答,依賴的意思糕殉,這些安裝包都是程序所依賴的包,需要發(fā)布到生產(chǎn)環(huán)境的.
dev即develop亩鬼,開發(fā)的意思,也就是開發(fā)環(huán)境下的依賴阿蝶。
--save參數(shù)表示將該模塊寫入dependencies屬性雳锋,--save-dev表示將該模塊寫入devDependencies屬性
例如安裝axios
安裝到開發(fā)環(huán)境 npm axios --save-dev
安裝到生產(chǎn)環(huán)境 npm axios --save
區(qū)別:
devDependencies中的插件只用于開發(fā)環(huán)境,不用于生產(chǎn)環(huán)境羡洁,而dependencies是要發(fā)布到生產(chǎn)環(huán)境
的玷过。比如babel有關(guān)的轉(zhuǎn)化es6到es5的依賴只是開發(fā)環(huán)境下轉(zhuǎn)化用,生產(chǎn)過(guò)程中是用不到焚廊,所以只用寫
在devDependencies中冶匹,而像vue或element-ui這種實(shí)際運(yùn)行會(huì)調(diào)用习劫,得寫在dependencies中咆瘟。
版本前可以加上各種限制,主要有以下幾種:
指定版本:比如1.2.2诽里,遵循“大版本.次要版本.小版本”的格式規(guī)定袒餐,安裝時(shí)只安裝指定版本。
波浪號(hào)(tilde)+指定版本:比如~1.2.2谤狡,表示安裝1.2.x的最新版本(不低于1.2.2)灸眼,但是不安裝1.3.x,也就是說(shuō)安裝時(shí)不改變大版本號(hào)和次要版本號(hào)墓懂。
插入號(hào)(caret)+指定版本:比如?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í)處于開發(fā)階段,即使是次要版本號(hào)變動(dòng)钓葫,也可能帶來(lái)程序的不兼容悄蕾。
latest:安裝最新版本。
舉例說(shuō)明下:
>1.0.2 大于當(dāng)前版本
>=1.0.2 大于等于當(dāng)前版本
<1.0.2 小于當(dāng)前版本
<=1.0.2小于等于當(dāng)前版本
~1.0.2 不低于1.0.2础浮,但不改變大版本號(hào)和次要版本號(hào)
^1.0.2 不低于1.0,2, 但不改變大版本號(hào)
1.2.x 表示1.2.3 ,1.2.4版本都支持
19帆调、peerDependencies
當(dāng)我們開發(fā)一個(gè)模塊的時(shí)候,如果當(dāng)前模塊與所依賴的模塊同時(shí)依賴一個(gè)第三方模塊豆同,并且依賴的是兩個(gè)不兼容的版本時(shí)就會(huì)出現(xiàn)問(wèn)題番刊。
比如,你的項(xiàng)目依賴A模塊和B模塊的1.0版诱告,而A模塊本身又依賴B模塊的2.0版撵枢。
大多數(shù)情況下民晒,這不構(gòu)成問(wèn)題,B模塊的兩個(gè)版本可以并存锄禽,同時(shí)運(yùn)行潜必。但是,有一種情況沃但,會(huì)出現(xiàn)問(wèn)題磁滚,就是這種依賴關(guān)系將暴露給用戶。
最典型的場(chǎng)景就是插件宵晚,比如A模塊是B模塊的插件垂攘。用戶安裝的B模塊是1.0版本,但是A插件只能和2.0版本的B模塊一起使用淤刃。這時(shí)晒他,用戶要是將1.0版本的B的實(shí)例傳給A,就會(huì)出現(xiàn)問(wèn)題逸贾。因此陨仅,需要一種機(jī)制,在模板安裝的時(shí)候提醒用戶铝侵,如果A和B一起安裝灼伤,那么B必須是2.0模塊。
peerDependencies字段咪鲜,就是用來(lái)供插件指定其所需要的主工具的版本
從npm 3.0版開始狐赡,peerDependencies不再會(huì)默認(rèn)安裝了
20、bundledDependencies
bundledDependencies是一個(gè)數(shù)組疟丙,指定發(fā)布時(shí)將定義的模塊一起打包
{
"name": "vue-project",
"version": "1.0.0",
"bundledDependencies": [
"elementui", "echarts"
]
}
21颖侄、optionaldependencies
如果出現(xiàn)包找不到或者安裝失敗時(shí),但又不影響npm繼續(xù)運(yùn)行隆敢,可將該包放在optionalDependencies對(duì)象中发皿。
"optionalDependencies": {
"echarts": "^4.9.0"
}
表示的是定義的模塊如果安裝失敗,不會(huì)在輸入npm install時(shí)失敗
22拂蝎、engines
engines
字段指明了該模塊運(yùn)行的平臺(tái)穴墅,比如Node``的某個(gè)版本,
或者npm
的某個(gè)版本或者瀏覽器温自。
"engines": {"node" : ">=8.9.0 <12.x", "npm" : "~6.14.12" }
23玄货、os
指定你的項(xiàng)目將運(yùn)行在什么操作系統(tǒng)上
"os" : [ "win32", "darwin", "linux" ],
24、cup
指定你的項(xiàng)目將運(yùn)行在什么cpu架構(gòu)上
"cpu" : [ "x64", "ia32" ]
25悼泌、private
決定我們的項(xiàng)目是否會(huì)發(fā)布松捉,如果設(shè)置為true,那么npm會(huì)拒絕發(fā)布
"private": true
26、publishConfig
模塊發(fā)布時(shí)生效馆里,設(shè)置一些值的集合
通常publishConfig
會(huì)配合private
來(lái)使用隘世,如果你只想讓模塊被發(fā)布到一個(gè)特定的npm
倉(cāng)庫(kù)可柿,如一個(gè)內(nèi)部的倉(cāng)庫(kù)
"private": true,
"publishConfig": {
"tag": "1.0.0",
"registry": "https://registry.npmjs.org/",
"access": "public"
}
27、preferGlobal
表示在不安裝為全局時(shí)給予顯示警告
此文獻(xiàn)給有需要的人丙者,寫的匆忙&個(gè)人能力有限复斥,有錯(cuò)之處望見諒!共同進(jìn)步