当前位置: 首页 > 科技观察

Node.js控制台动画,绘制新年祝福

时间:2023-03-11 23:23:28 科技观察

今天是2021年的最后一天,明天就是2022年了,回顾过去的一年,感谢大家的支持。人生只有几十年,每一年都值得纪念和祝福,所以想用Node.js控制台动画送上我的新年祝福:视频2021年的最后一天,我们来学习一些cli技巧。实现原理动画需要逐帧刷新,控制台动画也不例外。控制台是如何刷新的?控制台中有一个TTY,特点是可以设置颜色,清除或修改某个位置的内容。我们使用的大多数终端都是这样的。在Node.js中,可以通过process.stdout.isTTY来判断标准输出流是否为TTY类型,然后提供readline包对其进行操作。例如使用readline.cursorTo(stream,x,y)移动光标位置,使用readline.clearLine(stream)清除某行内容,使用readline.clearScreenDown(stream)清除某行之后的所有内容位置。能够任意移动光标位置、清除内容、刷新、绘制是控制台动画的基础。绘图使用readline.wrtie(data)输出字符,你可以指定字符的颜色(使用chalk包)。它只是输出彩色字符吗?图片和艺术字呢?其实也是用字符做的,只是赋予了不同的颜色。控制台只能显示字符。左边图片的显示原理是获取图片的像素信息,然后转换成不同颜色的字符。您可以使用console-png包。右边的艺术字的显示原理是固定一些字符信息并设置颜色。使用cfonts包。总结一下:TTY型控制台可以在任意位置设置颜色、清除和修改内容,这是控制台动画逐帧刷新的基础。Node.js提供了readline模块来执行此操作。控制台只能显示字符,图片可以获取像素信息,然后用彩色字符显示。艺术字就是事先准备好绘制的字符数组,在不同的位置综合绘制这些内容,然后每隔一段时间一帧一帧地刷新。构成控制台动画。思路清晰之后,我们就来写代码来实现吧。代码实现首先,我们将使用内置模块readline逐帧刷新。调用readline.createInterface创建一个实例,并将输入输出流指定为stdin和stdout。stdin是标准输入流,指的是键盘。stdout是标准输出流,指的是监视器。constreadline=require('readline');constoutStream=process.stdout;constrl=readline.createInterface({input:process.stdin,output:outStream});然后清除整个控制台的内容,将光标移动到开头,然后清除:readline.cursorTo(outStream,0,0);readline.clearScreenDown(outStream);然后开始画文字:准备一个数组放要画的文字,然后在不同的位置显示这些文字consttextArr=['2021','Thanks','Everyone','Support','2022','We','在一起','加油!'];(asyncfunction(){for(leti=0;isetTimeout(resolve,time));}我使用asyncawait来组织代码,基于封装了一个delay方法。位置和样??式是随机的:constchalk=require('chalk');functionrandomPos(){constx=Math.floor(30*Math.random());consty=Math.floor(10*Math.random());return[x,y];}functionrandomStyle(text){conststyles=['redBright','yellowBright','blueBright','cyanBright','greenBright','magentaBright','whiteBright'];constcolor=styles[数学.floor(Math.random()*styles.length)];returnchalk[color](text);}前面的文字动画结束:然后是图片和艺术字的显示:图片需要用console-png来显示取出图像像素信息并转化为字符:constconsolePng=require('console-png');consolePng.attachTo(console);constimage=fs.readFileSync(__dirname+'/headpic.png');console.png(image);艺术字体用cfonts绘制,获取到字符后显示在右边:constCFonts=require('cfonts');constprettyFont=CFonts.render('|HAPPY|NEWYEAR',{font:'block',colors:['蓝色','黄色']});letstartX=60;letstartY=0;prettyFont.array.forEach((行,索引)=>{readline.cursorTo(outStream,startX+index,startY+index);rl.write(line);});cfont.render第一个参数中的竖线表示换行,第二个参数的字体为指定样式,colors指定颜色。然后在显示之前将光标偏移到返回的字符数组。最后在右下方显示公众号的标记:readline.cursorTo(outStream,120,25);rl.write(chalk.yellowBright('---神光的编程秘籍'));这样,最后一帧就画完了:大功告成!再看一下整体效果:视频代码上传到github:https://github.com/QuarkGluonPlasma/cli-exercise,这里贴出一份:constreadline=require('readline');constchalk=require('粉笔');constCFonts=require('cfonts');constconsolePng=require('console-png');constfs=require('fs');consolePng.attachTo(console);constoutStream=process.stdout;constrl=readline.createInterface({input:process.stdin,output:outStream});函数延迟(时间){returnnewPromise((resolve)=>setTimeout(resolve,time));}functionrandomStyle(text){conststyles=['redBright','yellowBright','blueBright','cyanBright','greenBright','magentaBright','whiteBright'];constcolor=styles[Math.floor(Math.random()*styles.length)];returnchalk[颜色](text);}functionrandomPos(){constx=Math.floor(30*Math.random());consty=Math.floor(10*Math.random());return[x,y];}readline。cursorTo(outStream,0,0);readline.clearScreenDown(outStream);constimage=fs.readFileSync(__dirname+'/headpic.png');consttextArr=['2021','谢谢','大家','支持','2022','我们','一起','加油!'];(asyncfunction(){for(leti=0;i{readline.cursorTo(outStream,startX+索引,startY+index);rl.write(line);});readline.cursorTo(outStream,120,25);rl.write(chalk.yellowBright('---神光编程秘籍'));})();概要TTY类终端支持设置字符颜色和任意位置清除修改内容,是控制台动画刷新的基础。可以使用字符数组来展示艺术字,将这些内容绘制在不同的位置可以实现丰富的展示效果。其中,控制台的光标位置修改和内容清除使用了Node.js内置的模块readline,其余为第三方包。美术字使用cfonts包,图片显示使用console-png,字体颜色使用chalk。控制台是我们日常使用的,大部分前端工具都是cli的形式。深入学习cli展示各种内容和动画知识,有助于更好的理解一些cli工具,写出更好的cli工具。最后,再次感谢大家过去一年的支持,明年我们一起努力吧~