11
9

More than 5 years have passed since last update.

Node.jsでコンソールの表示を上書きする

Last updated at Posted at 2019-08-04

ダメな方法

まずはダメな方法です。こういうスクリプトを実行すると、表示が追いつかずガタガタになります。

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列のテキストが上書きされます。

参考ページ

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9