Node.js 控制台输出如何不换行
Node.js 不换行输出用 process.stdout.write(),它不像 console.log 那样自动追加换行符。需要换行时在字符串里手动加 \n。适合实现进度条、同行动态刷新等场景。
用 process.stdout.write() 代替 console.log()。 console.log 会在末尾自动加换行符 \n;process.stdout.write 原样输出,不加任何东西,想换行自己在字符串里写 \n。
对比示例
console.log('第一行'); // 输出后自动换行
process.stdout.write('不换行'); // 光标停在行尾
process.stdout.write('接着写\n'); // 同一行继续,手动换行
典型用途:进度条
for (let i = 0; i <= 100; i += 10) {
process.stdout.write(`\r进度:${i}%`); // \r 回到行首,实现同行刷新
await new Promise(r => setTimeout(r, 200));
}
process.stdout.write('\n');
\r(回车)把光标移回行首,配合不换行输出就能做出原地刷新的进度显示。process.stdout.clearLine() 和 cursorTo(0) 可以做得更精细。
补充
- 标准错误对应
process.stderr.write(),行为相同; - 输出到管道时 stdout 可能是异步缓冲的,退出前需确保写完(正常退出 Node 会自行 flush)。
常见问题(FAQ)
Q:write() 返回 false 是什么意思?
表示内部缓冲已满(背压),应监听 'drain' 事件后再继续写。大量输出时需要注意,日常打印几行可忽略。
Q:console.log 能不加换行吗?
不能,它的行为固定加 \n。不换行输出就是 process.stdout.write 的场景。
Q:Windows 下 \r 进度条会闪?
Windows 终端对 ANSI/回车处理略有差异,新版 Windows Terminal 已基本正常;跨平台 CLI 工具可直接用 ora、cli-progress 这类成熟库。