什么是npm脚本?
npm 允许在package.json文件里面,使用scripts字段定义脚本命令,这些定义在package.json里面的脚本,就称为npm脚本
可以使用npm run查看当前项目的所有脚本命令
常用命令:
npm init //初始化工程
npm run //run script
npm install //安装依赖
npm update //升级依赖
npm bin //查看bin文件目录
npm link //将工程软链接到全局
npm publish //发布包
npm deprecate //废弃包
1、npm scripts访问内部变量
1)bash脚本:可以通过$npm_package_*取值:
$npm_package_name #name in package.json
$npm_package_version #version in package.json
$npm_package_config_varl #拿到npm的配置变量,即npm config get XXX命令返回的值或者
#package.json里面的config对象
注意:package.json里面的config对象可以被环境变量覆盖,例如:
{
"name" : "foo",
"config" : { "port" : "8080" },
"scripts" : { "start" : "node server.js" }
}
上面代码中,npm_package_config_port
变量返回的是8080
。这个值可以用下面的方法覆盖。
$ npm config set foo:port 80
2)在项目代码中,可以通过环境变量process.env对象拿到package.json的字段值:
console.log(process.env.npm_package_name); //name in package.json
console.log(process.env.npm_package_version); //version in package.json
2、对npm scripts二次包装过的命令传参
利用--透传参数
{
"scripts":{
"serve":"serve ./build",
"serve:prod":"npm run serve -- -l 80" //传递-l参数
}
}
3、脚本钩子
1)、脚本钩子类似于hook,当事件触发时,对应的钩子逻辑也被触发 git hook(对commit message做校验),web hook等
2)、部分npm内置脚本钩子如下:(pre-*和post-*)
preinstall //用户执行npm install命令时,先执行该脚本
postinstall //用户执行npm install命令时,安装结束后执行该脚本
preuninstall //卸载一个模块前执行
postuninstall //卸载一个模块后执行
prelink //link模块前执行
postlink //link模块后执行
pretest //运行npm test命令前执行
posttest //运行npm test命令后执行
除了内置脚本钩子,我们也可以按规则自定义的添加钩子
4、npm提供一个npm_lifecycle_event变量,返回当前正在运行的脚本名称,比如pretest、test、posttest等等,可以利用这个变量,在同一个脚本文件里面为不同的npm scripts命令编写代码
const TARGET = process.env.npm_lifecycle_event
if(TARGET === 'test'){
//执行相应的代码
}
if(TARGET === 'pretest'){
//执行相应的代码
}
if(TARGET === 'posttest'){
//执行相应的代码
}
5、执行顺序
1)如果想在一条script里顺序执行两个命令(前一个任务执行完才执行下一个任务),可以使用&&
2)如果想在一条script里并行执行两个命令(同时的平行执行),可以使用&符号
参考链接:http://www.ruanyifeng.com/blog/2016/10/npm_scripts.html