Dream4ever / Knowledge-Base

record every requirement and solution here
https://www.hewei.in/
36 stars 6 forks source link

修改 Node.js 控制台输出结果 #172

Closed Dream4ever closed 3 years ago

Dream4ever commented 3 years ago

需求描述

在做 05_IIS 日志统计分析 的时候,为了改善用户体验,需要像 Vue-Cli 那样,在屏幕上实时显示当前这本书的图书配套资源,处理到第几个 IIS 日志文件了。

重点是每本书的处理进度只在一行上显示,这就需要在处理到下一个日志文件的时候,清空上一个日志文件的处理结果,并输出最新结果。

实现过程

最开始尝试用 ansi-escapes 这个库,结果发现不好用。

后来 Google js remove terminal output line,在 Is there a way to erase the last line of output? 中,给出了原生方法:

process.stdout.moveCursor(0, -1) // up one line
process.stdout.clearLine(1) // from cursor to end

这个方法用到了 Node.js 原生的 TTY 模块,该模块包含 WriteStream 这个类,而当 process.stdout.fd 指向文件时,process.stdout 的返回值也是一个 WriteStream 类,从而可以调用 TTY 模块的 moveCursor 方法和 clearLine 方法,来修改控制台的输出结果。