激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - node.js - Node.js 控制臺動畫,繪制跨年祝福

Node.js 控制臺動畫,繪制跨年祝福

2022-01-04 22:26神光的編程秘籍神說要有光zxg node.js

Node.js 里面可以通過 process.stdout.isTTY 來查看是否是 TTY 類型的標準輸出流,然后提供了 readline 這個包來操作它。

Node.js 控制臺動畫,繪制跨年祝福

今天是 2021 年的最后一天了,明天就是 2022 年。回顧過去一年,要特別感謝大家對我的支持。

人生不過幾十年,每一年都值得紀念和祝福,所以我想用 Node.js 控制臺動畫送上一份我的新年祝福:

Node.js 控制臺動畫,繪制跨年祝福

視頻

2021 年的最后一天,我們來學點 cli 的技術吧。

實現原理

動畫都需要一幀幀的刷新,控制臺動畫也不例外。

那控制臺是怎么刷新的呢?

控制臺中有一種叫做 TTY,特點是可以設置顏色,可以清除或修改某個位置的內容。平時我們用的 Terminal 大多都是這種。

Node.js 里面可以通過 process.stdout.isTTY 來查看是否是 TTY 類型的標準輸出流,然后提供了 readline 這個包來操作它。

比如用 readline.cursorTo(stream, x, y) 來移動光標位置, readline.clearLine(stream) 來清除某行的內容,用 readline.clearScreenDown(stream)來清除某個位置之后的所有內容。

能夠移動光標位置,能夠清除內容,也就能夠刷新、能夠做任意的繪制,這是控制臺動畫的基礎。

繪制用 readline.wrtie(data) 來輸出字符,可以指定字符的顏色(用 chalk 這個包)。

只是輸出帶顏色的字符么?那張圖片和那個藝術字呢?

其實那也是字符來做的,只不過給上了不同的顏色而已,控制臺只能顯示字符。

Node.js 控制臺動畫,繪制跨年祝福

左邊的這張圖片的顯示原理是拿到圖片的像素信息,然后轉成不同顏色的字符。可以用 console-png 這個包。

Node.js 控制臺動畫,繪制跨年祝福

右邊的藝術字的顯示原理是固定的一些字符信息,設置上顏色。用的是 cfonts 這個包。

Node.js 控制臺動畫,繪制跨年祝福

小結一下:

TTY 類型的控制臺可以設置顏色、可以在任意位置清除和修改內容,這是控制臺動畫能一幀幀刷新的基礎,Node.js 提供了 readline 模塊來做這些。

控制臺只能顯示字符,圖片可以拿到像素信息然后用帶顏色的字符來顯示,藝術字是提前準備好字符數組來繪制,綜合把這些內容繪制在不同的位置,然后定時一幀幀刷新就構成了控制臺動畫。

思路通了之后,我們來寫代碼實現一下。

代碼實現

首先,我們會用到 readline 這個內置模塊,用它來做一幀幀的刷新。

調用 readline.createInterface 來創建一個實例,指定輸入輸出流為 stdin、stdout。

stdin 是標準輸入流,是指鍵盤。

stdout 是標準輸出流,是指顯示器。

  1. const readline = require('readline'); 
  2.  
  3. const outStream = process.stdout; 
  4.  
  5. const rl = readline.createInterface({ 
  6.     input: process.stdin, 
  7.     output: outStream 
  8. }); 

然后清除整個控制臺的內容,把光標移動到開始,然后 clear:

  1. readline.cursorTo(outStream, 0, 0); 
  2. readline.clearScreenDown(outStream); 

然后開始繪制文字:

