Node.jsを学ぶ-The definitive Node.js handbook-2

Tatsuya Asami
13 min readNov 25, 2018

--

【所要時間】

1時間45分(2018年11月25日)

【概要】

【要約・学んだこと】

How to use the Node.js REPL

REPLはRead-Evaluate-Print-Loopを表す。

REPLモードを使うには

node

とターミナルで打てばよい。

これはidleモードで何かJSコードが打ち込まれるのを待っている状態。

console.log(‘test’)と打ち込むと

testはconsoleで出力するように指示した値、undefinedはconsole.log()を実行する戻り値である。

Use the tab to autocomplete

REPLはインタラクティブ(対話式)である。コードを書く時にtabを押すと、REPLはすでに定義した変数などをオートコンプリートしようとしてくれる。

Exploring JavaScript objects

NumberといったJSクラス名の後ろに. を入力し、tabを押すと、REPLは全てのプロパティと、そのクラスにアクセスできるメソッドを表示してくれる。

Explore global objects

globalとタイプしtabを押すと、アクセス権を持つglobalを調べることができる。

The _ special variable

_(アンダーバー)を入力すると、最後の操作の結果を出力する。

Dot commands

REPLは.(ドット)から始まるスペシャルコマンドがある。
.helpでコマンド一覧が表示される。

REPLは.editorを呼び出さなくても、複数行にわたる式を認識できる。

