package.json 是一个JSON对象,每个项目的根目录下面都有这个,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称,版本,许可证等元数据)。npm install 命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。
下面是一个更完整的package.json文件
{
"name": "Hello World",
"version": "0.0.1",
"author": "张三",
"description": "第一个node.js程序",
"keywords":["node.js","javascript"],
"repository": {
"type": "git",
"url": "https://path/to/url"
},
"license":"MIT",
"engines": {"node": "0.10.x"},
"bugs":{"url":"http://path/to/bug","email":"bug@example.com"},
"contributors":[{"name":"李四","email":"lisi@example.com"}],
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "latest",
"mongoose": "~3.8.3",
"handlebars-runtime": "~1.0.12",
"express3-handlebars": "~0.5.0",
"MD5": "~1.2.0"
},
"devDependencies": {
"bower": "~1.2.8",
"grunt": "~0.4.1",
"grunt-contrib-concat": "~0.3.0",
"grunt-contrib-jshint": "~0.7.2",
"grunt-contrib-uglify": "~0.2.7",
"grunt-contrib-clean": "~0.5.0",
"browserify": "2.36.1",
"grunt-browserify": "~1.3.0",
}
}
接下来,详细解释 package.json文件的各个字段
(1) scripts 字段
scripts 指定了运行脚本命令的npm命令行缩写,比如start指定了运行 npm run start 时,所要执行的命令
下面的设置,指定了 npm run preinstall、npm run postinstall时,所要执行的命令
"scripts": {
"preinstall": 'echo here it comes',
"postinstall": 'echo there it goes'
}
(2) dependencies字段、devDependencies字段
dependencies字段指定了项目运行所依赖的模块,devDependencies指定项目开发时所需要的模块。
它们都指向一个对象,该对象的各个成员,分别由模块名和对应的版本要求组成,表示依赖的模块及其版本范围
(3) peerDependencies
有时,你的项目和所依赖的模块,都会同时依赖另一个模块,但是所依赖的版本不一样。比如,你的项目依赖A模块和B模块的1.0版,而A模块本身又依赖B模块的2.0版。
大多数情况下,这不构成问题,B模块的两个版本可以并存,同时运行。但是,有一种情况,会出现问题,就是这种依赖关系将暴露给用户。
最典型的场景就是插件,比如A模块是B模块的插件。用户安装的B模块是1.0版本,但是A插件只能和2.0版本的B模块一起使用。这时,用户要是将1.0版本的B的实例传给A,就会出现问题。因此,需要一种机制,在模板安装的时候提醒用户,如果A和B一起安装,那么B必须是2.0模块
(4) bin字段
bin项用来指定各个内部命令对应的可执行文件的位置
"bin": {
"someTool": "./bin/someTools.js"
}
上面代码指定,someTool命令对应的可执行文件为 bin 子目录下的 someTools.js。Npm会寻找这个文件,在 node_modules/.bin/目录下建立符号链接
(5) main字段
main字段指定了加载的入口文件,require('moduleName')就会加载这个文件,这个字段的默认值是模块根目录下面的index.js
(6) config字段
用于添加命令行的环境变量
(7) 其他
7.1 browser字段
browser 指定该模板供浏览器使用的版本。Browserify这样的浏览器打包工具,通过它就知道该打包哪个文件。
"browser": {
"tipso": './node_modules/tips/src/tipso.js'
}
####7.2 engines字段
engines 字段指明了该模块运行的平台,比如 Node 的某个版本或者浏览器
{
"engines": {
"node" : ">=0.10.3 <0.12"
}
}
该字段也可以指定适用的 npm 版本
{
"engines": {
"npm": '~1.0.20'
}
}
7.3 man字段
man字段用来指定当前模块的man文档的位置
"man": [ "./doc/calc.1" ]
7.4 preferGlobal
是个布尔值,表示当用户不将该模块安装为全局模块时(即不用-global参数),要不要显示警告,表示该模块的本意就是安装为全局模块。
7.5 style字段
style指定供浏览器使用时,样式文件所在的位置。样式文件打包工具parcelify,通过它知道样式文件的打包位置。
"style": [
"./node_modules/tipso/src/tipso.css"
]