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'); // 同一行继续,手动换行
典型用途:进度条
async function progress() {
for (let i = 0; i <= 100; i += 10) {
if (process.stdout.isTTY) {
process.stdout.clearLine(0);
process.stdout.cursorTo(0);
process.stdout.write(`进度:${i}%`);
} else {
process.stdout.write(`进度:${i}%\n`);
}
await new Promise(r => setTimeout(r, 200));
}
if (process.stdout.isTTY) process.stdout.write('\n');
}
progress().catch(console.error);
\r(回车)把光标移回行首,配合不换行输出就能做出原地刷新的进度显示。process.stdout.clearLine() 和 cursorTo(0) 可以做得更精细。
补充
write 接受字符串或支持的二进制缓冲,不会像 console.log 一样格式化任意对象;对象需先序列化。stdout 同步/异步行为取决于平台和输出目标。
- 标准错误对应
process.stderr.write(),行为相同; - 输出到管道时 stdout 可能是异步缓冲的,退出前需确保写完(避免 process.exit() 强行退出截断待写内容,优先设置 process.exitCode 并让事件循环自然结束)。
常见问题(FAQ)
Q:write() 返回 false 是什么意思?
表示内部缓冲已满(背压),应监听 'drain' 事件后再继续写。大量输出时需要注意,日常打印几行可忽略。
Q:console.log 能不加换行吗?
不能,它的行为固定加 \n。不换行输出就是 process.stdout.write 的场景。
Q:Windows 下 \r 进度条会闪?
Windows 终端对 ANSI/回车处理略有差异,新版 Windows Terminal 已基本正常;跨平台 CLI 工具可直接用 ora、cli-progress 这类成熟库。