chalk vs kleur vs ansi-colors vs colors
Node.js 终端颜色库
chalkkleuransi-colorscolors
Node.js 终端颜色库

这些库提供了在 Node.js 终端中添加颜色和样式的功能,帮助开发者通过高亮显示文本来增强终端输出的可读性和视觉吸引力。它们各自有不同的设计理念和功能,适用于不同的使用场景。使用这些库可以使得命令行工具的输出更加友好和易于理解,提升用户体验。

npm下载趋势
3 年
GitHub Stars 排名
统计详情
npm包名称
下载量
Stars
大小
Issues
发布时间
License
chalk324,659,59722,80844.3 kB32 个月前MIT
kleur39,963,8851,67620.3 kB12-MIT
ansi-colors35,129,87645026.1 kB19-MIT
colors19,658,0755,186-926 年前MIT
功能对比: chalk vs kleur vs ansi-colors vs colors

功能丰富性

  • chalk:

    chalk 提供了丰富的颜色和样式选项,包括背景色、文本样式(如加粗、下划线等),支持链式调用,功能强大且灵活。

  • kleur:

    kleur 提供了现代化的 API,支持链式调用,具有较好的性能,功能上接近 chalk,但更轻量。

  • ansi-colors:

    ansi-colors 提供了基本的颜色支持,主要专注于 ANSI 颜色编码,功能相对简单,适合快速实现。

  • colors:

    colors 提供了简单的颜色功能,支持基本的文本颜色和背景色,但功能较为有限,适合简单需求。

性能

  • chalk:

    chalk 的性能良好,但由于功能丰富,可能在某些复杂场景下稍显逊色。

  • kleur:

    kleur 以极高的性能著称,适合需要频繁更新终端输出的应用场景。

  • ansi-colors:

    由于其简单性,ansi-colors 在性能上表现良好,适合对性能有较高要求的场景。

  • colors:

    colors 性能较好,适合简单的颜色需求,不会造成显著的性能开销。

易用性

  • chalk:

    chalk 提供了链式调用的方式,使得样式的使用更加灵活和直观,易于学习和使用。

  • kleur:

    kleur 的 API 设计现代,使用简单,适合希望快速实现颜色功能的开发者。

  • ansi-colors:

    ansi-colors 的 API 简单直观,容易上手,适合初学者。

  • colors:

    colors 的使用非常简单,适合快速实现基本的颜色需求,易于上手。

社区支持

  • chalk:

    chalk 拥有广泛的社区支持,文档详细,示例丰富,易于找到解决方案。

  • kleur:

    kleur 的社区正在增长,文档相对较新,但支持逐渐增强。

  • ansi-colors:

    ansi-colors 的社区相对较小,文档和示例较少。

  • colors:

    colors 的社区支持一般,文档较为简单,适合基本使用。

扩展性

  • chalk:

    chalk 支持多种样式和颜色组合,具有良好的扩展性,适合复杂需求。

  • kleur:

    kleur 设计现代,支持链式调用,具有良好的扩展性,适合需要灵活性的场景。

  • ansi-colors:

    ansi-colors 的扩展性较低,主要用于基本的颜色功能。

  • colors:

    colors 的扩展性有限,主要用于简单的颜色需求。

如何选择: chalk vs kleur vs ansi-colors vs colors
  • chalk:

    选择 chalk 如果你需要一个功能丰富且易于使用的库,支持链式调用和多种样式,适合复杂的终端输出需求。

  • kleur:

    选择 kleur 如果你需要一个性能优越且现代的库,支持链式调用且具有简单的 API,适合需要高性能的应用场景。

  • ansi-colors:

    选择 ansi-colors 如果你需要一个轻量级且简单的库,专注于 ANSI 颜色编码,适合快速实现基本的颜色功能。

  • colors:

    选择 colors 如果你希望使用一个简单的库来为字符串添加颜色,且不需要太多额外功能,适合基本的颜色需求。

chalk的README



Chalk


Terminal string styling done right

Coverage Status npm dependents Downloads

Info

Highlights

Install

npm install chalk

IMPORTANT: Chalk 5 is ESM. If you want to use Chalk with TypeScript or a build tool, you will probably want to use Chalk 4 for now. Read more.

Usage

import chalk from 'chalk';

console.log(chalk.blue('Hello world!'));

Chalk comes with an easy to use composable API where you just chain and nest the styles you want.

import chalk from 'chalk';

const log = console.log;

// Combine styled and normal strings
log(chalk.blue('Hello') + ' World' + chalk.red('!'));

// Compose multiple styles using the chainable API
log(chalk.blue.bgRed.bold('Hello world!'));

