什么是npmscript?package.json文件中,如何执行scripts字段定义的脚本命令{//..."scripts":{"build":"nodebuild.js"}}是npm脚本吗?$npmrunbuild#相当于执行$nodebuild.js你知道npm脚本吗??#查看当前项目的所有npmscript命令#(其实也可以看到package.json中的scripts对象有哪些属性)npmrunnpm的原理??每当执行npmrun时,都会自动创建一个新的shell,并在这个shell中执行指定的脚本命令。因此,只要是能被Shell(一般是Bash)运行的命令,都可以写在npm脚本中。比较特别的是,npmrun创建的新shell会将当前目录的node_modules/.bin子目录添加到PATH变量中,执行完成后,PATH变量会恢复到原来的状态。也就是说,当前目录的node_modules/.bin子目录下的所有脚本都可以直接用脚本名调用,不需要加路径。由于npm脚本的唯一要求是它可以在shell中执行,因此它不一定是Node脚本,可以在其中编写任何可执行文件。npm脚本的退出代码,也遵守shell脚本规则。如果退出代码不为0,则npm认为脚本失败。Wildcard&escape和shell一样//*表示任意文件名,**表示任意一级子目录"lint":"jshint*.js""lint":"jshint**/*.js"//传递通配符输入原始命令以防止它被shell转义。转义星号"test":"taptest/\*.js"向npm脚本传递参数,使用--表示#package.json"deploy":"gulpdeploy",#命令行$npmrundeploy----test一个命令执行多个任务??#并行执行(即同时并行执行),使用&符号$npmrunserve&npmrundev#二次执行(即只有上一个任务成功才执行下一个任务),使用&&符号$npmrunbuild&&npmrundeploy默认脚本不需要定义,直接使用即可(前提是项目根目录下有server.js脚本和rebuild文件)"start":"nodeserver.js","install":"node-gyprebuild"hooknpm脚本有两个钩子,pre和postExamples#package.json"prebuild":"echoIrunbeforethebuildscript","build":"cross-envNODE_ENV=productionwebpack","postbuild":"echoIrunafterthebuildscript",#命令行$npmrunbuild#相当于执行$npmrunprebuild&&npmrunbuild&&npmrunpostbuild自定义脚本命令还可以添加前后挂钩。例如,脚本命令myscript也有premyscript和postmyscript钩子。但是双pre和post是无效的,比如prepretest和postposttest都是无效的。默认hooksprepublish,postpublishpreinstall,postinstallpreuninstall,postuninstallpreversion,postversionpretest,posttestprestop,poststopprestart,poststartprerestart,postrestartnpm_lifecycle_event变量(返回当前运行脚本的名字,pretest,test,posttest)#使用这个变量,在同一个脚本文件中,用于不同npmscripts命令写入代码constTARGET=process.env.npm_lifecycle_event;if(TARGET==='test'){console.log(`运行测试任务!`);}if(TARGET==='pretest'){console.log(`Runningthepretesttask!`);}if(TARGET==='posttest'){console.log(`Runningtheposttesttask!`);}请注意,prepublishhook不仅会在npm命令中发布,也在npminstall(不带任何参数)命令之前发布。这种行为很容易让用户感到困惑,因此npm4引入了一个新的hookprepare,它的行为等同于prepublish,从npm5开始,prepublish只会在npmpublish命令之前运行。简写npmstart是npmrunstart的简写npmstop是npmrunstop的简写npmtest是npmruntest的简写npmrestart是npmrunstop&&npmrunrestart&&npmrunstart的简写执行顺序1prerestart2prestop3stop4poststop5restart6prestart7start8poststart9postrestartnpm内部变量传递npm_package_前缀,npm脚本可以获取package.json中的字段(如果是Bash脚本,可以使用$npm_package_前缀获取值)//package.json{"name":"foo","version":"1.2.5","config":{"port":"8080"},"scripts":{"view":"nodeview.js","start":"nodeserver.js"}}//view.jsconsole.log(process.env.npm_package_name);//fooconsole.log(process.env.npm_package_version_view);//nodeview.jsnpm脚本也可以通过npm_config_prefix变量获取npm配置,也就是npmconfiggetxxx命令返回的值。例如可以通过npm_config_tag获取当前模块的releasetag。"view":"echo$npm_config_tag",注意package.json中的config对象可以被环境变量覆盖。$npmconfigsetfoo:port80列出所有环境变量"env":"env"commonscriptexample//删除目录"clean":"rimrafdist/*",//在本地构建HTTP服务"serve":"http-server-p9090dist/",//打开浏览器"open:dev":"openerhttp://localhost:9090",//实时刷新"livereload":"live-reload--port9091dist/",//构建HTML文件"build:html":"jadeindex.jade>dist/index.html",//只要CSS文件有变化,重新执行构建"watch:css":"watch'npmrunbuild:css'assets/styles/",//只要html文件有变化,重新执行build"watch:html":"watch'npmrunbuild:html'assets/html",//部署到AmazonS3"deploy:prod":"s3-clisync./dist/s3://example-com/prod-site/",//buildfavicon"build:favicon":"nodescripts/favicon.js",
