Node.js 実践講座 〜基礎編〜 その1

この記事では年末の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``` に下記の内容を入力します。

```js:index.js(ver.1)
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;``` を追加します。

```js:index.js(ver.2)
'use strict';

console.log('Hello, world!')
```

下記コマンドで同じように実行します。

```コマンド
node index.js
```

同じ実行結果が得られます。

```実行結果
Hello, world!
```

```'use strict';``` を追加することで未定義の変数の使用を禁止するなど、より厳格な文法でプログラムを書くことができますので、基本的にはファイルの記載することが推奨されます。

# main関数

先ほどのプログラムを下記のように変更します。

```js:index.js(ver.3)
'use strict';

main()

function main() {
  console.log('Hello, world!')
}
```

実行コマンドと実行結果は同じです。

```コマンド
node index.js
```

```実行結果
Hello, world!
```

`function`は関数を定義するキーワードです、この点はPHPに似ています。

`main()` で関数を呼び出す点については、他の手続き型の言語と同様です。JavaScriptでは古い処理系を除き、関数の呼び出しを関数の定義より先に記述することができます。

# 自分がメインモジュールかどうか調べる

ソースコードを変更して、`main()`の呼び出しの前後をifブロックでくくります。

```js:index.js(ver.4)
'use strict';

if (require.main === module) {
  main()
}

function main() {
  console.log('Hello, world!')
}
```

実行コマンドと実行結果は同じです。

```コマンド
node index.js
```

```実行結果
Hello, world!
```

詳しくは後から説明しますが、Node.jsではモジュールシステムにより、ソースコードを複数のファイルに分割して記述することができます。

その際、自分がメインで実行されているファイルかどうかをチェックしているのが、たったいま追加したifブロックです。

# コマンドライン引数を使用する

ソースコードを編集します。

```js:index.js(ver.5)
'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にはデータ型がありますが、変数にはデータ型を指定しないで使用します。

最後に、文字列は```+```で連結することができます。

# 環境変数を使用する

ソースコードを下記の通り変更します。

```js:index.js(ver.6)
'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`による環境変数の使用

次回は標準ライブラリの使用方法について解説します。