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 脚本有prepost两个钩子。举例来说,build脚本命令的钩子就是prebuildpostbuild

"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 startnpm run start的简写
  • npm stopnpm run stop的简写
  • npm testnpm run test的简写
  • npm restartnpm 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.jsconsole.log(process.env.npm_package_name); // fooconsole.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",