この記事では年末のNode.jsセミナーに向けて作成している記事の一部を紹介します。
はじめに
Node.js 実践講座は下記の3編より構成されます。
- 基礎編: Node.jsの基本的な使用方法について解説
- 事例編: 具体的な事例に対するNode.jsの活用方法について解説
- 応用編: Expressを使用したWebアプリケーション開発
基礎編では下記の内容を解説します。
- Hello, world!
- 標準ライブラリの使用方法
- モジュールの使用方法
- npmの使用方法
第1回目はHello, world!の作成を通じてNode.jsによるCLIアプリケーションの作成を解説します。
ワークスペースの作成
mkdir workspace
mkdir workspace/js
mkdir workspace/basic
mkdir workspace/basic/01-hello-world
touch workspace/basic/01-hello-world/index.js
cd workspace/basic/01-hello-world
または
mkdir -p workspace/basic/01-hello-world
touch workspace/basic/01-hello-world/index.js
cd workspace/basic/01-hello-world
1行のプログラム
index.js
に下記の内容を入力します。
console.log('Hello, world!')
入力が完了したら保存します。
保存が完了したら次のコマンドでプログラムを実行します。
node index.js
プログラムが正常に動作すると次の実行結果が得られます。
Hello, world!
console.log
は標準出力に文字列を出力する関数で、PHPで言うところのecho
、Javaで言うところのSystem.out.println
、Cで言うところのprintf
にあたります。
'use strict'; を1行目に書く
先ほどのプログラムの1行目に 'use strict;
を追加します。
'use strict';
console.log('Hello, world!')
下記コマンドで同じように実行します。
node index.js
同じ実行結果が得られます。
Hello, world!
'use strict';
を追加することで未定義の変数の使用を禁止するなど、より厳格な文法でプログラムを書くことができますので、基本的にはファイルの記載することが推奨されます。
main関数
先ほどのプログラムを下記のように変更します。
'use strict';
main()
function main() {
console.log('Hello, world!')
}
実行コマンドと実行結果は同じです。
node index.js
Hello, world!
function
は関数を定義するキーワードです、この点はPHPに似ています。
main()
で関数を呼び出す点については、他の手続き型の言語と同様です。JavaScriptでは古い処理系を除き、関数の呼び出しを関数の定義より先に記述することができます。
自分がメインモジュールかどうか調べる
ソースコードを変更して、main()
の呼び出しの前後をifブロックでくくります。
'use strict';
if (require.main === module) {
main()
}
function main() {
console.log('Hello, world!')
}
実行コマンドと実行結果は同じです。
node index.js
Hello, world!
詳しくは後から説明しますが、Node.jsではモジュールシステムにより、ソースコードを複数のファイルに分割して記述することができます。
その際、自分がメインで実行されているファイルかどうかをチェックしているのが、たったいま追加したifブロックです。
コマンドライン引数を使用する
ソースコードを編集します。
'use strict';
if (require.main === module) {
main({ argv: process.argv })
}
function main(options) {
var argv = options.argv
var name = argv[2]
console.log('Hello, ' + name + '!')
}
変更箇所は下記の通りです。
-
main
の関数呼び出しに引数を追加 -
main
の関数定義に引数を追加 -
main
内にargv
の変数定義を追加 -
main
内にname
の変数定義を追加 -
console.log
の引数の変更
今回から実行方法が変わります。
node index.js Tatsuya
Hello, Tatsuya!
まず、{ argv: process.argv }
はJavaScriptのオブジェクトと呼ばれるデータ構造です。C言語で言うところの構造体やJavaなどのオブジェクト指向言語で言うところのクラスに近いです。即席で生成できるのがポイントです。
例えば下記のようなプログラムを考えます。
var teacher = { name: 'susukida' , age: 28 }
console.log(teacher.name)
console.log(teacher.age)
susukida
28
ちなみに、name
やage
はプロパティと呼ばれます、他の言語ではメンバやフィールドと呼ばれることがあります。
次に、process.argv
のprocess
は、実行されているプログラムの情報が格納されているオブジェクトです。process.argv
はコマンドライン引数の内容が配列として格納されるプロパティです。
process.argv
の1番目(添え字は0)の要素には、Node.jsのランタイムのパスが格納されます。Windowsの場合はexeファイルのパスになります。
process.argv
の2番目(添え字は1)の要素には、実行されているソースファイルのパスが格納されます。
process.argv
の3番目(添え字は2)の要素には、1番目のコマンドライン引数が格納されます。n番目のコマンドライン引数にアクセスするにはprocess.argv
のn+2番目(添字はn+1)を使用します。
さらに、変数を作成するときにはvar
キーワードを使用します。JavaScriptにはデータ型がありますが、変数にはデータ型を指定しないで使用します。
最後に、文字列は+
で連結することができます。
環境変数を使用する
ソースコードを下記の通り変更します。
'use strict';
var env = process.env.NODE_ENV || 'development'
if (require.main === module) {
main({ argv: process.argv })
}
function main(options) {
var argv = options.argv
var name = argv[2]
if (env === 'development') {
console.log('Hello, world!')
} else if (env === 'production') {
console.log('Hello, ' + name + '!')
} else {
throw new Error('invalid env')
}
}
変更点は下記の通りです。
-
var env = ...
の追加 -
if (env === 'development') { ... } ...
の追加
今回は実行方法がさらに変わります。
NODE_ENV=production node index.js Tatsuya
Hello, Tatsuya!
もう一つの実行方法を試します。
NODE_ENV=development node index.js Tatsuya
Hello, world!
Node.jsでは環境変数にprocess.env
からアクセスすることができます。process.env.NODE_ENV
にはNODE_ENV
という環境変数に格納される値が格納されます。
var env = process.env.NODE_ENV || 'development'
という記述は、process.env.NODE_ENV
に値が格納されている場合にはその値を使用し、そうではない場合にはデフォルトの値として'development'
を格納するということを意味します。
おわりに
以上のソースコード作成を通じて下記を学びました。
-
console.log
による標準出力 -
'use strict
;`の使用 -
function
による関数の使用 -
require.main === module
によるメインかどうかの確認 -
process.argv
によるコマンドライン引数の使用 -
process.env
による環境変数の使用
次回は標準ライブラリの使用方法について解説します。