準備一個數組放要繪制的文字,然后定時在不同的位置顯示這些文字

  1. const textArr = ['2021''感謝''大家的''支持','2022''我們','一起','加油!']; 
  2.  
  3. (async function () { 
  4.     for(let i = 0; i< textArr.length; i++) { 
  5.         readline.cursorTo(outStream, ...randomPos()); 
  6.         rl.write(randomStyle(textArr[i])); 
  7.  
  8.         await delay(1000); 
  9.         readline.cursorTo(outStream, 0, 0); 
  10.         readline.clearScreenDown(outStream); 
  11.     } 
  12. })(); 
  13.  
  14. function delay(time) { 
  15.     return new Promise((resolve) => setTimeout(resolve, time)); 

我用了 async await 的方式來組織代碼,基于封裝了一個 delay 方法。

其中位置、樣式都是隨機的:

  1. const chalk = require('chalk'); 
  2.  
  3. function randomPos() { 
  4.     const x = Math.floor(30 * Math.random()); 
  5.     const y = Math.floor(10 * Math.random()); 
  6.     return [x, y]; 
  7.  
  8. function randomStyle(text) { 
  9.     const styles = ['redBright','yellowBright''blueBright''cyanBright','greenBright''magentaBright''whiteBright']; 
  10.     const color = styles[Math.floor(Math.random() * styles.length)]; 
  11.     return chalk[color](text); 

前面的文字動畫就做完了:

Node.js 控制臺動畫,繪制跨年祝福

然后是圖片和藝術字的顯示:

圖片需要用 console-png 來把圖片像素信息取出來轉成字符的形式:

  1. const consolePng = require('console-png'); 
  2. consolePng.attachTo(console); 
  3.  
  4. const image = fs.readFileSync(__dirname + '/headpic.png'); 
  5. console.png(image); 

藝術字用 cfonts 來繪制,拿到字符之后顯示在右邊的位置:

  1. const CFonts = require('cfonts'); 
  2.  
  3. const prettyFont = CFonts.render('|HAPPY|NEW YEAR', { 
  4.     font:'block',  
  5.     colors: ['blue''yellow'
  6. }); 
  7.  
  8. let startX = 60; 
  9. let startY = 0; 
  10. prettyFont.array.forEach((line, index) => { 
  11.     readline.cursorTo(outStream, startX + index, startY + index); 
  12.     rl.write(line); 
  13. }); 

cfont.render 的第一個參數里的豎線是指換行,第二個參數的 font 是指定樣式,colors 指定顏色。

然后對返回的字符數組做光標的偏移之后再顯示。

最后,在右下方顯示公眾號的標記:

  1. readline.cursorTo(outStream, 120, 25); 
  2. rl.write(chalk.yellowBright('---神光的編程秘籍')); 

這樣,最后這一幀就繪制完了:

Node.js 控制臺動畫,繪制跨年祝福

大功告成!我們再來看下整體的效果:

Node.js 控制臺動畫,繪制跨年祝福

視頻

代碼上傳到了 github:https://github.com/QuarkGluonPlasma/cli-exercise

也在這里貼一份:

  1. const readline = require('readline'); 
  2. const chalk = require('chalk'); 
  3. const CFonts = require('cfonts'); 
  4. const consolePng = require('console-png'); 
  5. const fs = require('fs'); 
  6.  
  7. consolePng.attachTo(console); 
  8.  
  9. const outStream = process.stdout; 
  10.  
  11. const rl = readline.createInterface({ 
  12.     input: process.stdin, 
  13.     output: outStream 
  14. }); 
  15.  
  16. function delay(time) { 
  17.     return new Promise((resolve) => setTimeout(resolve, time)); 
  18.  
  19. function randomStyle(text) { 
  20.     const styles = ['redBright','yellowBright''blueBright''cyanBright','greenBright''magentaBright''whiteBright']; 
  21.     const color = styles[Math.floor(Math.random() * styles.length)]; 
  22.     return chalk[color](text); 
  23.  
  24. function randomPos() { 
  25.     const x = Math.floor(30 * Math.random()); 
  26.     const y = Math.floor(10 * Math.random()); 
  27.     return [x, y]; 
  28.  
  29. readline.cursorTo(outStream, 0, 0); 
  30. readline.clearScreenDown(outStream); 
  31.   
  32. const image = fs.readFileSync(__dirname + '/headpic.png'); 
  33.  
  34. const textArr = ['2021''感謝''大家的''支持','2022''我們','一起','加油!']; 
  35.  
  36. (async function () { 
  37.     for(let i = 0; i< textArr.length; i++) { 
  38.         readline.cursorTo(outStream, ...randomPos()); 
  39.         rl.write(randomStyle(textArr[i])); 
  40.  
  41.         await delay(1000); 
  42.         readline.cursorTo(outStream, 0, 0); 
  43.         readline.clearScreenDown(outStream); 
  44.     } 
  45.  
  46.     console.png(image); 
  47.  
  48.     await delay(1000); 
  49.     const prettyFont = CFonts.render('|HAPPY|NEW YEAR', {font:'block', colors: ['blue''yellow']}); 
  50.  
  51.     let startX = 60; 
  52.     let startY = 0; 
  53.     prettyFont.array.forEach((line, index) => { 
  54.         readline.cursorTo(outStream, startX + index, startY + index); 
  55.         rl.write(line); 
  56.     }); 
  57.  
  58.     readline.cursorTo(outStream, 120, 25); 
  59.     rl.write(chalk.yellowBright('---神光的編程秘籍')); 
  60. })(); 

總結

TTY 類型的終端支持設置字符顏色和在任意位置清除和修改內容,這是控制臺動畫可以刷新的基礎。

我們通過把圖片的像素轉為有顏色的字符來顯示圖片,通過預置的字符數組來顯示藝術字,在不同的位置繪制這些內容就可以達到豐富的顯示效果。

其中,控制臺的光標位置修改和內容的清除使用 Node.js 的 readline 內置模塊,其余的是第三方的包。藝術字使用 cfonts 的包,圖片顯示使用 console-png,字體顏色使用 chalk。

控制臺是我們每天都用的,前端的大多數工具都是 cli 的形式。深入學習 cli 顯示各種內容和做動畫的知識,有助于更好的理解一些 cli 工具和寫出更好的 cli 工具。

最后,再次感謝大家過去一年的支持,明年一起加油呀~

原文鏈接:https://mp.weixin.qq.com/s/pPBeTqbZqoKFpuLusYE7Vg

延伸 · 閱讀

精彩推薦
  • node.jsnodejs中使用worker_threads來創建新的線程的方法

    nodejs中使用worker_threads來創建新的線程的方法

    這篇文章主要介紹了nodejs中使用worker_threads來創建新的線程的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友...

    flydean程序那些事8982022-01-06
  • node.jsNode.js 中如何收集和解析命令行參數

    Node.js 中如何收集和解析命令行參數

    這篇文章主要介紹了Node.js 中如何收集和解析命令行參數,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋...

    descire8802021-12-28
  • node.jsNode.js ObjectWrap 的弱引用問題

    Node.js ObjectWrap 的弱引用問題

    最近在寫 Node.js Addon 的過程中,遇到了一個問題,然后發現是 ObjectWrap 弱引用導致的,本文介紹一下具體的問題和排查過程,以及 ObjectWrap 的使用問題。...

    編程雜技9852022-01-04
  • node.jsrequire加載器實現原理的深入理解

    require加載器實現原理的深入理解

    這篇文章主要給大家介紹了關于require加載器實現原理的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需...

    隱冬8462022-03-03
  • node.jslinux服務器快速卸載安裝node環境(簡單上手)

    linux服務器快速卸載安裝node環境(簡單上手)

    這篇文章主要介紹了linux服務器快速卸載安裝node環境(簡單上手),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需...

    mose-x8462022-01-22
  • node.js詳解node.js創建一個web服務器(Server)的詳細步驟

    詳解node.js創建一個web服務器(Server)的詳細步驟

    這篇文章主要介紹了詳解node.js創建一個web服務器(Server)的詳細步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,...

    王佳斌8952021-12-31
  • node.jsk8s node節點重新加入master集群的實現

    k8s node節點重新加入master集群的實現

    這篇文章主要介紹了k8s node節點重新加入master集群的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋...

    Scarborought13922022-01-22
  • node.js在瀏覽器中,把 Vite 跑起來了!

    在瀏覽器中,把 Vite 跑起來了!

    大家好,我是 ssh,前幾天在推上沖浪的時候,看到 Francois Valdy 宣布他制作了 browser-vite[1],成功把 Vite 成功在瀏覽器中運行起來了。這引起了我的興趣,如...

    前端從進階到入院9282022-01-11
主站蜘蛛池模板: 国产一区二区三区视频在线观看 | 久久国产精品小视频 | 久草久视频 | 久草在线视频精品 | 最新午夜综合福利视频 | 欧美日韩在线视频一区 | 黄色毛片一级 | 久久久一区二区三区精品 | 羞羞的动漫在线观看 | 国产成人精品一区在线播放 | 国产精品久久久久久模特 | 久久色网站 | 黄色av网站在线观看 | 羞羞答答www网站进入 | 激情在线免费观看 | 成人不卡一区二区 | 日本人乱人乱亲乱色视频观看 | 日韩蜜桃视频 | 国产一区二区三区网站 | av在线视 | h色网站免费观看 | 日韩精品免费看 | 亚洲第一成人久久网站 | 国产精品免费一区二区三区都可以 | 欧美日韩色片 | 一区二区久久久久草草 | 天天草夜夜 | 成熟女人特级毛片www免费 | 国产麻豆久久 | 肉文女配h | 韩日黄色片 | 凹凸成人精品亚洲精品密奴 | 97青青草视频 | 成人毛片免费在线 | 欧美人一级淫片a免费播放 久久99精品久久久久久园产越南 | www.国产.com | 国产一级大片在线观看 | 日本教室三级在线看 | 国产美女的小嫩bbb图片 | 国产成人精品二区 | 毛片免费在线视频 |