Skip to content

package.josn 文件详解

随着Nodejs的出现与流行,前端由原来的html css js刀耕火种到如今的各种工程化自动化横行,如今的项目里面都可以看到一个名为package.json的文件

一、package.json文件是干啥的?

每个用到nodejs的项目的根目录下面,一般都有一个package.json文件,这是该项目的核心。定义了这个项目所需要的各种模块、依赖包及版本、脚本命令、以及项目的配置信息 (比如名称/描述和版本/许可证等元数据) 还有运行、开发以及有选择地将项目发布到 npm 所需的信息。 npm install命令根据这个配置文件,自动下载所需要的模块,也就是配置项目所需的运行和开发环境

二、package.json 的用途是什么?

  • 1、项目的 package.json 是配置和描述如何与程序交互和运行的中心。
  • 2、npm CLI (和 yarn) 用它来识别你的项目并了解如何处理项目的依赖关系。
  • 3、package.json 文件使 npm 可以启动你的项目、运行脚本、安装依赖项、发布到 NPM 注册表以及许多其他有用的任务。
  • 4、npm CLI 也是管理 package.json 的最佳方法,因为它有助于在项目的整个生命周期内生成和更新 package.json 文件。

package.json 会在项目的生命周期中扮演多个角色,其中某些角色仅适用于发布到 NPM 的软件包。即使你没有把项目发布到 NPM 注册表中,或者没有将其公开发布给其他人,那么 package.json 对于开发流程仍然至关重要。

你的项目还必须包含 package.json,然后才能从 NPM 安装软件包。这可能是你在项目中需要它的主要原因之一。

三、创建package.json文件

创建package.json文件可以手动创建,也可以自动生成

package.json 文件必须是有效的 JSON。这意味着任何缺少的逗号、丢失的引号或其他格式错误都将阻止 npmpackage.json 进行交互。 如果确实引入了错误,则下次运行 npm 命令时将会看到错误提示。建议尽可能使用 npm CLI 更新和管理 package.json,以避免意外将错误引 入package.json中。

强烈推荐使用 npm init -y 命令创建你的 package.json, 将有助于确保你生成有效的文件。

npm init 初始化的package.josn文件如下:

