npm 脚本概念
npm 允许在 package.json
文件中使用 scripts
字段定义脚本:
{
// ...
"scripts": {
"build": "node build.js"
}
}
执行脚本:
$ npm run build
查看所有可用脚本:
$ npm run
脚本执行原理
每当执行 npm run
,命令会自动新建一个 Shell,在这个 Shell 里面执行指定的脚本命令。因此,只要是 Shell 可以运行的命令,就可以写在 npm 脚本里面。
npm run
会将当前目录的 node_modules/.bin
子目录加入 PATH
变量中,执行结束后,再将 PATH
变量恢复原样。
所以,node_modules/.bin
子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径。
npm 脚本的唯一要求是可以在 Shell 中执行,因此它不一定是 Node 脚本,任何可执行文件都可以写在里面。
脚本通配符
"lint": "jshint *.js"
"lint": "jshint **/*.js"
上面代码中,*
表示任意文件名,**
表示任意一层子目录。
脚本传参
--
后的内容会原样传给命令。
$ npm run command1 -- param
或者再封装一个命令:
"command1": "node test.js",
"command2": "npm run command1 -- param"
$ npm run command2
执行顺序
并行执行:
$ npm run script1.js & npm run script2.js
串行执行:
$ npm run script1.js && npm run script2.js
默认脚本
npm 提供了两个默认脚本,这两个脚本不用定义,可以直接使用:
"start": "node server.js"
"install": "node-gyp rebuild"
脚本钩子
npm 脚本有pre
和post
两个钩子。举例来说,build
脚本命令的钩子就是prebuild
和postbuild
。
"prebuild": "echo I run before the build script",
"build": "cross-env NODE_ENV=production webpack",
"postbuild": "echo I run after the build script"
用户执行npm run build
的时候,会自动按照下面的顺序执行。
npm run prebuild && npm run build && npm run postbuild
因此,可以在这两个钩子里面,完成一些准备工作和清理工作。
npm 默认提供下面这些钩子
- prepublish,postpublish
- preinstall,postinstall
- preuninstall,postuninstall
- preversion,postversion
- pretest,posttest
- prestop,poststop
- prestart,poststart
- prerestart,postrestart
简写
四个常用的 npm 脚本有简写形式。
npm start
是npm run start
的简写npm stop
是npm run stop
的简写npm test
是npm run test
的简写npm restart
是npm run stop && npm run restart && npm run start
的简写
package 变量
通过npm_package_
前缀,npm 脚本可以拿到package.json
里面的字段。比如,下面是一个package.json
。
{
"name": "foo",
"version": "1.2.5",
"scripts": {
"view": "node view.js"
}
}
// view.js
console.log(process.env.npm_package_name); // foo
console.log(process.env.npm_package_version); // 1.2.5
通过环境变量process.env
对象,可以拿到package.json
的字段值。如果是 Bash 脚本,可以用$npm_package_name
和$npm_package_version
取到这两个值。
npm_package_
前缀也支持嵌套的package.json
字段。
"repository": {
"type": "git",
"url": "xxx"
},
scripts: {
"view": "echo $npm_package_repository_type"
}
可以通过npm_package_repository_type
取到repository
字段的type
属性。
config 配置变量
npm 脚本还可以通过npm_config_
前缀,拿到 npm 的配置变量,即npm config get xxx
命令返回的值。比如,当前模块的发行标签,可以通过npm_config_tag
取到。
"view": "echo $npm_config_tag",
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。