关于node.js:NPM-Scripts-的使用

45次阅读

共计 1993 个字符,预计需要花费 5 分钟才能阅读完成。

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

正文完
 0