简介
npm 允许在package.json文件里面,使用scripts字段定义脚本命令
npm run 实际上是 npm run-script 命令的简写
以传给 npm run 的第一个参数作为键,如dev,在 package.json 的 scripts 对象里面获取对应的值作为接下来要执行的命令,如果没找到直接报错;
每执行一次npm run,就会新建一个 Shell执行指定的脚本命令。因此,只要是 可运行的Shell(一般是 Bash)命令,就可以写在 npm script里面。
npm run新建的这个 Shell,会将当前目录的node_modules/.bin子目录加入PATH变量,执行结束后,再将PATH变量恢复原样。因此子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径,比如,当前项目的依赖里面有 Mocha,直接写mocha test就可以了
常用指令
- npm init : 初始化项目
- npm run :运行脚本
- npm install :安装模块
- npm uninstall :卸载模块
- npm update :升级模块
- npm search :查找模块
- npm view :查看模块版本
- npm bin :查看bin目录
- npm link :将工程链接到全局
- npm publish : 发布包
- npm deprecate : 废弃包
- npm help :查看全部指令
进阶
npm script 内部变量
npm rrun 执行的时候将package.json中的字段读取转换成了shell变量,可以通过 $npm_package_* 的形式直接访问到package.json中的字段
$npm_package_name //name in package.json
$npm_package_version //version in package.json
$npm_package_config_var1 //config.var1 in package.json
npm script参数传递
-- 参数透传
//package.json
"scripts": {
"lint:js": "eslint *.js",
"lint:js:fix": "eslint *.js --fix",
},
"scripts": {
"lint:js": "eslint *.js",
"lint:js:fix": "npm run lint:js -- --fix",
},
上面两种写法中显然后者更佳,参数传递上有些区别:--fix 参数前面的 -- 分隔符,意指要给 npm run lint:js 实际指向的命令传递额外的参数
npm script脚本钩子
为了方便开发者自定义,npm script 的设计者为命令的执行增加了类似生命周期的机制。这种特性在某些操作前需要做检查、某些操作后需要做清理的情况下非常有用。
例如 npm run cover 的时候,分 3 个阶段:
- 检查 scripts 对象中是否存在 precover 命令,如果有,先执行该命令;
- 检查是否有 cover 命令,有的话运行 cover 命令,没有的话报错;
- 检查是否存在 postcover 命令,如果有,执行 postcover 命令;
常见npm内置脚本钩子如下 :
preinstall //用户执行npm install命令时,先执行该脚本
postinstall //用户执行npm install命令时,安装结束后执行该脚本
preuninstall //卸载一个模块前执行
postuninstall //卸载一个模块后执行
prelink //Link模块前执行
postlink //Link模块后执行
pretest //运行npm test命令前执行。
posttest //运行npm test命令后执行
规律:pre_* / post_*
除了内置脚本钩子,我们也可以按规则自定义地添加钩子
例子:测试覆盖率
"scripts": {
"precover": "rm -rf coverage",
"cover": "nyc --reporter=html npm test",
"postcover": "rm -rf .nyc_output && opn coverage/index.html"
}
precover :收集覆盖率之前把之前的覆盖率报告目录清理掉;
cover :直接调用 nyc,让其生成 html 格式的覆盖率报告;
postcover :清理掉临时文件,并且在浏览器中预览覆盖率报告;