package.json
文件就是一个JSON对象,该对象的每个成员就是当前项目的一项设置。npm install
命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。javascript
项目名称html
项目版本号java
项目描述,便于用户在npm上搜索到咱们的项目。node
是一个字符串数组,便于用户在npm上搜索到咱们的项目。react
项目url主页,例如:"homepage": "https://github.com/owner/project#readme"
git
项目问题反馈的Url或报告问题的email地址。例如:{ "url" : "https://github.com/owner/project/issues" , "email" : "project@hostname.com" }
若只设置url,则bugs可用字符串来代替对象。"bugs":"https://github.com/owner/project/issues"
github
项目许可证,让使用者知道如何使用此项目。web
author是一个person,contributors是person的数组。一个person是一个对象,包含name、url和email。例如:{ "name" : "Barney Rubble" , "email" : "b@rubble.com" , "url" : "http://barnyrubble.tumblr.com/"}
npm
files是一个文件数组,描述了将软件包做为依赖项安装时要包括的条目。若是在数组里面声明了一个文件夹,那也会包含文件夹中的文件。某些特殊文件和目录也被包括或排除在外,不管它们是否存在于文件数组中。json
如下文件不管是否设置,老是包含: * `package.json` * `README` * `CHANGES`/`CHANGELOG`/`HISTORY` * `LICENSE`/`LICENCE` * `NOTICE` * The file in the “main” field 如下文件老是被忽略: * `.git` * `CVS` * `.svn` * `.hg` * `.lock-wscript` * `.wafpickle-N` * `.*.swp` * `.DS_Store` * `._*` * `npm-debug.log` * `.npmrc` * `node_modules` * `config.gypi` * `*.orig` * `package-lock.json`(use shrinkwrap instead)
主文件。好比默认是index.js,项目名称叫foo。那么require("foo")将返回index.js返回的内容。路径相对软件包根目录。
若是要在客户端使用模块,则应使用browser字段来代替main字段。
bin用来指定各个内部命令对应的可执行文件的位置。例如:myapp里面包含
"bin": { "someTool": "./bin/someTool.js" }
上面代码指定,someTool 命令对应的可执行文件为 bin 子目录下的 someTool.js。当本地安装myapp时,Npm会寻找这个文件,在./node_modules/.bin/
目录下创建符号连接。在上面的例子中,someTool.js会创建符号连接./node_modules/.bin/someTool
。因为./node_modules/.bin/
目录会在运行时加入系统的PATH变量,所以在运行npm时,就能够不带路径,直接经过命令来调用这些脚本。
全部node_modules/.bin/
目录下的命令,均可以用npm run [命令]
的格式运行。bin中引用的文件需以#!/usr/bin/envnode
开头
用来指定当前模块的man文档的位置。例如:
{ "name" : "foo", "version" : "1.2.3", "description" : "A packaged foo fooer for fooing foos", "main" : "foo.js", "man" : "./man/doc.1"}
该配置会在执行man foo时,使用./man/doc.1这个文件。
CommonJS包规范详细介绍了几种使用directories对象来标识包结构的方法。若是您查看npm的package.json,就会看到它有doc、lib和man目录。
代码存放地方。例如:
"repository": { "type" : "git", "url" : "https://github.com/npm/cli.git" }
若是包的package.json不在根目录中,能够经过directory来声明他所在的位置。例如:
"repository": { "type": "git", "url": "https://github.com/facebook/create-react-app.git", "directory": "packages/react-scripts" },
scripts
指定了运行脚本命令的npm命令行缩写,好比start指定了运行npm run start
时,所要执行的命令。
下面的设置指定了npm run preinstall
、npm run postinstall
、npm run start
、npm run test
时,所要执行的命令。
"scripts": { "preinstall": "echo here it comes!", "postinstall": "echo there it goes!", "start": "node index.js", "test": "tap test/*.js" }
用于添加命令行的环境变量。
{ "name" : "foo", "config" : { "port" : "8080" }, "scripts" : { "start" : "node server.js" } }
server.js中使用process.env.npm_package_config_port来获取port。
用户能够经过执行npm config set foo:port 80
来覆盖该命令
dependencies指定了项目运行所依赖的模块。devDependencies指定项目开发所须要的模块。对应的版本能够加上各类限定,主要有如下几种:
1.2.2
,遵循“大版本.次要版本.小版本”的格式规定,安装时只安装指定版本。~1.2.2
,表示安装1.2.x的最新版本(不低于1.2.2),可是不安装1.3.x,也就是说安装时不改变大版本号和次要版本号。--save
参数表示将该模块写入dependencies
属性,--save-dev
表示将该模块写入devDependencies
属性。
有时,你的项目和所依赖的模块,都会同时依赖另外一个模块,可是所依赖的版本不同。好比,你的项目依赖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模块。
peerDependencies
字段,就是用来供插件指定其所须要的主工具的版本。
{ "name": "chai-as-promised", "peerDependencies": { "chai": "1.x" } }
上面代码指定,安装chai-as-promised
模块时,主程序chai
必须一块儿安装,并且chai
的版本必须是1.x
。若是你的项目指定的依赖是chai
的2.0版本,就会报错。
注意,从npm 3.0版开始,peerDependencies
再也不会默认安装了。
定义一个数组,会在发布时将定义的模块一块儿打包。用于需在本地保存npm包或者下载单个文件时可用。例如:
{ "name": "awesome-web-framework", "version": "1.0.0", "bundledDependencies": [ "renderized", "super-streams" ] }
运行npm pack
命令会获得awesome-web-framework-1.0.0.tgz
。执行npm install awesome-web-framework-1.0.0.tgz
将在新项目中安装renderized
和super-streams
这两个依赖项
若但愿在包找不到或者安装失败时,npm继续运行,可将该包放在optionalDependencies对象中。须要你在代码中处理模块缺失的问题。optionalDependencies会覆盖dependencies中同名的,因此最好只放在一个地方。
engines
字段指明了该模块运行的平台,好比 Node 的某个版本或者浏览器。该字段也能够指定适用的npm
版本。
{ "engines" : { "node" : ">=0.10.3 <0.12" } }
指定你的项目将运行在什么操做系统上。
指定你的项目将运行在什么cpu架构上。
若是设置为true, 那么npm会拒绝发布它。
一组配置值,发布时使用。