Node.js控制台彩色输出的方法与原理实例详解


Posted in Javascript onDecember 01, 2019

前言

我们都知道,在nodejs环境下使用普通的console.log,console.error,console.info输出都是不会有颜色的,如果你不知道,那你现在知道啦?。在这种情况下,如果我们需要彩色输出,则通常通过chalk这个node模块来实现,

chalk使用方法

基本用法

const chalk = require('chalk')
console.log(chalk.red.bold.bgWhite('Leo\'s Blog'))

上面代码执行的结果如下,Leo's Blog 加粗,字体颜色是红色,背景颜色是白色。

注意:背景颜色要在 bg 后面加上具体的颜色,颜色的第一个字母大写。

在 HTML 中支持 RGB 颜色,在这里同样支持,而且是支持所有 HTML 中支持的颜色,如十六进制颜色。这里仅仅说明十六进制颜色。

下面的代码会和上面的代码实现相同的效果。

const chalk = require('chalk')
console.log(chalk.rgb(255,0,0).bold.bgRgb(255,255,255)('Leo\'s Blog'))

使用模板

该模块有一个很方便的用法就是支持模板输出,也就是说,不管在字符串中的哪个位置想改变输出的颜色,都是可以的。

const chalk = require('chalk')
console.log(chalk`{red.bold.bgWhite Leo\'s Blog}`)

当然,也可以使用 RGB 颜色值。

const chalk = require('chalk')
console.log(chalk`{rgb(255,0,0).bold.bgRgb(255,255,255) Leo\'s Blog}`)

Node.js控制台彩色输出的方法与原理实例详解
四种方式的输出

常见形式

我们经常看到的警告、错误提示就是这么来的

const chalk = require('chalk')

const error = chalk.bold.red;
const warning = chalk.keyword('orange')

console.log(error('Error!'))
console.log(warning('Warning!'))

Node.js控制台彩色输出的方法与原理实例详解
错误和警告提示

常用API

样式

  • reset - 样式重置
  • bold - 加粗
  • dim - 浅高亮
  • italic - 斜体
  • underline - 下划线
  • inverse- 反转前景和背景色
  • hidden - 隐藏内容
  • strikethrough - 删除线
  • visible- 显示chalk level > 0 的内容

前景色关键字(非全支持)

  • black
  • red
  • green
  • yellow
  • blue
  • magenta
  • cyan
  • white
  • blackBright (alias: gray, grey)
  • redBright
  • greenBright
  • yellowBright
  • blueBright
  • magentaBright
  • cyanBright
  • whiteBright

背景色关键字(非全支持)

  • bgBlack
  • bgRed
  • bgGreen
  • bgYellow
  • bgBlue
  • bgMagenta
  • bgCyan
  • bgWhite
  • bgBlackBright (alias: bgGray, bgGrey)
  • bgRedBright
  • bgGreenBright
  • bgYellowBright
  • bgBlueBright
  • bgMagentaBright
  • bgCyanBright
  • bgWhiteBright

更多API可以看看官方文档。

chalk让控制台输出样式多变的原理

其原理最重要的一个知识点就是ANSI Escape code.

ASCII编码中有些字符是不能用来在终端中打印显示的,比如'\a' 0x7代表响铃,'\n' 0x0A代表换行,这些字符被称为控制符。

而其中的一个控制符 '\e' 0x1B比较特殊,这个字符代表 ESC ,即键盘上 ESC 按键的作用。ESC 是单词 escape 的缩写,即逃逸的意思。文本中出现这个控制符,表示接下来的字符是ANSI Escape code编码。

