简介
使用粉笔我编写了一个用于打印彩色文本的小型控制台程序,我使用NodeJS执行该程序:
console.log(require('chalk').yellow('yellow text'));
程序以黄色打印字符串"yellow text">。如果我直接用节点执行脚本,它会输出:
$ node test.js
yellow text
(文本实际上是黄色的(。
这与我执行程序的控制台无关。我尝试了Windowscmd.exe和Gitbash(mintty(。
问题
如果我将我的程序作为npm包.json脚本的一部分,例如使用
...
"scripts": {
"example": "node test.js"
}
...
并在mintty中执行
$ npm run example
> exampleproject@0.0.1 example D:exampleproject
> node test.js
yellow text
文本实际上是而不是黄色,而是控制台的默认颜色。但在Windowscmd.exe中,这是有效的,即文本是黄色的!
所以我认为mintty和npm之间的交互一定有问题。即使使用mintty中的npm run example
,我也能为文本着色吗?
使用过的版本
- Windows 7 SP1 64位
- Git 2.5.3-32-比特与mintty 2.0.3
- 节点4.1.0 32位
- npm 2.14.3
- 粉笔1.1.1
更多测试后更新
我尝试了不同版本的相关组件,我想我已经确定了mintty。如果我在安装时用"使用windows命令提示符">而不是的"使用mintty">配置它,彩色npm输出在Git上运行。
在那之后,我尝试了不同版本的mintty,看看它是否可能是一个错误:
- 在MSys 1.0.11中使用mintty 1.1.3时,颜色根本不起作用,即即使是简单的
node test.js
也没有彩色输出 - MSys2(版本20150916(中的最新薄荷糖2.1.5的颜色也不起作用
但是如果我在使用node test.js
直接执行脚本时使用mintty 2.0.3的Git bash(没有npm(,彩色输出就可以工作了。
所以现在我完全困惑了。。。
当前的解决方案似乎是(在windows上(设置一个环境变量:
FORCE_COLOR=true
src:windows 上gitbash中的颜色支持检测问题
它与Node.js:上的已知问题有关
Node.js在windows/cygwin nodejs/Node#3006上不作为tty运行
Git Bash错误-无法读取属性"substring"#272。
不确定,它是否会被修复。
简而言之,MSYS/Cygwin/etc。(使用Mintty作为终端模拟器(在"fake"控制台内运行bash,这与节点不兼容。它可能对任何其他终端模拟器都是一样的。
要检查Node.js是否在TTY上下文中运行,请尝试以下操作:
cd c:/nodejs
./node -p -e "Boolean(process.stdout.isTTY)"
请注意,在这种情况下,简单地运行node -p -e "Boolean(process.stdout.isTTY)"
不会起到任何作用。
创建内容为export FORCE_COLOR=true
的文件~/.bashrc
使我在Windows 10上的Git Bash中可以使用颜色,正如diego nunes和leroyse用更通用的术语指出的那样。
一个解决方法是转义彩色字符串,用uu%1B
替换所有%1B
,然后将其取消转义。
我在这里使用粉笔,当在bash中运行时,它会自动禁用。。。但你可以绕过它,"强迫"它启用
const chalk = require('chalk')
chalk.enabled = true
chalk.level = 3
function fixColors (str) {
return unescape(
escape(
str
)
.replace(/%1B/i, '\u%1B')
)
}
console.log(fixColors(chalk.blueBright('is it blue?!')))
我希望这能帮助到某人:(它很难看,但很容易实现。
我成功地将其添加到显示粉笔输出的节点js文件中:
process.env.FORCE_COLOR = true