package.json文件配置信息

1.概述

每一个项目的根目录下面,通常都有一个package.json文件,定义了这个项目所须要的各类模块,以及项目的配置信息(好比名称、版本、许可证等元数据)。npm install命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。node

下面是一个最简单的package.json文件,只定义两项元数据:项目名称和项目版本。react

{
  "name" : "xxx",
  "version" : "0.0.0",
}

package.json文件就是一个JSON对象,该对象的每个成员就是当前项目的一项设置。好比name就是项目名称,version是版本(遵照“大版本.次要版本.小版本”的格式)。jquery

下面是一个更完整的package.json文件linux

 1 { 
 2   "name": "webapp",
 3   "versuion":"1.0.0",
 4   "private": true,
 5   "scripts": {
 6     "start": "roadhog server",
 7     "build": "roadhog build",
 8     "lint": "eslint --ext .js src test",
 9     "http": "http-server dist -p 8000"
10   },
11   "engines": {
12     "install-node": "6.9.2"
13   },
14   "dependencies": {
15     "antd": "^3.0.0",
16     "aphrodite": "^1.2.5",
17     "axios": "^0.16.2",
18     "babel-polyfill": "^6.26.0",
19     "babel-runtime": "^6.9.2",
20     "classnames": "^2.2.5",
21     "console-polyfill": "^0.3.0",
22     "crypto-js": "^3.1.9-1",
23     "dva": "^2.1.0",
24     "dva-loading": "^1.0.0",
25     "echarts": "^3.8.5",
26     "echarts-for-react": "^2.0.0",
27     "global": "^4.3.2",
28     "jquery": "^3.2.1",
29     "json-server": "^0.12.1",
30     "keymaster": "^1.6.2",
31     "less-vars-to-js": "^1.2.0",
32     "mockjs": "^1.0.1-beta3",
33     "path-to-regexp": "^2.1.0",
34     "qs": "^6.5.1",
35     "rc-queue-anim": "^1.6.2",
36     "react": "^16.0.0",
37     "react-cookie": "^1.0.5",
38     "react-dom": "^16.0.0",
39     "socket.io-client": "^1.7.3",
40     "swiper": "^4.3.3"
41   },
42   "devDependencies": {
43     "babel-core": "^6.26.3",
44     "babel-eslint": "^7.1.1",
45     "babel-loader": "^7.1.4",
46     "babel-plugin-dva-hmr": "^0.3.2",
47     "babel-plugin-import": "^1.4.0",
48     "babel-plugin-transform-runtime": "^6.9.0",
49     "babel-preset-react": "^6.24.1",
50     "eslint": "^3.12.2",
51     "eslint-config-airbnb": "^13.0.0",
52     "eslint-plugin-import": "^2.2.0",
53     "eslint-plugin-jsx-a11y": "^2.2.3",
54     "eslint-plugin-react": "^6.8.0",
55     "expect": "^1.20.2",
56     "husky": "^0.12.0",
57     "redbox-react": "^1.3.2",
58     "redux-logger": "^3.0.6",
59     "roadhog": "^1.4.1"
60   }
61 }

2.各个字段的含义。

1.private的含义

若是这个属性被设置为true,npm将拒绝发布它,这是为了防止一个私有模块被无心间发布出去。若是你只想让模块被发布到一个特定的npm仓库,如一个内部的仓库,可与在下面的publishConfig中配置仓库参数。ios

2.scripts的含义

scripts属性是一个对象,里边指定了项目的生命周期个各个环节须要执行的命令。key是生命周期中的事件,value是要执行的命令。
具体的内容有 install start stop 等,详见https://docs.npmjs.com/misc/scriptsgit

scripts指定了运行脚本命令的npm命令行缩写,好比start指定了运行npm run start时,所要执行的命令。web

下面的设置指定了npm run startnpm run build等时,所要执行的命令。express

  "scripts": {
    "start": "roadhog server",
    "build": "roadhog build",
    "lint": "eslint --ext .js src test",
    "http": "http-server dist -p 8000"
  },

3.engines的含义

