控制台与终端输出带样式文本原理及实现
在浏览器控制台输出带样式的文本
作为一个前端,在浏览器控制台输出带样式的文本已经是手到擒来了,一个%c的占位符就可以自定义后续文本的样式。比如:
1 | const style = ` |
那如何在命令行终端输出带样式的文本呢
试着在windows的cmd窗口中输入如下命令:
1 | echo ^[[31m |
这里的**^[ 是通过ctrl+[ **组合键按出来的。这时候你会发现命令行后续的内容全都变成红色了。再次输入命令:
1 | echo ^[[0m |
这时候又会恢复成原色。
原因是转义字符会被终端拦截,用来处理颜色和样式。ASCII的颜色转义码的标准写法是 转义符 + [ + 数字 + m。这里的数字可以是英文分号分隔的整数,如4;42就表示绿色背景+下划线的转义。0代表重置,会把前面所有的样式清空。
如何在node环境中通过console.log输出带样式的文本
上面终端的转义字符只要使用escape的转义字符就行。可以试试创建一个js文件test.js,代码如下
1 | console.log('测试\x1b[3;9;32m%s\x1b[31m文本\x1b[0m样式', '终端') |
输出结果:
①代码中%s是占位符,代表后面的字符串
③ \x1b是转义字符,\x表示十六进制,1b在ASCII码表中代表ESC键。如果你愿意,可以把\x1b替换为八进制\033,甚至是unicode字符\u001b。
④ 颜色转义码里的数字可以是英文分号分隔的整数,如\x1b[3;9;32m就表示斜体+中划线+绿色前景色的转义。\x1b[0m是重置转义符,会把前面所有的样式清空。
第三方库
谁都不想输出个样式这么繁琐,自然就有人帮忙封装起来了。目前终端样式美化的库中star数最多的应该就是chalk了,看下chalk中转义数字的映射文件:
1 | const styles = { |
每个颜色都是一个只有俩元素的数组,第一个元素是当前样式的转义数字,第二个元素是清除该样式的转义数字
参考资料:ANSI Escape Codes