chalk 实测:2.3 万星的终端配色库,还在手动拼 ANSI 码你就亏了
chalk 是 Node.js 生态里最流行的终端字符串样式库,GitHub 上 2.3 万星。用了三年后,我来说说它为什么值得每个 CLI 开发者拥有。
广告
chalk 实测:2.3 万星的终端配色库,还在手动拼 ANSI 码你就亏了
我做 CLI 工具五六年了,早年写终端输出全靠手写 \x1b[31m 这种 ANSI 转义码。颜色是有了,代码却丑得像一坨乱麻,维护起来更是噩梦。直到我遇到 chalk,才知道原来终端配色可以这么优雅。
项目背景
chalk 由 Sindre Sorhus 维护,是 Node.js 生态里事实标准的终端样式库。GitHub 上 2.3 万星,每周 npm 下载量超过 1 亿次,基本上你用的任何现代 CLI 工具底层都有它的影子。
它用 JavaScript 写成,零依赖,体积只有几 KB。License 是 MIT,最近一次更新是 2026 年 1 月,维护状态非常健康。
它到底强在哪
1. 链式调用,代码像说话
chalk 的 API 设计太舒服了。想要红色加粗文字?
import chalk from 'chalk';
console.log(chalk.red.bold('Error: 连接超时'));
console.log(chalk.green('✓ 构建成功'));
console.log(chalk.yellow.bgBlack('⚠ 警告: 配置文件未找到'));
你可以把 bold、underline、italic 和各种颜色任意组合,链式调用读起来像自然语言。对比手写 ANSI 码:
console.log('\x1b[1m\x1b[31mError: 连接超时\x1b[0m');
后者不仅难写,忘了加 \x1b[0m 重置还会导致后续输出全部变色——这种坑我踩过无数次。
2. 支持 256 色和 True Color
除了基本的 16 色,chalk 还支持 chalk.hex('#FF8800') 和 chalk.rgb(255, 136, 0) 这种精确颜色控制。现代终端(iTerm2、Windows Terminal、VS Code 内置终端)都能完美显示。
我常用它给不同级别的日志上不同的颜色:DEBUG 用灰色,INFO 用蓝色,WARN 用黄色,ERROR 用红色。一眼就能区分信息级别。
3. 自动检测颜色支持
chalk 会自动检测当前终端是否支持颜色。管道输出到文件时自动关闭颜色,CI 环境里也能智能适配。你不需要手动判断 process.stdout.isTTY:
import { supportsColor } from 'chalk';
if (supportsColor.stdout) {
console.log('当前终端支持颜色输出');
}
这个特性写测试脚本时特别省心,不用担心日志文件里塞满 ANSI 转义字符。
4. 模板字符串标签
chalk 支持模板标签语法,插值起来很顺手:
const name = 'world';
console.log(chalk`Hello, {red ${name}}!`);
复杂一点的场景:
const status = 'failed';
console.log(chalk`Build {${status === 'success' ? 'green' : 'red'} ${status}}`);
5. 类型安全
chalk 自带 TypeScript 类型定义,配合现代编辑器有完整的自动补全。链式调用时每步都能看到可选的方法和属性,不用翻文档。
怎么快速用起来
npm install chalk
ES Module 用法(推荐):
import chalk from 'chalk';
console.log(chalk.blue('Hello world'));
CommonJS 用法:
const chalk = require('chalk');
console.log(chalk.blue('Hello world'));
如果你在用 chalk 5.x,它已经是纯 ESM 了,CommonJS 项目建议锁定在 4.x 版本:
npm install chalk@4
但它也不是完美的
纯 ESM 的迁移阵痛。chalk 5 改成纯 ESM 后,不少 CommonJS 项目升级时踩了坑。如果你的项目还没切 ESM,要么用动态 import,要么锁在 4.x。这个 breaking change 在社区里争议不小。
浏览器里用不了。chalk 依赖 Node.js 的 process.stdout,在浏览器或 Deno 环境需要额外适配。虽然绝大多数人用不上这个场景,但做全栈工具链时得注意。
颜色命名有点美式。magenta 到底是什么颜色?cyan 和 blue 的区别在哪?对颜色不敏感的人一开始得对照色卡。好在支持 hex,直接用 #FF0000 更直观。
性能不是顶尖。极端高频输出场景下(比如实时绘制进度条),手写 ANSI 码比 chalk 快几个百分点。但 99% 的 CLI 工具根本到不了这个瓶颈,为可读性牺牲这点性能完全值得。
跟同类工具比
colors.js:曾经的竞品,2022 年作者故意引入恶意代码导致整个社区震动。现在基本没人敢用了,chalk 成为唯一选择。
ansi-colors:API 类似,但生态和社区规模远不如 chalk。npm 周下载量只有 chalk 的零头,第三方集成也少。
picocolors:体积更小(约 2KB),性能稍好,但功能比 chalk 精简很多。如果你只需要基础颜色且极度在意体积,可以考虑它。
kleur:另一个轻量替代,功能接近 picocolors。生态同样小,大型项目里很少见。
如果你在做 npm 包或 CLI 工具,chalk 依然是默认选择——用户看到依赖里有 chalk,会觉得这个项目”靠谱”。
谁适合用
写 Node.js CLI 工具的、做构建脚本的、写自动化测试输出的、做任何需要在终端里展示信息的开发者——基本上所有 Node.js 开发者都该试试。
我现在的每个项目,从简单的脚本到完整的 CLI 框架,第一件事就是 npm install chalk。它已经成了我工具链里不可缺的一环。
总结
chalk 的 2.3 万星不是虚的。它用极其简洁的 API 解决了一个看似简单、实则繁琐的问题,而且做得足够可靠、足够优雅。
如果你还在手动拼 ANSI 转义码,或者还在用已经废弃的 colors.js,现在就是换的时候了。几行代码的投入,换来的是可读性和维护性的质变。
GitHub: https://github.com/chalk/chalk
关于作者
柳钉鱼,全栈开发者,GitHub 重度用户。过去 3 年 Star 了 900+ 仓库,这里只写我真正用过或深度调研过的工具。
📧 发现好工具想推荐?发邮件到 [email protected]
广告