package.json 中的 npm 脚本(npm scripts)使用指南

2,042 阅读2分钟

本文主要介绍 npm 脚本(npm scripts)

什么是 npm 脚本

定义在 package.json(npm init -y) 里面的脚本,就称之为 npm 脚本。使用 scripts 字段定义脚本命令。如:

"scripts": {
    "serve": "node build.js"
},

//  : 前面的是自己定义的,: 后面的是一些框架,库的语法,因此执行 npm run serve === node build.js

npm 脚本的优点有很多:

  • 项目相关脚本,可以集中在一起
  • 不同项目的脚本命令,只要功能相同,就可以有同样的对外接口。用户不需要知道怎么测试你的项目,只要运行npm run test即可
  • 可以利用 npm 提供的很多辅助功能

查看当前项目的所有 npm 脚本命令,可以使用不带任何参数的 npm run 命令

npm 脚本原理

每当执行 npm run,就会自动新建一个 Shell,在这个 Shell 里面执行脚本命令。因此,只要是 Shell(或者 Bash)可以执行的命令,都可以写在脚本中

比较特别的是,npm run 新建的 Shell,会将当前目录 node_modules/.bin 的子目录加入 PATH 变量,执行结束后,再把 PATH 恢复原样。 这就意味着,当前目录的node_modules/.bin子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径。比如,当前项目的依赖里面有 Babel,只要直接写 Babel test就可以了。

"test": "Babel test"

而不用写成下面这样:

"test": "./node_modules/.bin/Babel test"

npm 脚本使用通配符

由于 npm 脚本就是 Shell 脚本,因此可以使用 Shell 通配符:

<!-- * 表示任意文件名,** 表示任意一层子目录 -->

"lint": "jshint *.js"
"lint": "jshint **/*.js"

如果要将通配符传入原始命令,防止被 Shell 转义,要将星号转义:

"test": "tap test/\*.js"

npm 脚本传参

向 npm 脚本传参,要使用 -- 标明,如:

"lint": "jshint **.js"

<!-- 向上面这句传参 -->

npm run lint --  --reporter checkstyle > checkstyle.xml

也可以在 package.json 中封装:

"lint": "jshint **.js",
"lint:checkstyle": "npm run lint -- --reporter checkstyle > checkstyle.xml"

这两个是同一个意思

npm 脚本执行顺序

如果在 npm 脚本中执行多个任务,那么需要明确他们的执行任务

如果是同时执行,可以用 &:

npm run script1.js & npm run script2.js

如果是一个执行完才能执行下一个任务的话,就用 &&:

npm run script1.js && npm run script2.js

常用脚本示栗:

// 删除目录
"clean": "rimraf dist/*",

// 本地搭建一个 HTTP 服务
"serve": "http-server -p 9090 dist/",

// 打开浏览器
"open:dev": "opener http://localhost:9090",

// 实时刷新
 "livereload": "live-reload --port 9091 dist/",

// 构建 HTML 文件
"build:html": "jade index.jade > dist/index.html",

// 只要 CSS 文件有变动,就重新执行构建
"watch:css": "watch 'npm run build:css' assets/styles/",

// 只要 HTML 文件有变动,就重新执行构建
"watch:html": "watch 'npm run build:html' assets/html",

// 部署到 Amazon S3
"deploy:prod": "s3-cli sync ./dist/ s3://example-com/prod-site/",

// 构建 favicon
"build:favicon": "node scripts/favicon.js",

想看更多的请点击:博客