bin
用来设置可执行文件的别名,方便使用别名去执行该文件。可执行文件一般是用于node运行的js脚本,js脚本shebang 设置为 #!/usr/bin/env node
,这是告诉系统使用PATH
中的node来执行该脚本。
eg: js bin文件
#!/usr/bin/env node
// 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文件。
这时:一般在安装node已经将 prefix/bin
加入到 PATH
中去了,所以全局安装的包设置的bin 命令可以直接调用,如:foo
。 node_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时,会将声明的依赖和主包一起打包,得到一个归档文件。