nodejs执行系统命令使我们可以在js文件中使用系统命令行来完成我们想做的事情。合并csssprites是提高前端性能,减少服务器请求必不可少的一步。有很多工具供我们使用。许多人都听说过并使用过TexturePacker。它是我认为最专业的图像合并工具。那里没人。无论是css精灵拼图还是cocos2d或flash(改名为animateCC)游戏的createjs拼图,都非常方便。工具就不详细说了,官网https://www.codeandweb.com/te...。其实前端自动化过程中有一些合并csssprites的插件,比如css-sprite(现在好像改名为sprity),node模块,gulp和grunt插件版本。但是由于项目中经常使用createjs或者cocos2d来做一些项目,所以这两个合成图片一般都是json或者plish的文件格式,css合并是不适用的。TexturePacker在拼图方面足够专业,提供了CLI命令行,想着如果用node调用它的命令行命令行就可以用文件搞定(虽然打开这个软件的GUI很方便和拖动图片,但是打开,拖动图片,点击生成这些步骤(如果有多个合并或者可能需要修改,可能需要几分钟到10分钟)。如果只需要几秒钟就可以全部搞定这些都是用一个node文件搞定的,是不是感觉效率瞬间提升了呢,废话不多说,开始吧。完成这样的自动化需要解决几个问题:node执行系统命令,或者CLI命令行,或者shell等脚本文件。TexturePacker的命令行使用node调用命令行来完成我们的自动化逻辑。node执行系统命令调用nodejs中的系统命令或者文件使用了子进程,也就是我们经常看到的child_process,它提供了几个方法://生成子进程child_process.spawn(command[,args][,options])//直接执行系统命令child_process.exec(command[,options][,callback])//调用脚本文件child_process.execFile(file[,args][,options][,callback])首先实现节点执行系统命令的函数varexec=require('child_process').exec;//要执行的命令串varcli='ipconfig';exec(cli,{encoding:'utf8'},function(err,stdout,stderr){if(err){console.log(err);return;}console.log('stdout'+stdout);console.log('stderr'+stderr);})好了,现在我们要合并工程目录下images/pack中的图片varexec=require('child_process').exec;varsrc=__dirname+'/images/pack';//TexturePacker命令字符串varcli='TexturePacker--datapack.css--sheetpack.png'+src+'--png-opt-level0--max-width2048--max-height2048';exec(cli,{encoding:'utf8'},function(err,stdout,stderr){如果(错误){控制台。日志(错误);返回;}console.log('stdout:'+stdout);console.log('stderr:'+stderr);});执行nodepack.js完成node文件操作系统命令行说明注:TexturePacker的命令行用法请参考官方文档https://www.codeandweb.com/te...node执行脚本文件如果需要将处理指令分离成一个文件便于管理,可以将相关的指令写在一个文件中,方便修改和管理工程,需要子进程的execFile方法。比如我们构建一个pack.bat文件,我们也可以构建.cmd或者其他shell脚本//pack.bat文件内容TexturePacker--datapack.css--sheetpack.png%cd%\images\pack--png-opt-level0--max-width2048--max-height2048commandline.js如下varexecFile=require('child_process').execFile;execFile('pack.bat',{encoding:'utf8'},function(err,stdout,stderr){if(err){console.log(err);return;}console.log('stdout:'+stdout);console.log('stderr:'+stderr);});nodeexecutenodecommandline.js可以完成node对脚本文件的操作,所以我们可以拖放重复的图片或者复制类似的任务,或者需要同时操作多个文件夹,瞬间完成,而且它可以节省很多时间。是不是很酷?!!!
