目标
CLI 把颜色码写进了日志与 CI 输出,满是转义序列。本配方先检测 stdout 是否为 TTY 并遵守 NO_COLOR 约定,仅在交互式终端且未禁用时着色,再用管道验证输出无转义码;提醒着色不能替代语义标签,且可为需要颜色的 CI 提供 FORCE_COLOR 覆盖。
步骤要点
- 检测 TTY 并遵守 NO_COLOR 约定。
- 仅在交互式终端时应用颜色。
- 用管道验证输出不含转义序列。
- 为支持的 CI 提供 FORCE_COLOR 覆盖。
const useColor = process.stdout.isTTY && !process.env.NO_COLOR;
const red = (s) => (useColor ? '\x1b[31m' + s + '\x1b[0m' : s);
排错提示
- 只看全局标志会误判,需检查实际输出流。
- CI 支持颜色时可能被误禁,需可覆盖。
- 颜色不利于无障碍,需保留语义标签。
适用边界
- 终端对 ANSI 支持不一。
- 不能替代结构化输出。