Node.jsでCLIアプリケーションを作る際に、インタラクティブなプロンプトを出して、ユーザのテキスト入力を受け取る実装を紹介する。
この実装は3行で済み、外部ライブラリを必要としない。
デモ
こんな感じで、ターミナルにタイプした文字をNode.jsで受け取るものを実装する。
実装
上でのデモの完全な実装は次のコードになる:
functionreadText(){process.stdin.resume()returnnewPromise(r=>process.stdin.once('data',r)).finally(()=>process.stdin.pause())}(asyncfunctionmain(){process.stdout.write('> ')process.stdout.write('< '+awaitreadText())process.stdout.write('> ')process.stdout.write('< '+awaitreadText())})()
このうち、ユーザ入力を受け取るコアの部分は次の3行:
process.stdin.resume()newPromise(r=>process.stdin.once('data',r)).finally(()=>process.stdin.pause())
- 1行目の
resume
で標準入力の受付を再開する。- どこかの処理ですでに
pause
していた場合に再開しないと2行目が動かないため。
- どこかの処理ですでに
- 2行目で標準入力を1回だけ受け取る。
- 3行目の
pause
で標準入力の受け付けを停止する。- ずっと受け付けっぱなしなると、CLIのプロセスが終了しないため。