// Pass in multiple arguments
log(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz'));

// Nest styles
log(chalk.red('Hello', chalk.underline.bgBlue('world') + '!'));

// Nest styles of the same type even (color, underline, background)
log(chalk.green(
	'I am a green line ' +
	chalk.blue.underline.bold('with a blue substring') +
	' that becomes green again!'
));

// ES2015 template literal
log(`
CPU: ${chalk.red('90%')}
RAM: ${chalk.green('40%')}
DISK: ${chalk.yellow('70%')}
`);

// Use RGB colors in terminal emulators that support it.
log(chalk.rgb(123, 45, 67).underline('Underlined reddish color'));
log(chalk.hex('#DEADED').bold('Bold gray!'));

Easily define your own themes:

import chalk from 'chalk';

const error = chalk.bold.red;
const warning = chalk.hex('#FFA500'); // Orange color

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

Take advantage of console.log string substitution:

import chalk from 'chalk';

const name = 'Sindre';
console.log(chalk.green('Hello %s'), name);
//=> 'Hello Sindre'

API

chalk.<style>[.<style>...](string, [string...])

Example: chalk.red.bold.underline('Hello', 'world');

Chain styles and call the last one as a method with a string argument. Order doesn't matter, and later styles take precedent in case of a conflict. This simply means that chalk.red.yellow.green is equivalent to chalk.green.

Multiple arguments will be separated by space.

chalk.level

Specifies the level of color support.

Color support is automatically detected, but you can override it by setting the level property. You should however only do this in your own code as it applies globally to all Chalk consumers.

If you need to change this in a reusable module, create a new instance:

import {Chalk} from 'chalk';

const customChalk = new Chalk({level: 0});
LevelDescription
0All colors disabled
1Basic color support (16 colors)
2256 color support
3Truecolor support (16 million colors)

supportsColor

Detect whether the terminal supports color. Used internally and handled for you, but exposed for convenience.

Can be overridden by the user with the flags --color and --no-color. For situations where using --color is not possible, use the environment variable FORCE_COLOR=1 (level 1), FORCE_COLOR=2 (level 2), or FORCE_COLOR=3 (level 3) to forcefully enable color, or FORCE_COLOR=0 to forcefully disable. The use of FORCE_COLOR overrides all other color support checks.

Explicit 256/Truecolor mode can be enabled using the --color=256 and --color=16m flags, respectively.

chalkStderr and supportsColorStderr

chalkStderr contains a separate instance configured with color support detected for stderr stream instead of stdout. Override rules from supportsColor apply to this too. supportsColorStderr is exposed for convenience.

modifierNames, foregroundColorNames, backgroundColorNames, and colorNames

All supported style strings are exposed as an array of strings for convenience. colorNames is the combination of foregroundColorNames and backgroundColorNames.

This can be useful if you wrap Chalk and need to validate input:

import {modifierNames, foregroundColorNames} from 'chalk';

console.log(modifierNames.includes('bold'));
//=> true

console.log(foregroundColorNames.includes('pink'));
//=> false

Styles

Modifiers

  • reset - Reset the current style.
  • bold - Make the text bold.
  • dim - Make the text have lower opacity.
  • italic - Make the text italic. (Not widely supported)
  • underline - Put a horizontal line below the text. (Not widely supported)
  • overline - Put a horizontal line above the text. (Not widely supported)
  • inverse- Invert background and foreground colors.
  • hidden - Print the text but make it invisible.
  • strikethrough - Puts a horizontal line through the center of the text. (Not widely supported)
  • visible- Print the text only when Chalk has a color level above zero. Can be useful for things that are purely cosmetic.

Colors

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

Background colors

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

256 and Truecolor color support

Chalk supports 256 colors and Truecolor (16 million colors) on supported terminal apps.

Colors are downsampled from 16 million RGB values to an ANSI color format that is supported by the terminal emulator (or by specifying {level: n} as a Chalk option). For example, Chalk configured to run at level 1 (basic color support) will downsample an RGB value of #FF0000 (red) to 31 (ANSI escape for red).

Examples:

  • chalk.hex('#DEADED').underline('Hello, world!')
  • chalk.rgb(15, 100, 204).inverse('Hello!')

Background versions of these models are prefixed with bg and the first level of the module capitalized (e.g. hex for foreground colors and bgHex for background colors).

  • chalk.bgHex('#DEADED').underline('Hello, world!')
  • chalk.bgRgb(15, 100, 204).inverse('Hello!')

The following color models can be used:

  • rgb - Example: chalk.rgb(255, 136, 0).bold('Orange!')
  • hex - Example: chalk.hex('#FF8800').bold('Orange!')
  • ansi256 - Example: chalk.bgAnsi256(194)('Honeydew, more or less')

Browser support

Since Chrome 69, ANSI escape codes are natively supported in the developer console.

Windows

If you're on Windows, do yourself a favor and use Windows Terminal instead of cmd.exe.

FAQ

Why not switch to a smaller coloring package?

Chalk may be larger, but there is a reason for that. It offers a more user-friendly API, well-documented types, supports millions of colors, and covers edge cases that smaller alternatives miss. Chalk is mature, reliable, and built to last.

But beyond the technical aspects, there's something more critical: trust and long-term maintenance. I have been active in open source for over a decade, and I'm committed to keeping Chalk maintained. Smaller packages might seem appealing now, but there's no guarantee they will be around for the long term, or that they won't become malicious over time.

Chalk is also likely already in your dependency tree (since 100K+ packages depend on it), so switching won’t save space—in fact, it might increase it. npm deduplicates dependencies, so multiple Chalk instances turn into one, but adding another package alongside it will increase your overall size.

If the goal is to clean up the ecosystem, switching away from Chalk won’t even make a dent. The real problem lies with packages that have very deep dependency trees (for example, those including a lot of polyfills). Chalk has no dependencies. It's better to focus on impactful changes rather than minor optimizations.

If absolute package size is important to you, I also maintain yoctocolors, one of the smallest color packages out there.

- Sindre

But the smaller coloring package has benchmarks showing it is faster

Micro-benchmarks are flawed because they measure performance in unrealistic, isolated scenarios, often giving a distorted view of real-world performance. Don't believe marketing fluff. All the coloring packages are more than fast enough.

Related

(Not accepting additional entries)

Maintainers