[1, 2, 3].forEach(num => { をタイプした後エンターで改行すると、… が表示され、続きのblockが書ける。

行の最後で.breakと入力すれば、マルチラインモードは止まり、式は実行されない。

Node.js, accept arguments from the command line

Node.jsはコマンドラインからいくつでも引数を受けることができる。

node app.js flavio
node app.js name=flavio

引数はstandaloneまたはkeyとvalueだ。

これはどうやってNode.jsコード内の値を検索するかを変える。
検索にはNode.jsに組み込まれているprocessオブジェクトを使う。
これは全てのコマンドラインの呼び出し引数を含む配列であるargvプロパティを公開する。

第一引数はnodeコマンドのフルパス、第二要素は実行されるファイルのフルパス、それ以外全ての引数は3つ目以降に位置する。

ループを使って全ての引数(nodeパス、ファイルパスを含む)を反復処理できる。

process.argv.forEach((val, index) => {
console.log(`${index}: ${val}`)
})

最初2つのパラメーターを除いた新しい配列を作ることで、追加の引数のみを取得できる。

const args = process.argv.slice(2)

下記のようにインデックス名なしで最初の引数のみを持っている場合、

node app.js flavio

これを使いアクセスできる。

const args = process.argv.slice(2)
args[0]

下記の場合

node app.js name=flavio

args[0]name=flavio で、これを解析する必要がある。最適な方法はminimist libraryを使うことだ。引数の取り扱いで役立つ。

const args = require('minimist')(process.argv.slice(2))
args['name'] //flavio

Output to the command line using Node.js

Node.jsを使ったコマンドラインコンソールへの出力方法。

Basic output using the console module

まずはブラウザ上のコマンドと同じconsole moduleがある。
複数の変数を出力することも可能。

const x = 'x'
const y = 'y'
console.log(x, y)

また、変数とフォーマット指定を渡すことで、フレーズをフォーマットすることもできる。

console.log('My %s has %d years', 'cat', 2)
  • %s string変数にフォーマット。
  • %d or %i integer変数にフォーマット。
  • %f 浮動小数点としてのフォーマット。
  • %O オブジェクト表現を出力するために使われる。

例:

console.log('%O', Number)

Clear the console

console.clear() でクリア。

Counting elements

console.count()

const x = 1
const y = 2
const z = 3
console.count(
'The value of x is ' + x + ' and has been checked .. how many times?'
)
console.count(
'The value of x is ' + x + ' and has been checked .. how many times?'
)
console.count(
'The value of y is ' + y + ' and has been checked .. how many times?'
)

countはstringが出力された回数を数え、隣に回数を出力する。

applesとorangesを数える。

const oranges = ['orange', 'orange']
const apples = ['just one apple']
oranges.forEach(fruit => {
console.count(fruit)
})
apples.forEach(fruit => {
console.count(fruit)
})

Print the stack trace

関数のコールスタックトレースを出力すると便利な場合がある。console.trace()を使う。

const function2 = () => console.trace()
const function1 = () => function2()
function1()

これはスタックトレースを出力する。Node REPLで行うと下記のようになる。

Trace
at function2 (repl:1:33)
at function1 (repl:1:25)
at repl:1:1
at ContextifyScript.Script.runInThisContext (vm.js:44:33)
at REPLServer.defaultEval (repl.js:239:29)
at bound (domain.js:301:14)
at REPLServer.runBound [as eval] (domain.js:314:12)
at REPLServer.onLine (repl.js:440:10)
at emitOne (events.js:120:20)
at REPLServer.emit (events.js:210:7)

Calculate the time spent

関数の実行にどれくらいの時間がかかるか計算できる。time(), timeEnd()

const doSomething = () => console.log('test')
const measureDoingSomething = () => {
console.time('doSomething()')
//do something, and measure the time it takes
doSomething()
console.timeEnd('doSomething()')
}
measureDoingSomething()

stdout and stderr

console.logなどは標準出力(standard output)、またはstdoutと呼ばれる。

console.errorはstderrと出力される。これらはコンソールには表示されないが、エラーログに表示される。

Color the output

escape sequencesを使ってコンソール上のテキストに色をつけることができる。

console.log('\x1b[33m%s\x1b[0m', 'hi!')
hi!が黄色になっている。

通常はChalkといったライブラリを使う。カラーだけではなく太字、アンダーバーなども表現できる。

Create a progress bar

Progressはプログレスバーをコンソール上で作るパッケージである。node

最後の=がプログレスバー

Accept input from the command line in Node.js

Node.js CLIプログラムをインタラクティブにするには、Node.js ver. 7で提供されたread line module でできる。

process.studinストリームといった読み込み可能なストリームから入力を取得する。Nodeプログラムの実行中にはターミナルで入力し、一度に一行となる。

const readline = require('readline').createInterface({
input: process.stdin,
output: process.stdout
})
readline.question(`What's your name?`, (name) => {
console.log(`Hi ${name}!`)
readline.close()
})

このコードがuser nameを尋ね、テキストが入力されユーザーがエンターを押すとすぐに挨拶を送る。

question()メソッドは第一引数(question)を示し、ユーザー入力を待つ。エンターが押されるとコールバック関数を呼ぶ。

このコールバック関数では、readline インターフェイスを閉じる。

readlineは他にもいくつかのメソッドを提供するので、read line moduleの公式ドキュメントを参照すると良い。

パスワードが必要な場合は、* シンボルを使えばよい。最も簡単な方法はreadline-sync package を使うことだ。これはAPIがよく似ており、そのまま使える。

Inquirer.js packageを使うという手もある。

その場合上記のコードはこのように書く。

const inquirer = require('inquirer')var questions = [{
type: 'input',
name: 'name',
message: "What's your name?",
}]
inquirer.prompt(questions).then(answers => {
console.log(`Hi ${answers['name']}!`)
})

Inquire.jsはラジオボタン、確認などたくさんの選択肢を与えてくれる。

Expose functionality from a Node.js file using exports

Node.jsはビルトインモジュールシステムを持つ。他のNode.jsファイルによって公開されている機能をインポートできる。

インポートするには下記のように記述する。

const library = require('./library')

現在のファイルフォルダーにあるlibrary.jsファイルの機能をインポートできる。

このファイルでは、機能が他のファイルによってインポートされる前に、公開されなければいけない。このファイルにデフォルトで定義された他のオブジェクトや変数はプライベートで、外には公開されない。

これがmoduleシステムによって提供されたmodule.exportsAPIだ。

新しいexportsプロパティとしてオブジェクトや関数を割り当てる時、公開される。同様に、アプリの他の部分でインポートされたり、他のアプリでインポートされる可能性もある。

これには2通りのやり方がある。

1つ目はモジュールシステムによって外部から提供されるmodule.exportsにオブジェクトを割り当て、ファイルをただのオブジェクトとしてexportする。

const car = {
brand: 'Ford',
model: 'Fiesta'
}
module.exports = car//..in the other fileconst car = require('./car')

2つ目はexportsのプロパティとして、exportされたオブジェクトをついかする方法。これはfunction, data といった複数のオブジェクトをexportできる。

const car = {
brand: 'Ford',
model: 'Fiesta'
}
exports.car = car

または直接

exports.car = {
brand: 'Ford',
model: 'Fiesta'
}

他のファイルでは、importプロパティのリファクタリングを使う。

const items = require('./items')
items.car

または

const car = require('./items').car

module.exportsはそれが指すオブジェクトを公開し、exportsは、それが指すオブジェクトのプロパティを公開する。

【わからなかったこと】

  • 特になし(全体的にはっきりとはわかっていない。)

【感想】

  • 最初だから辛い。トータル5時間くらいPCに向かってたのに1時間45分しかこれに取り組んでいなくて震えた。サクッと終わらせようと思ったけどまだ4分の1くらいだ。

--

--

Tatsuya Asami
Tatsuya Asami

Written by Tatsuya Asami

Front end engineer. React, TypeScript, Three.js

No responses yet