npm
脚本的原理非常简单。每当执行npm run
,就会自动新建一个 Shell
,在这个 Shell
里面执行指定的脚本命令。
- 原理
npm run
新建的Shell
,将当前目录的node_modules/.bin
子目录加入PATH
变量,执行结束后,再将PATH
变量恢复原样。 - 通配符
*
表示任意文件名,**
表示任意一层子目录
"lint": "jshint *.js"
"lint": "jshint **/*.js"
- 参数
向npm
脚本传入参数,要使用--
标明 - 执行顺序
&
代表并行执行,&&
代表顺序执行 - npm 钩子
npm
脚本有pre
和post
两个钩子,例:build
脚本命令的钩子就是prebuild
和postbuild
。
用户执行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
对两个脚本提供了默认值。
前提是项目根目录下有server.js
和node-gyp rebuild
脚本。
npm run start
的默认值是node server.js
;
npm run install
的默认值是node-gyp rebuild
。
"start": "node server.js",
"install": "node-gyp rebuild"`
- 变量
npm
脚本有一个非常强大的功能,就是可以使用npm
的内部变量。
通过npm_package_
前缀,npm
脚本可以拿到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
npm_package_
前缀也支持嵌套的package.json
字段
"repository": {
"type": "git",
"url": "xxx"
},
scripts: {
"view": "echo $npm_package_repository_type"
}
- 常用脚本示例
// 删除目录
"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",
网友评论