json
{
  "name": "demo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

image.png

或者

img

注意:

  • 在开发中,为更好的管理package.json文件,最好使用 npm 的命令 npm installnpm uninstallnpm update 来管理依赖项,这样可以使你的 package.jsonnode_modules/ 文件夹保持同步。如果手动添加依赖项列表的话,需要你在把依赖项实际安装到项目之前运行 npm install。因为 package.json 仅是我们记录依赖项的位置,而 node_modules/ 文件夹是安装依赖项代码的实际位置,所以手动更新 package.json 的依赖项字段不会立即将我们的状态反映到 node_modules/ 文件夹。这就是为什么要用 npm 帮助管理依赖项的原因,因为它会同时更新 package.jsonnode_modules/ 文件夹。

四、package.josn中的常见字段

1. 基本字段概览

字段描述
name项目名字
version版本号
author作者
main定义 npm 包在客户端和 node 端的入口文件
browser定义 npm 包在客户端下的入口文件
module定义 npm 包在 node 端的入口文件
bin定义 npm 包在 node 端的入口文件
config用来添加命令行的环境变量
scripts指定了运行脚本命令的 npm 命令行缩写,比如 start 指定了运行 npm run start 时,所要执行的命令
dependencies指定了项目运行所依赖的模块 (生产环境) --save-P安装的依赖
devDependencies指定了项目开发所需要的模块 (开发环境) --save-dev-D安装的依赖
peerDependencies在开发 npm 包的时候,提示宿主环境去安装满足插件 A 中 peerDependencies 所指定依赖的包,然后在插件 import、require 所依赖的包的时候,永远都是引用宿主环境统一安装的 npm 包,最终解决插件与所依赖包不一致的问题,避免依赖重复安装
peerDependenciesMeta用户安装您的软件包时,如果 peerDependencies 尚未安装指定的软件包,npm 将发出警告。该 peerDependenciesMeta 字段用于向 npm 提供有关如何使用对等依赖项的更多信息
bundledDependencies这些软件包名称将在发布软件包时捆绑在一起
optionalDependencies如果找不到依赖项或安装失败,则希望 npm 继续,则可以将其放在 optionalDependencies 对象中
files(array)在发布包的时候,很重要,指明包中应该包含哪些文件,支持目录和通配
license软件许可证,规定和限制软件用户使用软件 (或其源代码) 的权利
repository代码仓库的地址
homepage(url)这个包的官网 (option)
bugs(object)给用户提供上报缺陷的途径。可以是 email 或者直接给出链接(option)
funding捐助信息,一般用不到(option)
private这个设置为 true, 就会无法 npm publish。如果项目需要保密,则需要设置该字段为 true,如果需要发包,则不能设置为 true
publishConfig定义一个包在发布到 npm 时的一些配置项

实际的字段比我们所介绍的要多,你可以在它的文档中了解其余字段,但以下的是必须要了解的 package.json 属性。

2. nameversion

在开发 npm 包的时候一定要写,因为名字加版本号是包的唯一标识;

  • name 表示包名;
  • version 表示包的版本。

但是如果是项目的话,可以不写。 具体如下:

name

js
"name": "my-project"

name 字段定义包的名称。

    1. 发布到 NPM 注册表时,这是软件包将在其中显示的名称。
    1. 它不能超过 214 个字符,只能是小写字母,并且必须是 URL 安全的 (允许连字符和下划线,但 URL 中不允许使用空格或其他字符) 。
    1. 如果将软件包发布到 NPM,则 name 属性是必需的,并且必须是唯一的。
    1. 如果尝试用 NPM 注册表上当前已经使用的名称发布程序包,则会收到错误消息。
    1. 如果你的软件包并不是要发布到 NPM 上,则 name 不必是唯一的。

提示

  • A、包名必须少于等于 214 字符
  • B、包名不能以 .\_开头
  • C、包名不能含有大写字母 (历史原因, 有的老包还有大写字母,新的已经不能用大写字母)
  • D、另外, 一些 URL 规范里不允许的字符也不能用(具体哪些字符就需要大家自己查查了)
  • E、建议不要在包名里包含 js node 等字眼, 因为 npm 默认就是 jsnode
  • F、因为包名最终会用在 require 语句里, 所以尽可能短一些,但要注意能明确表达自己的用途
  • G、你开发一个包之前, 最好自己上 npm 官网看看名字是不是已经被占用了(很重要)

version

json
"version""1.5.0",

versionpackage.json 描述的软件的当前版本

    1. version 字段对于任何已发布的软件包都非常重要,并且在发布之前是必填的。
    1. 对于未发布的程序包,此属性不是严格要求的。
    1. 通常在将新版本发布到 NPM 之前,根据 SemVer,版本号会增加。

提示

版本号注意事项:对于版本号, npm 使用业界标准的 {major}.{feature}.{patch} 模式

  • major:做了重大改变
  • feature:增加新功能
  • patch:修复一些 bug

3. homepage

表示这个包的官网

json
"homepage":"https://github.com/lijiahong123/virtual-component-v2/tree/master#readme"

4. bugs(object)

给用户提供上报缺陷的途径。可以是 email 或者直接给出链接

json

"bugs": {
    "url" : "https://github.com/owner/project/issues",
    "email" : "project@hostname.com"
}

5. license

json
"license": "ISC"

license 字段使我们可以定义适用于 package.json 所描述代码的许可证。 这是非常重要但经常被忽略的属性

    1. 在将项目发布到 NPM 注册表时,license 非常重要,因为许可证可能会限制某些开发人员或组织对软件的使用。
    1. 拥有清晰的许可证有助于明确定义该软件可以使用的术语。
    1. license 字段的值通常是许可证的标识符代码——例如 MIT 或 ISC 之类的字符串,它们代表 MIT 许可证和 ISC 许可证。
    1. 如果你不想提供许可证,或者明确不想授予使用私有或未发布的软件包的权限,则可以将 UNLICENSED 作为许可证。
    1. 如果你不确定要使用哪个许可证, Choose a License 是对你有用的资源。

6. author 和 contributors

authorcontributors 字段的功能类似。它们都是 people 字段,可以是"Name" 格式的字符串,也可以是具有 name,email,url 字段的对象。emailurl 都是可选的。

json
"author": "张三",
"contributors": [{
    "name": "李四",
    "email": "example@example.com",
    "url": "https://www.osiolabs.com/#team"
}],

或者

json
"author": {
    "name" : "package xxx",
    "email" : "00000@163.com",
    "url" : "http://xxx.com/"
},
"contributors": [
  {
      "name" : "package xxx",
      "email" : "123456@163.com",
      "url" : "http://xxxxr.com/"
  }, {
      "name" : "package xxx",
      "email" : "258475@163.com",
      "url" : "http://cccc.com/"
  }
]
    1. author 只供一个人使用,contributors 则可以由多个人组成。
    1. 这些字段是列出公共项目的联系人以及与贡献者共享信用的有用方法。

7. description 和 keywords

这两个字段都是用来在 npm 官网上搜索的, 区别是一个是字符串, 一个是字符串数组。npm 会对 description 做分词搜索, 而对于 keywords 会做精准搜索

description

json
"description": "第一个node.js程序"

NPM 注册表将 description 字段用于发布的软件包,以在搜索结果中和 npmjs.com 网站上描述该软件包。

    1. 当用户搜索 NPM 注册表时,该字符串用于帮助了解软件包。
    1. 这应该是软件包的简短摘要。
    1. 即使你没有将其发布到 NPM 注册表中,它也可以用作项目的简单文档。

keywords

json
"keywords": ["server""osiolabs""express""compression"]

keywords 字段是一个字符串数组,其作用与描述相似。

    1. NPM 注册表会为该字段建立索引,能够在有人搜索软件包时帮助找到它们。
    1. 数组中的每个值都是与你的程序包关联的一个关键字。
    1. 如果你不发布到 NPM 注册表,则这个字段用处不大,可以忽略它。

8. files

在发布包的时候,很重要,指明包中应该包含哪些文件,支持目录和通配, 值为数组

js
  "files": [
    "src",
    "dist/*.js",
    "types/*.d.ts"
  ]

发包时候,不包含在files字段中的一些文件会自动忽略掉, 不会上传到npm

9. main

定义 npm 包在客户端和 node 端的入口文件

json
"main": "src/index.js",

main 字段是 package.json 的功能属性。它定义了项目的入口点,通常是用于启动项目的文件。

    1. 如果你的包 (例如其名称为 foo-lib) 是由用户安装的,则当用户执行 require('foo-lib') 时,这是 require 返回的 main 字段中所列出的文件的 module.exports 属性。
    1. 它的值通常是项目根目录中的 index.js 文件,但也可以是你选择作为包的主入口的任何文件。
    1. 若没有 main 等其他入口文件字段,require('foo-lib')的时候,会自动找到根目录中的index.js作为入口文件

10. browser

定义 npm 包在客户端下的入口文件

json
 // browser 可定义成和 main/module 字段一一对应的映射对象,也可以直接定义为字符串
  "browser": {
    "./lib/index.js": "./lib/index.browser.js", // browser+cjs
    "./lib/index.mjs": "./lib/index.browser.mjs"  // browser+mjs
  },

  // "browser": "./lib/index.browser.js" // browser

11. module

定义 npm 包在 node 端的入口文件

json
"module": "lib/index.mjs", // module

12. bin

定义了一系列可执行命令, 在全局安装的命令行包里尤其多见;

  • 带有bin信息的包, 在局部安装后, 可执行文件会在./node_modules/.bin
  • 如果是全局安装, 可执行文件会在 $PATH 里对应npm那个目录下.
json
"bin": {
    "pm2": "./bin/pm2",
    "pm2-dev": "./bin/pm2-dev",
    "pm2-docker": "./bin/pm2-docker",
}

13. man(manuel 手册)

指定一个(或多个)文件, 用于执行man {包名}时, 用来指定当前模块的man文档的位置

json
"man" :[ "./doc/calc.1" ]

14. directories

值是一个object, 包含了lib bin man doc example test 等属性,主要是用来告诉用户某些功能目录放在哪里

json
"directories": {
    "bin": "./bin",
    "doc": "./doc",
    "lib": "./lib"
}

15. scripts

scripts 字段是 package.json 中的另一种元数据功能。指定了运行脚本命令的 npm 命令行缩写

    1. scripts 属性接受一个对象,它的值为可以通过 npm run 运行的脚本,其键为实际运行的命令。
    1. 这些通常是终端命令,我们把它们放入 scripts 字段,可以既可以记录它们又可以轻松地重用。
    1. scripts 是 npm CLI 用来运行项目任务的强大工具。他们可以完成开发过程中的大多数任务。
json
"scripts": {
    "start": "nodemon index.js",
    "dev": "node ./index.js",
    "bench:ssr": "npm run build:ssr && node benchmarks/ssr/renderToString.js && node benchmarks/ssr/renderToStream.js",
    "build": "node scripts/build.js",
    "build:ssr": "npm run build -- web-runtime-cjs,web-server-renderer",
    "build:weex": "npm run build -- weex"
}

16. repository

你可以通过提供 repository字段来记录项目代码所在的资源库。

    1. 该字段是一个对象,用于定义源代码所在的 url 及其使用的版本控制系统的类型。
    1. 对于开源项目,可能是以 Git 作为版本控制系统的 GitHubBitbucket
    1. 需要注意的是 URL 字段的本意是指向可从中访问版本控制的位置,而不仅仅是指向已发布的代码库。
json
"repository": {
    "type": "git",
    "url": "https://github.com/osiolabs/example.git"
}

或者

"repository":"https://github.com/osiolabs/example.git"

17. config

添加命令行的环境变量, 例如:

json
// 某个 package.json文件内容
{
  "name": "foo",
  "config": {
    "port": "8080"
  },
  "scripts": {
    "start": "node server.js"
  }
}

server.js脚本就可以引用config字段的中port的值:npm_package_config_xxx,如npm_package_config_port

假设server.js内容如下

js
http.createServer(/*...*/).listen(process.env.npm_package_config_port); // 获取package.json 文件中config字段的中port的值

在用户执行npm run start命令时,这个脚本就可以得到值

18. dependencies 和 devDependencies

dependencies

json
"dependencies": {
    "express": "^4.16.4",
    "compression": "~1.7.4"
}

这是 package.json 中最重要的字段之一,它列出了项目使用 (生产环境) 的所有依赖项 (项目所依赖的外部代码) 。

    1. 使用 npm CLI 安装软件包时,它将下载到你的 node_modules/ 文件夹中,并将一个条目添加到你的依赖项属性中,注意软件包的名称和已安装的版本。
    1. dependencies 字段是一个对象,其中的包名做为键,而版本或版本范围为值。
    1. 从这个列表中,当在目录中运行 npm install 时,npm 知道要获取和安装哪些包 (以及什么版本) 。
    1. package.jsondependencies 字段位于项目的核心,并定义项目所需的外部包。
    1. 在依赖版本中看到的插入符号 (^) 和波浪号 (~) 是 SemVer 中定义的版本范围的表示法。
    • ^ 他将会把当前库的版本更新到当前主版本 (也就是第一位数字) 中最新的版本。
      • 例如:"axios": "^0.18.0", 这个库会去匹配0.x.x中最新的版本,但是他不会自动更新到1.0.0
    • ~ 他会更新到当前次版本号 (也就是中间的那位数字) 中最新的版本。
      • 例如:"cross-env": "~5.2.0",这个库会去匹配更新到5.2.x的最新版本,如果出了一个新的版本为 5.3.0,则不会自动升级
  • 波浪符号是曾经 npm 安装时候的默认符号,现在已经变为了插入符号。

devDependencies

json
"devDependencies": {
    "nodemon": "^1.18.11"
}

dependencies 字段类似,但是这里列出的包仅在开发期间需要,而在生产中不需要。

例如

  • 在开发过程中使用工具重新加载项目,比如 nodemon,一旦程序部署并投入生产,将不会再使用它。

    1. devDependencies 属性使我们可以明确地指出生产中不需要哪些依赖项。
    1. 在生产环境中安装应用程序时,可以用 npm install --production 仅安装 package.jsondependency 字段中列出的内容。
    1. devDependency 是记录开发过程中程序需要哪些工具的好方法。
    1. 要将 npm 的软件包作为 devDependency 安装,可以运行 npm install --save-dev
    1. devDependencies 属性的另一种用途是在我们的 npm 脚本中使用它们。

19. engines

指明了该模块运行的平台,比如 Node 的某个版本或者浏览器

json
{
  "engines": {
    "node": ">=0.10.3 <0.12"
  }
}

20. os

指定操作系统

json
{
  "os": ["darwin", "linux", "!win32"]
}

21. cpu

指定 cpu

json
{
  "cpu": ["x64", "ia32", "!arm", "!mips"]
}

五、npm 脚本以及依赖的安装

NPM 的全称是Node Package Manager,是随同 NodeJS 一起安装的包管理和分发工具,它很方便让 JavaScript 开发者下载、安装、上传以及管理已经安装的包。

安装了 node 之后,npm 也就随之安装了,也就是说,有点“买 node 送 npm”的味道

1、安装依赖

shell
$ npm install <>
# 或者
$ npm i <>

注意: 默认会安装最新版本的依赖包,若是要安装某一版本的依赖包,可以使用以下命令

shell
$ npm install @<>
或者
$ npm i @<>

img

参数描述示例结果
S, --save装包信息将加入到 dependencies (生产阶段的依赖)npm install gulp --savenpm install gulp -S"dependencies": { "gulp": "^3.9.1"}
-D, --save-dev安装包信息将加入到devDependencies (开发阶段的依赖) ,所以开发阶段一般使用它npm install gulp --save-devnpm install gulp -D"devDependencies": { "gulp": "^3.9.1"}
-O, --save-optional安装包信息将加入到optionalDependencies (可选阶段的依赖)npm install gulp --save-optionalnpm install gulp -O"optionalDependencies": { "gulp": "^3.9.1"},
-E, --save-exact精确安装指定模块版本npm install gulp --save-exactnpm install gulp -E"dependencies": { "gulp": "3.9.1"}
-g,--global全局安装 (global)npm install gulp -gnpm i gulp --global全局可用,无需本地安装了

模块的依赖都被写入了package.json文件后,他人打开项目的根目录 (项目开源、内部团队合作) ,使用 npm install 命令可以根据 dependencies 配置安装所有的依赖包

2、卸载依赖

基础语法:

shell
npm uninstall <依赖名>

参数说明

    1. 卸载开发版本的模块:npm uninstall gulp --save-dev

3、更新依赖

基础语法:

shell
npm update [-g] [<pkg>...]

4、检查模块是否已经过时

基础语法:

shell
npm outdated [[<@scope>/]<pkg> ...]

此命令会列出所有已经过时的包,可以及时进行包的更新

img

5、查看 npm 包安装的版本

  • 若要查看所有已安装的 npm 软件包 (包括它们的依赖包) 的最新版本,则:
shell
npm list

例如

shell
 npm list
/Users/joe/dev/node/cowsay
└─┬ cowsay@1.3.1
  ├── get-stdin@5.0.1
  ├─┬ optimist@0.6.1
 ├── minimist@0.0.10
 └── wordwrap@0.0.3
  ├─┬ string-width@2.1.1
 ├── is-fullwidth-code-point@2.0.0
 └─┬ strip-ansi@4.0.0
   └── ansi-regex@3.0.0
  └── strip-eof@1.0.0

npm list -g 也一样,但适用于全局安装的软件包

  • 如果要查看软件包在 npm 仓库上最新的可用版本,则运行 npm view [package_name] version
shell
 npm view cowsay version
1.3.1

6、npm scripts 脚本

5.1、npm scripts 脚本介绍

该命令写在 package.json 文件 scripts 字段中,可以自定义命令来配置一个服务器环境和安装一系列的必要程序,例如:

json
{
  "scripts": {
    "start": "node ./index.js"
  }
}

以上脚本,只需要运行命令npm start或者npm run start,就相当于执行对应的 node ./index.js

这些定义在 package.json 里面的脚本,就称为 npm 脚本。它的优点很多:

  • 1、项目的相关脚本,可以集中在一个地方。
  • 2、不同项目的脚本命令,只要功能相同,就可以有同样的对外接口。用户不需要知道怎么测试你的项目,只要运行 npm run test 即可。
  • 3、可以利用 npm 提供的很多辅助功能。

查看当前项目的所有 npm 脚本命令,可以使用不带任何参数的 npm run 命令

5.2、npm scripts 脚本原理

npm 脚本的原理非常简单。每当执行npm run,就会自动新建一个 Shell,在这个 Shell 里面执行指定的脚本命令。因此,只要是 Shell (一般是 shell) 可以运行的命令,就可以写在 npm 脚本里面。

比较特别的是,npm run 新建的这个 Shell,会将当前目录的 node_modules/.bin 子目录加入 PATH 变量,执行结束后,再将 PATH 变量恢复原样。

这意味着,当前目录的 node_modules/.bin 子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径。比如,当前项目的依赖里面有 Mocha,只要直接写 mocha test 就可以了。

json
"test": "mocha test"

而不用写成下面这样:

json
"test": "./node_modules/.bin/mocha test"

由于 npm 脚本的唯一要求就是可以在 Shell 执行,因此它不一定是 Node 脚本,任何可执行文件都可以写在里面。

npm 脚本的退出码,也遵守 Shell 脚本规则。如果退出码不是 0,npm 就认为这个脚本执行失败。

5.3、脚本通配符

由于 npm 脚本就是 Shell 脚本,因为可以使用 Shell 通配符。

json
"lint": "jshint *.js"
"lint": "jshint **/*.js"

解释:

  • * 表示任意文件名,
  • ** 表示任意一层子目录。

如果要将通配符传入原始命令,防止被 Shell 转义,要将星号转义。

json
"test": "tap test/\*.js"

5.4、npm 脚本传参

向 npm 脚本传入参数,要使用 -- 标明。

例如:

  • npm run lint 命令传入参数,必须写成下面这样。
shell
$ npm run lint --  --reporter checkstyle > checkstyle.xml

## 上面的 reporter checkstyle > checkstyle.xml 就是参数

也可以在 package.json 里面再封装一个命令,如下:

shell
"lint": "jshint **.js",
"lint:checkstyle": "npm run lint -- --reporter checkstyle > checkstyle.xml"

5.5、npm 命令简写

四个常用的 npm 脚本有简写形式

  • npm startnpm run start
  • npm stopnpm run stop的简写
  • npm testnpm run test的简写
  • npm restartnpm run stop && npm run restart && npm run start的简写

5.6、npm 脚本执行顺序

如果 npm 脚本里面需要执行多个任务,那么需要明确它们的执行顺序。

5.6.1 同时的平行执行:&

如果是并行执行 (即同时的平行执行) ,可以使用&符号,例如:

shell
$ npm run script1.js & npm run script2.js

## 同时执行script1和script2

5.6.2 依次执行:&&

如果是继发执行 (即只有前一个任务成功,才执行下一个任务) ,可以使用&&符号。例如:

shell
npm run script1.js && npm run script2.js

注意:

  • &&& 这两个符号是 shell 的功能。此外,还可以使用 node 的任务管理模块:script-runner、npm-run-all、redrun。

5.7、常用脚本示例

shell
# 删除目录
"clean": "rimraf dist/*",

# 本地搭建一个 HTTP 服务
"serve": "http-server -p 9090 dist/",

# 打开浏览器
"open:dev": "opener http://localhost:9090",

# 实时刷新
 "livereload": "live-reload --port 9091 dist/",

# 构建 HTML 文件
"build:html": "jade index.jade > dist/index.html",

# 只要 CSS 文件有变动,就重新执行构建
"watch:css": "watch 'npm run build:css' assets/styles/",

# 只要 HTML 文件有变动,就重新执行构建
"watch:html": "watch 'npm run build:html' assets/html",

# 部署到 Amazon S3
"deploy:prod": "s3-cli sync ./dist/ s3://example-com/prod-site/",

# 构建 favicon
"build:favicon": "node scripts/favicon.js",

参考阮一峰的博客:http://www.ruanyifeng.com/blog/2016/10/npm_scripts.html

六、package.json 完整示例

json
{
  "name": "Hello World",
  "version": "0.0.1",
  "author": "张三",
  "private": true, // 如果设置为true,npm拒绝发布这个包;
  "description": "第一个node.js程序",
  "keywords": ["node.js", "javascript"],
  "repository": {
    // 项目代码存放地方
    "type": "git",
    "url": "https://path/to/url"
  },
  "man": "./sss", //指定一个单一的文件名或一个文件名数组。意思类似于linux命令中的man 命令,来查看一个命令的用法
  "license": "MIT",
  "engines": {
    "node": "0.10.x"
  }, // 指明了该模块运行的平台 node哪个版本,或某个浏览器
  "bugs": {
    "url": "http://path/to/bug",
    "email": "bug@example.com"
  },
  "contributors": [
    {
      "name": "李四",
      "email": "lisi@example.com"
    }
  ],
  "config": {
    "port": "8080" //添加命令行的环境变量
  },
  "main": "./index.js", // 指定require命令加载的入口文件;
  "bin": {
    "someTool": "./bin/someTool.js" // 将 ./bin/someTool.js利用软链接挂载到someTool上,可在scripts里使用诸如   "someTool":"someTool"来执行 ./bin/someTool.js
  },
  "scripts": {
    "prepublish": "", // 在包发布之前运行,也会在npm install安装到本地时运行
    "publish": "", // 包被发布之后运行,
    "preinstall": "", // 包被安装前运行,
    "install": "", // 包被安装后运行,
    "preuninstall": "", // 包被卸载前运行,
    "postuninstall": "", // 包被卸载后运行,
    "text": "", // npm test命令时允许
    "start": "node index.js" // 允许通过npm start 允许 node index.js
  },
  "dependencies": {
    // 项目运行所依赖的模块
    "express": "latest", // 安装最新版本
    "mongoose": "~3.8.3", // 安装3.8.3以上的版本,安装时不改变大版本号和次要版本号;
    "handlebars-runtime": "^1.0.12" // 安装 安装时不改变大版本号,可改变次要版本号和小版本号
  },
  "devDependencies": {
    // 项目开发所依赖的模块
    "bower": "~1.2.8"
  },
  "preferGlobal": true, // 当用户不将该模块安装为全局模块时 (即不用–global参数) ,要不要显示警告
  "style": [
    "./node_modules/tipso/src/tipso.css" // 供浏览器使用时,样式文件所在的位置
  ]
}

七、参考链接

nodejs 中文网:http://nodejs.cn/learn/the-package-json-guide (强烈推荐) https://www.cnblogs.com/Qooo/p/13809948.htmlhttps://www.cnblogs.com/zhaowinter/p/10905732.html《npm scripts 使用指南》阮一峰