1

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.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",

小伍
139 声望4 粉丝