engines字段指明了该模块运行的平台,好比 Node 的某个版本或者浏览器。npm

  "engines": {
    "install-node": "6.9.2"
  },

该字段也能够指定适用的npm版本。json

 "engines" : { 

"npm" : "~1.0.20"
}

4.dependencies的含义

dependencies字段指定了项目运行所依赖的模块,是一个对象,配置模块依赖的模块列表,key是模块名称,value是版本范围,版本范围是一个字符,能够被一个或多个空格分割。
dependencies也能够被指定为一个git地址或者一个压缩包地址。

 1 version 精确匹配版本
 2 >version 必须大于某个版本
 3 >=version 大于等于
 4 <version 小于
 5 <=versionversion 小于
 6 ~version "约等于",具体规则详见semver文档
 7 ^version "兼容版本"具体规则详见semver文档
 8 1.2.x 仅一点二点几的版本
 9 http://... 见下面url做为denpendencies的说明

注:不要把测试工具或transpilers写到dependencies中。

5.devDependencies的含义

devDependencies指定项目开发所须要的模块。

若是有人想要下载并使用你的模块,也许他们并不但愿或须要下载一些你在开发过程当中使用的额外的测试或者文档框架。
在这种状况下,最好的方法是把这些依赖添加到devDependencies属性的对象中。
这些模块会在npm link或者npm install的时候被安装,也能够像其余npm配置同样被管理,详见npm的config文档。
对于一些跨平台的构建任务,例如把CoffeeScript编译成JavaScript,就能够经过在package.json的script属性里边配置prepublish脚原本完成这个任务,而后须要依赖的coffee-script模块就写在devDependencies属性种。

  "devDependencies": {
    "babel-core": "^6.26.3",
    "babel-eslint": "^7.1.1",
    "babel-loader": "^7.1.4",
    "babel-plugin-dva-hmr": "^0.3.2",
    "babel-plugin-import": "^1.4.0",
    "babel-plugin-transform-runtime": "^6.9.0",
    "babel-preset-react": "^6.24.1",
    "eslint": "^3.12.2",
    "redbox-react": "^1.3.2",
    "redux-logger": "^3.0.6",
    "roadhog": "^1.4.1"
  }

注:

dependencies字段指定了项目运行所依赖的模块,devDependencies指定项目开发所须要的模块。

它们都指向一个对象。该对象的各个成员,分别由模块名和对应的版本要求组成,表示依赖的模块及其版本范围。

$ npm install express --save
$ npm install express --save-dev

上面代码表示单独安装express模块,--save参数表示将该模块写入dependencies属性,--save-dev表示将该模块写入devDependencies属性。

3.其余字段

6.peerDependencies的含义

有时候作一些插件开发,好比grunt等工具的插件,它们每每是在grunt的某个版本的基础上开发的,而在他们的代码中并不会出现require("grunt")这样的依赖,dependencies配置里边也不会写上grunt的依赖,为了说明此模块只能做为插件跑在宿主的某个版本范围下,能够配置peerDependencies:

  "peerDependencies": {
    "tea": "2.x"
  }

7.os

能够指定你的模块只能在哪一个操做系统上跑:
"os" : [ "darwin", "linux" ]
也能够指定黑名单而不是白名单:
"os" : [ "!win32" ]
服务的操做系统是由process.platform来判断的,这个属性容许黑白名单同时存在,虽然没啥必要这样搞...

8.cpu

限制模块只能在某某cpu架构下运行
"cpu" : [ "x64", "ia32" ]
一样能够设置黑名单:
"cpu" : [ "!arm", "!mips" ]
cpu架构经过 process.arch 判断

9 DEFAULT VALUES

npm设置了一些默认参数,如:
"scripts": {"start": "node server.js"}
若是模块根目录下有一个server.js文件,那么npm start会默认运行这个文件。
"scripts":{"preinstall": "node-gyp rebuild"}
若是模块根目录下有binding.gyp, npm将默认用node-gyp来编译preinstall的脚本
"contributors": [...]
若模块根目录下有AUTHORS 文件,则npm会按Name (url)格式解析每一行的数据添加到contributors中,能够用#添加行注释

4.参考文档列表(https://docs.npmjs.com/)