bin

用来设置可执行文件的别名,方便使用别名去执行该文件。可执行文件一般是用于node运行的js脚本,js脚本shebang 设置为 #!/usr/bin/env node ,这是告诉系统使用PATH中的node来执行该脚本。
eg: js bin文件

  1. #!/usr/bin/env node
  2. // js command

bin的一般设置形式如下:

{
    "bin": {
      "foo":"./path/to/foo.js",
      "bar":"./path/to/bar.js"
  }
}

如果只有一条记录的话,可以简写为:(这时这条命令的名字和包名一致)

{
    "bin": "./path/to/foo.js"
}

原理

在安装包时,npm会将该文件符号链接到prefix/bin中,用于全局安装,或./node_modules/.bin/用于本地安装。

mac平台:全局模块安装目录是:/usr/local/lib/node_modules, 如果模块有bin命令,则会在/usr/local/bin目录下创建bin命令名链接,指向对应的js文件。1.png

这时:一般在安装node已经将 prefix/bin 加入到 PATH 中去了,所以全局安装的包设置的bin 命令可以直接调用,如:foonode_modules/.bin/ 还未加入到 PATH 中,只能通过文件目录去执行该脚本,如:./node_modules/.bin/foo

其实package.json还有另外一个设置shell脚本的字段scripts 。它的作用主要用于将一连串的执行命令映射成一个命令,方便 npm run 来调用。

npm run 在调用时,会把 node_modules/.bin 加到 PATH 里,所以本地安装的依赖包的可执行命令可以直接调用,不需要再加前缀: node_modules/.bin

bin 和 scripts 的区别

bin 映射对象是 js可执行脚本
scripts 映射的对象是 shell脚本

dependencies

使用该包时的依赖

devDependencies

开发该包是的依赖

peerDependencies

字面意思 同等依赖。使用场景是,比如我开发了一个react的插件,告诉该插件的使用者,使用该插件的环境要确保安装了react。

peerDependenciesMeta

如果使用该包的环境没有安装peerDependencies中的包,不要警告

optionalDependencies

可选包,安装dependencies声明的依赖包时,也会安装optionalDependencies声明的依赖包,与前者的差别是,后者在安装时,如果安装失败,不会报错,这很符合可选包的含义。

bundledDependencies

打包依赖。执行打包命令npm pack时,会将声明的依赖和主包一起打包,得到一个归档文件。

参考

package.json官方文档