1 概述
每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。pm install
命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。
命令提示符执行npm install,则会根据package.json下载所有需要的包,npm install --production
只下载dependencies
节点的包
一个完整的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": "[email protected]"
},
"contributors": [{
"name": "李四",
"email": "[email protected]"
}],
"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中可以使用通配符:
"lint": "jshint *.js"
"lint": "jshint **/*.js"
*
表示任意文件名,**
表示任意一层子目录
2 name
字段
name
字段不能含有.
和_
,可以使用-
,不能含有非URL安全的字符
3 scripts
字段
scripts
字段指定了运行脚本命令时的npm命令缩写,比如start
指定了运行npm run start
时要执行的命令
注意的是当运行test
、start
、restart
和stop
命令时可以省略run
npm脚本中需要执行多个任务时,如果是并行执行,使用&
符号:
$ npm run script1.js & npm run script2.js
如果是继发执行,使用&&
符号:
$ npm run script1.js && npm run script2.js
更多的细节参考阮一峰的文章。
4 dependencies
字段和devDependencies
字段
4.1 使用
dependencies
字段指定了项目运行所依赖的模块,devDependencies
指定项目开发所需要的模块。
它们都指向一个对象。该对象的各个成员,分别由模块名和对应的版本要求组成,表示依赖的模块及其版本范围。
{
"devDependencies": {
"browserify": "~13.0.0",
"karma-browserify": "~5.0.1"
}
}
在单独安装某个模块时:
- 使用
--save
表示将该模块写入dependencies
属性。缩写为-S
- 使用
--save-dve
表示将该模块写入devDependencies
属性。缩写为-D
4.2 版本号
版本号 major.minor.patch
:其中:
patch
:修复bug,兼容老版本,minor
:新增功能,兼容老版本major
:新的架构调整,不兼容老版本
常用的主要有以下几种:
- 指定版本:比如1.2.2
- 波浪号(
~
):表示安装1.2.x
的最新版本 - 插入号(
^
):表示安装1.x.x
的最新版本,注意如果大版本号是0,则与波浪号使用相同,例如^0.2.3
只会安装0.2.x
的版本,这是因为此时处于开发阶段,即使是次要版本号变动,也可能带来程序的不兼容。 latest
:安装最新版本
推荐的做法:不锁版本,用 ^
引入。
在package.json中确定版本号,只能锁定本身依赖的包,但是包自身所依赖的包没有办法锁定,解决方法就是npm shrinkwrap
或者npm 5.0版本以后增加的lock
功能:
- 如果你使用 lock 机制,则应该将 package-lock.json 提交到 repo 中。比如 Vue 采取了该策略。
- 如果你不使用 lock 机制,则应该加入 .npmrc 文件,内容为
package-lock=false
,并提交到 repo 中。比如 ESLint 采取了该策略。
4.3 区别
在做项目的时候,两者可以认为没有实质的区别,但是在发布npm包的时候二者区别很大:dependencies
下的模块会作为依赖,一起被下载;devDependencies
下面的模块就不会自动下载了
一般来说,开发时依赖的东西需要安装在devDependencies
字段中,比如转义用的babel
,打包用的webpack
等,如果发布后还需要使用的则要安装在dependencies
,比如vue
、vue-router
等
5 main
字段
main
字段指定了加载的入口文件,require('moduleName')
就会加载这个文件。这个字段的默认值是模块根目录下面的index.js
6 cinfig
字段
用于添加命令行的环境变量,例如:
{
"name" : "foo",
"config" : { "port" : "8080" },
"scripts" : { "start" : "node server.js" }
}
然后,在server.js
脚本就可以引用config
字段的值。
http
.createServer(...)
.listen(process.env.npm_package_config_port)
用户可以改变这个值。
$ npm config set foo:port 80
7 keywords
和description
字段
description
是字符串,keywords
是字符串数组,简单地说,这两个东东是npm搜索系统中的搜索条件,所以。如果你试图发布的是一个开源插件,那么这两个字段你应该重视
8 license
字段
指定的项目的许可证,它告诉他人他们是否有权利使用你的包,以及,在使用你的包的时候他们应该受到怎样的限制
9 author
字段
可以是一个字符串,也可以是一个对象。如果传入对象,要包含三个属性:
name
属性(必填)email
属性(选填)URL
属性(选填)
10 engines
字段
指明了该模块运行的平台,比如Node的某个版本或者浏览器
{ "engines" : { "node" : ">=0.10.3 <0.12" } }
也可以指定适用的npm版本。
{ "engines" : { "npm" : "~1.0.20" } }