ダメな方法
まずはダメな方法です。こういうスクリプトを実行すると、表示が追いつかずガタガタになります。
test.js
const main = function (f) {
f()
}
const printAbcde = function () {
process.stdout.write("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n");
process.stdout.write("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n");
process.stdout.write("cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n");
process.stdout.write("dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd\n");
process.stdout.write("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\n");
}
const mainLoop = function () {
for (;;) {
console.clear();
printAbcde();
}
}
main(mainLoop);
毎回、console.clear関数で画面を上に流していることが原因です。
良い方法
console.clear関数を呼び出すのは最初の1回だけでいいです。あとは毎回、上書き前のタイミングでcursorTo関数を呼び出しカーソル位置を左上(x:0, y:0)へ戻します。
mainLoop関数を以下のように書き換えます。
test.js
const mainLoop = function () {
console.clear();
for (;;) {
require('readline').cursorTo(process.stdout, 0, 0);
printAbcde();
}
}
一部を上書きする
mainLoop関数を以下のように書き換えます。
test.js
const mainLoop = function () {
console.clear();
printAbcde();
printAbcde();
printAbcde();
require('readline').cursorTo(process.stdout, 10, 4);
process.stdout.write(" !!!!! UPDATE TEXT !!!!! ");
require('readline').cursorTo(process.stdout, 40, 11);
process.stdout.write(" !!!!! UPDATE TEXT !!!!! ");
for (;;);
}
4行10列と11行40列のテキストが上書きされます。