而ANSI Escape code编码中有专门控制字符颜色的控制符,例如:\e[31;44;4;1m

其意义如下:

  • \e 代表开始ANSI Escape code
  • [ 代表转义序列开始符 CSI,Control Sequence Introducer
  • 31;44;4;1 代表以; 分隔的文本样式控制符,其中 31 代表文本前景色为红色,44代表背景为蓝色,4代表下划线,1代表加粗
  • m 代表结束控制符序列

我们可以在终端中输入如下命令:

echo -e "\e[37;44;4;1mLEO\e[0m"

会有如下输出,带下划线的LEO字样:

Node.js控制台彩色输出的方法与原理实例详解
echo-leo

因为 \e 控制符的16进制码为 0x1B , 8 进制码为 033 ,也可以用以下写法达到同样效果:

echo -e "\e[37;44;4;1mLEO\e[0m"
echo -e "\x1b[37;44;4;1mLEO\x1b[0m"
echo -e "\x1B[37;44;4;1mLEO\x1B[0m"
echo -e "\033[37;44;4;1mLEO\033[0m"

Node.js控制台彩色输出的方法与原理实例详解
echo

通过维基百科,我查到有以下参数控制符:

代码 作用 备注
0 重置/正常 关闭所有属性。
1 粗体或增加强度
2 弱化(降低强度) 未广泛支持。
3 斜体 未广泛支持。有时视为反相显示。
4 下划线
5 缓慢闪烁 低于每分钟150次。
6 快速闪烁 MS-DOS ANSI.SYS;每分钟150以上;未广泛支持。
7 反显 前景色与背景色交换。
8 隐藏 未广泛支持。
9 划除 字符清晰,但标记为删除。未广泛支持。
10 主要(默认)字体
11?19 替代字体 选择替代字体{\displaystyle n-10}{\displaystyle n-10}。
20 尖角体 几乎无支持。
21 关闭粗体或双下划线 关闭粗体未广泛支持;双下划线几乎无支持。
22 正常颜色或强度 不强不弱。
23 非斜体、非尖角体
24 关闭下划线 去掉单双下划线。
25 关闭闪烁
27 关闭反显
28 关闭隐藏
29 关闭划除
30?37 设置前景色 参见下面的颜色表。
38 设置前景色 下一个参数是5;n或2;r;g;b,见下。
39 默认前景色 由具体实现定义(按照标准)。
40?47 设置背景色 参见下面的颜色表。
48 设置背景色 下一个参数是5;n或2;r;g;b,见下。
49 默认背景色 由具体实现定义(按照标准)。
51 Framed
52 Encircled
53 上划线
54 Not framed or encircled
55 关闭上划线
60 表意文字下划线或右边线 几乎无支持。
61 表意文字双下划线或双右边线
62 表意文字上划线或左边线
63 表意文字双上划线或双左边线
64 表意文字着重标志
65 表意文字属性关闭 重置60?64的所有效果。
90?97 设置明亮的前景色 aixterm(非标准)。
100?107 设置明亮的背景色 aixterm(非标准)。

颜色编码表如下:

名称 前景色代码 背景色代码
30 40
31 41
绿 32 42
33 43
34 44
品红 35 45
36 46
37 47
亮黑(灰) 90 100
亮红 91 101
亮绿 92 102
亮黄 93 103
亮蓝 94 104
亮品红 95 105
亮青 96 106
亮白 97 107

示例:

\e[31m 红色
\e[36;5;1;4m 缓慢闪烁的青色加粗带下划线字体

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
js 解决“options为空或不是对象”
Dec 22 Javascript
jquery easyui的tabs使用时的问题
Mar 23 Javascript
Javascript计算时间差的函数分享
Jul 04 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
Apr 16 Javascript
JQuery调webservice实现邮箱验证(检测是否可用)
May 21 Javascript
通过JS动态创建一个html DOM元素并显示
Oct 15 Javascript
Javascript学习笔记之函数篇(五) : 构造函数
Nov 23 Javascript
函数window.open实现关闭所有的子窗口
Aug 03 Javascript
js实现Form栏显示全格式时间时钟效果代码
Aug 19 Javascript
EasyUI的TreeGrid的过滤功能的解决思路
Aug 08 Javascript
Vue仿今日头条实例详解
Feb 06 Javascript
JavaScript 日期时间选择器一些小结
Apr 02 Javascript
vue多个元素的样式选择器问题
Nov 29 #Javascript
解决Angularjs异步操作后台请求用$q.all排列先后顺序问题
Nov 29 #Javascript
vue 组件开发原理与实现方法详解
Nov 29 #Javascript
vue ajax 拦截原理与实现方法示例
Nov 29 #Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
Nov 29 #Javascript
js中关于Blob对象的介绍与使用
Nov 29 #Javascript
js blob类型url的视频下载问题的解决
Nov 29 #Javascript
You might like
php下载远程文件类(支持断点续传)
2008/11/14 PHP
PHP 柱状图实现代码
2009/12/04 PHP
php使用ereg验证文件上传的方法
2014/12/16 PHP
php的4种常见运行方式
2015/03/20 PHP
php实现微信发红包
2015/12/05 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
javaScript同意等待代码实现心得
2011/01/01 Javascript
面向对象的Javascript之一(初识Javascript)
2012/01/20 Javascript
javascript 实现子父窗体互相传值的简单实例
2014/02/17 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
浅析JS原型继承与类的继承
2016/04/07 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
2016/08/29 Javascript
纯原生js实现贪吃蛇游戏
2020/04/16 Javascript
vue.js 微信支付前端代码分享
2018/02/10 Javascript
深入了解JavaScript 私有化
2019/05/30 Javascript
jquery轮播图插件使用方法详解
2020/07/31 jQuery
Python 检查数组元素是否存在类似PHP isset()方法
2014/10/14 Python
python类和继承用法实例
2015/07/07 Python
Python注释详解
2016/06/01 Python
使用matplotlib画散点图的方法
2018/05/25 Python
Python字符串处理的8招秘籍(小结)
2019/08/13 Python
Python双链表原理与实现方法详解
2020/02/22 Python
Pytorch 使用CNN图像分类的实现
2020/06/16 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
html5启动原生APP总结
2020/07/03 HTML / CSS
Shopee菲律宾:在线购买和出售
2019/11/25 全球购物
道路建设实施方案
2014/03/18 职场文书
简易离婚协议书范本
2014/10/24 职场文书
2014年客房服务员工作总结
2014/11/18 职场文书
2015年基层党支部工作总结
2015/05/21 职场文书
大学学生会主席竞选稿
2015/11/19 职场文书
游戏《铁拳》动画化!2022年年内播出
2022/03/21 日漫
java实现面板之间切换功能
2022/06/10 Java/Android
JavaScript前端面试组合函数
2022/06/21 Javascript