本文主要介绍 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",
想看更多的请点击:博客