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どちらの環境にも存在します。
たとえばBooleanやStringなどのラッパーオブジェクト、MapやPromiseのようなビルトインオブジェクトはどちらの環境にも存在します。
しかし、実行環境によって異なるオブジェクトもあります。
たとえばウェブブラウザ環境のグローバルオブジェクトは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で実行環境による違いがあることを理解した