Node.jsでHello World

実際にアプリケーションを作成する前に、まずはHello Worldアプリケーションを通じてNode.jsのCLIアプリケーションの基本を学びましょう。

プロジェクトディレクトリの作成

今回作成するNode.jsのCLIアプリケーションでは、JavaScriptやMarkdownなどのファイルを扱います。 そのため、まずそれらのファイルを置くためのディレクトリを作成します。

ここではnodecliという名前で新しいディレクトリを作成します。 ここからは作成したnodecliディレクトリ以下で作業していきます。

またこのプロジェクトで作成するファイルは、必ず文字コード(エンコーディング)をUTF-8、改行コードをLFにしてファイルを保存します。

Hello World

まずはNode.jsでHello Worldアプリケーションを作ってみましょう。 具体的には、実行すると標準出力に"Hello World!"という文字列を表示するCLIアプリケーションを記述します。 はじめに用意するのは、アプリケーションのエントリーポイントとなるJavaScriptファイルです。 nodecliディレクトリにmain.jsという名前でファイルを作成し、次のように記述します。

main.js

console.log("Hello World!");

ウェブブラウザの実行環境では、console.logメソッドの出力先はブラウザの開発者ツールのコンソールでした。 Node.js環境では、console.logメソッドの出力先は標準出力になります。 このコードは、標準出力に"Hello World!"という文字列を出力するものです。

JavaScriptのコードをNode.jsで実行するには、nodeコマンドを使用します。 コマンドラインでnodecliディレクトリに移動し、次のコマンドでNode.jsを使いmain.jsを実行します。 まだnodeコマンドの用意ができていなければ、先に「アプリケーション開発の準備」の章を参照してください。

# `cd`コマンドでnodecli/ディレクトリに移動する
$ cd nodecli/
# `node`コマンドで`main.js`を実行する
$ node main.js
Hello World!

Node.jsでは、エントリーポイントとなるJavaScriptファイルを作成し、そのファイルをnodeコマンドの引数に渡して実行するのが基本です。 また、ウェブブラウザのJavaScriptと同じく、コードは1行目から順に実行されます。

Node.jsプロジェクトのセットアップ

今回作成するNode.jsのCLIアプリケーションは、main.jsファイル以外にも複数のファイルが必要になります。 また、外部のnpmパッケージのインストールやテストスクリプトの実行なども行います。 そのため、Node.jsプロジェクトのセットアップとしてpackage.jsonというファイルを作成します。

package.jsonとは、プロジェクトの情報、プロジェクトが依存するパッケージ、プロジェクトで実行するスクリプトなどを記録するJSON形式のファイルです。 package.jsonファイルのひな形は、npm initコマンドで生成できます。 まだnpmコマンドの用意ができていなければ、先に「アプリケーション開発の準備」の章を参照してください。

通常は対話式のプロンプトによって情報を設定しますが、ここではすべてデフォルト値でpackage.jsonを作成する--yesオプションを付与します。 nodecliのディレクトリ内で、npm init --yesコマンドを実行してpackage.jsonを作成しましょう。

$ npm init --yes

生成されたpackage.jsonファイルは次のようになっています。

package.json

{
  "name": "nodecli",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

現時点ではpackage.jsonにはあまり情報が記述されていませんが、後ほどアプリケーションの情報や依存パッケージを追加する際に利用します。

Node.jsとブラウザのグローバルオブジェクト

Node.jsは、ウェブブラウザのChromeと同じV8というJavaScriptエンジンを利用しています。 そのため、ECMAScriptで定義されている基本構文はブラウザと同じように使えます。 しかし、ブラウザ環境とNode.js環境では利用できるグローバルオブジェクトが違うため、アプリケーションを開発するときにはその違いを理解しなくてはなりません。

ECMAScriptで定義されているグローバルオブジェクトはブラウザとNode.jsどちらの環境にも存在します。 たとえばBooleanStringなどのラッパーオブジェクト、MapPromiseのようなビルトインオブジェクトはどちらの環境にも存在します。

しかし、実行環境によって異なるオブジェクトもあります。 たとえばウェブブラウザ環境のグローバルオブジェクトはwindowオブジェクトですが、Node.jsではglobalと呼ばれるオブジェクトがグローバルオブジェクトになります。 ブラウザのwindowオブジェクトには、次のようなプロパティや関数があります。

一方、Node.jsのglobalオブジェクトには、たとえば次のようなプロパティや関数があります。

それぞれのグローバルオブジェクトにあるプロパティなどは、同じ名前でグローバル変数や関数としてアクセスできます。 たとえばwindow.documentプロパティは、グローバル変数のdocumentとしてもアクセスできます。

また、ECMAScriptで定義されたものではありませんが、ほぼ同等の機能と名前を持つプロパティや関数がブラウザとNode.jsのどちらにもある場合があります。 たとえば次のようなAPIは同等の機能を提供しますが、メソッドの種類や返り値が異なります。

  • Console API
  • setTimeout関数

これらを踏まえた上で、次のセクションからCLIアプリケーションの開発をはじめていきましょう。

このセクションのチェックリスト

  • nodecliディレクトリを作成した
  • nodecli/main.jsファイルを作成した
  • nodeコマンドでnodecli/main.jsを実行し、標準出力にログが出力されるのを確認した
  • npm init --yesコマンドでnodecli/package.jsonファイルを作成した
  • グローバルオブジェクトについて、ウェブブラウザとNode.jsで実行環境による違いがあることを理解した