Node.js の Windows へのインストールと npm の使い方
今回は Node.js の Windows 環境におけるインストールと、 そのパッケージ管理ツールである npm の使い方についてです。
Node.js とは
JavaScript は、もともとブラウザー側で解釈して、実行するクライアントサイドの言語です。Node.js を使うとローカル上で JavaScript を実行できるようになります。 これの何がいいかというと、 Node.js によりサーバーサイドの言語も JavaScript で書けるようになり、 サーバー、クライアントサイドともに同じ言語で開発できるようになります。
また、JavaScript の解析には Chrome の V8 エンジン を使っていて、動作速度はスクリプト言語の中では比較的、高速な方です。
なお、 Node.js は一時期、開発が停滞していて、業を煮やした人たちによって Io.js として分離していました。 しかし、今ではめでたく統合されています。
Node.js のインストール
まず、 Node.js のダウンロードページから Windows 用のインストーラー(node-vX.X.X-x86|x64.msi) をダウンロードします。
ダウンロードしたインストーラーを実行すれば、 Node.js はインストールが開始されます。
基本的にデフォルトのままでも問題ありません。 変えるとしたら、インストール先ぐらいでしょう。

インストールするものもカスタマイズできますが、全部いれておいた方がいいです。

Node.js の使い方
インストールが完了したら、動くか確認してみます。Node.js の実行ファイルは node.exe です。
node.exe や次章の npm.exe はインストール時のカスタムで変更していなければ、 環境変数 PATH が通っているので、そのまま使えます。
また、 Node.js をインストールするとスタートメニューに [Node.js command prompt] ができるので、このコマンドプロンプト上で実行することもできます。

とりあえず動くことを確認するには -v オプションでバージョンが表示します。
> node.exe -v v5.4.0また、 -h でヘルプが表示されます。
> node.exe -h
スクリプトファイルの実行
node の基本的な使い方としては JavaScript ファイルを渡して実行します。hello.js :
console.log("Hello world!");
> node.exe hellol.js Hello world!
対話モード (REPL)
node の後にスクリプトファイルを指定しないと対話モードで起動します。> node > console.log("Hello world!"); Hello world! undefined > .exit
デバッグモード
node の引数に debug を渡して、その後にスクリプトファイルを書くとデバッガーが起動します。hello_debug.js :
console.log("Hello "); debugger; console.log("world!");
> node debug hello_debug.js debug>connecting to 127.0.0.1:5858 .< Debugger listening on port 5858 debug> . ok debug>break in d:\home\programmers_notes\node\hello_debug.js:2 1 > 2 console.log("Hello "); 3 debugger; 4 console.log("world!"); debug> next debug> debug>< Hello debug>break in d:\home\programmers_notes\node\hello_debug.js:3 1 2 console.log("Hello ");> 3 debugger; 4 console.log("world!"); 5 debug> cont debug> debug>break in d:\home\programmers_notes\node\hello_debug.js:4 2 console.log("Hello "); 3 debugger;> 4 console.log("world!"); 5 6 debug> quit
npm の使い方
Node.js には多くのパッケージが公開されており、 npm を使ってインストールなどの管理が出来ます。npm は最初の引数をコマンドとして種々の操作を行います。取り得るオプションや引数はそのコマンドによって変わってきます。
> npm コマンド [オプション] [引数]
プロキシ環境での設定 (config)
npm では Web からパッケージを取得してインストールします。 そのため、ネットワークの接続にプロキシを使用している場合は サーバーを設定していないとエラーとなります。プロキシサーバーを設定するには以下のコマンドを実行します。
> npm config -g set proxy プロキシサーバーのアドレス:ポート番号 > npm config -g set https-proxy プロキシサーバーのアドレス:ポート番号
> npm config -g set proxy http://foo.co.jp:8080 > npm config -g set https-proxy http://foo.co.jp:8080
プロキシを設定してもまだエラーが発生する場合には さらにレジストリーの参照先も変更する必要があります。
> npm config -g set registry http://registry.npmjs.org/ここで指定している -g オプションは全ユーザーに対して設定するためのものです。 -g をつけていないと実行しているユーザーのみの設定となります。
設定した内容を確認する場合は set ではなく ls(list) を指定します。
> npm config ls参考 :
プロジェクトの作成 (init)
Node.js のプロジェクトを作成する場合、 init のコマンドでプロジェクトの設定ファイル(package.json)ができます。> npm init [-y]-y (--yes) をつけるとすべてデフォルトの値を使って作成します。 つけていない場合は対話的に設定内容を入力することになります。
例えば、 sample フォルダーを作成し、そこで init -y を実行すると以下のファイルが作成されます。
package.json :
{ "name": "sample", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }各項目の詳しい説明については以下のサイトで記述されています。
パッケージのインストール (install)
パッケージのインストールは install(i) コマンドを使用します。> npm install [-g] [パッケージ名]パッケージ名でインストールするパッケージを指定します。 パッケージは最新版がインストールされますが パッケージ名@バージョン(foo@1.2.3) とするとバージョンを指定することができます。
-g (--global) はグローバルインストールのオプションです。
Gulp や JSHint のようにコマンドライン上で起動させるものはグローバルインストールにします。
通常のパッケージの場合は -g を付けません。この場合、カレントのプロジェクトに node_modules のフォルダーを作って、インストールされます。
また、 パッケージ名を省略するとカレントのプロジェクトで利用しているパッケージをまとめてインストールします。 こちらはダウンロードや Clone でプロジェクトを取得した際などに使います。
パッケージのアップデート(install, update)
パッケージのアップデートも install コマンドで行うことができます。例えば npm 自体をアップデートするには以下のコマンドを実行します。
> npm install -g npmまた、 update を使うとまとめてアップデートができます。 install と同様に -g オプションをつけるとグローバルインストールしたパッケージ、つけない場合はプロジェクトローカルのパッケージが対象です。
> npm update > npm -g update
パッケージの利用
パッケージをインストールすると require で呼び出して使うことができるようになります。index.js :
var lodash = require('lodash'); var output = lodash.without([1, 2, 3], 1); console.log(output);
> npm install lodash > node index.js [ 2, 3 ]ちなみに package.json の main でスクリプトファイルが指定されているパッケージの場合、 require で呼び出された際に、最初にそのファイルが実行されます。
依存パッケージの登録
パッケージ名の指定なしの npm install でインストールされるパッケージはそのプロジェクトが依存しているパッケージです。 依存パッケージは以下のコマンドでパッケージに登録(package.json に書き込み)できます。> npm install パッケージ名 --save > npm install パッケージ名 --save-dev--save-dev の方は開発やテストでのみ使用するパッケージに対して使います。
スクリプトの実行 (start, test, ...)
package.json の "scripts" フィールドの start や test などの項目に処理を記述すると npm から実行できるようになります。> npm start > npm test
例えば、 package.json に以下の記述を加えると npm start で index.js が実行されます。
"scripts": { "start": "node index.js" },
> npm start > sample@1.0.0 start c:\Users\...\sample > node index.js [ 2, 3 ]
その他のコマンド
その他のよく使いそうなコマンドもいくつかあげておきます。なお、 -g オプションは install の場合と同じで、対象がグローバルとなります。
コマンドの書式 | 別名 | 説明 |
---|---|---|
npm -h npm コマンド -h npm help 用語(コマンド) |
ヘルプの表示。 help コマンドの場合はブラウザーで説明のページを開く。 | |
npm uninstall [-g] パッケージ名 | remove, rm, r, un, unlink | パッケージのアンインストール |
npm ls [-g] npm ls [-g] パッケージ名 | list, la, ll |
インストールしたパッケージのリストの表示。 パッケージ名を指定するとそのパッケージの情報だけ表示。(バージョンを確認したい場合など) |
npm view パッケージ名 | info, show, v | パッケージの詳細情報の表示 |
Node.js API - 標準モジュール
Node.js を使うと PC 上で JavaScript を実行できるようになります。
ただ、 JavaScript はもともとクライアントサイドの言語のため、
ファイルを直接操作するなどの API はありません。
そこで Node.js はプログラムとして動作させるために必要な各種 API をモジュールとして用意しています。
その標準モジュールに関する記事を書いてみました。
標準モジュールと API
Node.js の API を提供するモジュールは Node.js とともに標準でインストールされています。 それらの多くも使用する場合には require によるロードは必要ですが、 npm でのインストールを行うことなく、そのまま使うことができます。 ちょうど C, C++ の標準ライブラリーのような感じです。 ただ、 Node.js はサーバーサイドのアプリケーションを主な対象としているため、 HTTP などの通信に必要なモジュールも多く用意されています。標準モジュール
Node.js のドキュメントで説明されているモジュールをリストにまとめました。 これらのうち、気になったモジュールについては少しずつ解説記事も書いていこうかなと考えています。モジュール | require | 概要 | 解説 |
---|---|---|---|
Events | events | イベント処理 Node.js の API の多くがこれを使った非同期イベント駆動で構築されている。 |
link |
Stream | - (stream) | ストリームのインターフェース [ベースクラスを使う場合には require] 標準出力、 HTTP リクエストなど様々なオブジェクトがこのインターフェースで実装されている。 |
|
Console | - | デバッグ用などでのコンソール出力 [console : グローバルオブジェクト] ブラウザーでの console に相当するオブジェクト |
|
Process | - | カレントプロセスの情報、操作 [process : グローバルオブジェクト] コマンド引数や環境変数などの情報や exit による終了など プログラムとして動作するために必要な基本的な機能群 |
1 2 3 |
Child Processes | child_process | 外部プログラムの実行など子プロセスの実行、管理 | |
Cluster | cluster | サーバーポートの複数プロセスでの共有 | |
Readline | readline | 対話型インターフェースのプログラムでよく使われている readline ライブラリーにあたる機能 | |
Utilities | util | 他のモジュールからも呼ばれるような汎用関数群 | |
URL | url | URL の文字列解析 | link |
Query Strings | querystring | クエリー文字列(URL 中の ? 以降) | |
Path | path | ファイルパスの文字列処理 | link |
File System | fs | ファイルの I/O、ファイル情報の取得、ファイル・ディレクトリー操作 など | |
Buffer | - |
バイナリーデータ用ストリームオブジェクト [Buffer : グローバルなコンストラクター] ES6 では Uint8Array があるが、Node.js 的にはこちらがいいらしい。 |
|
String Decoder | string_decoder | Buffer のデコーダー | |
DNS | dns |
DNS による ドメイン名、 IP アドレス の解決 DNS サーバーに直接問い合わせ、OS の機能 の 2 通りの方法が使える。 |
|
Punycode | punycode | Punycode (ドメイン名で使われる文字符号化方式) のエンコード、デコード | |
Net | net |
ソケット(TCP/IP)通信 HTTP などよりも低レベル(下位層)の通信機能 |
|
HTTP | http | HTTP サーバー、クライアント | |
HTTPS | https | HTTPS(TLS/SSL を使った HTTP)用 | |
TLS/SSL | tls | TLS/SSL (暗号化した通信) | |
Crypto | crypto | OpenSSL などをラップした暗号化機能 | |
ZLIB | zlib | GZip, Inflate でのデータ圧縮、解凍 最近の http サーバーでは gz で圧縮されたまま送って、ブラウザーで解凍することが多い |
|
UDP/Datagram | dgram | UDP (データグラムを送受信するプロトコル)通信 TCP と違いデータの完全性が保証されないので、途中でデータが抜け落ちても問題が少ない音声や画像のストリーム配信などに使われる。 |
|
OS | os | OS 関連情報の取得 どの OS かというだけなら process.platform で可能。 |
|
V8 | v8 | V8 エンジン関連 | |
VM | vm | JavaScript コードの実行 JavaScript 標準の eval() より細かく制御できる。 |
機能
Node.js のドキュメントには出ていますが、モジュールというとちょっと違うかなという機能はこちらにまとめました。機能 | 概要 | 解説 |
---|---|---|
REPL | 対話モード | |
Debugger | デバッグモード | |
Modules | モジュール管理システム | |
Globals | Node.js で利用できるグローバルオブジェクト群 | |
Errors | エラー処理 | |
Assertion Testing | アサーション(表明) 機能 | |
Timers | タイマー機能 | link |
C/C++ Addons | Node.js で C/C++ ライブラリーを使用するための仕組み |
Node.js API (process) - コマンドライン引数の取得
Node.js を使うと JavaScript を PC 上で動作できるようになります。
プログラムとして動作させる場合、コマンドライン引数を使いたくなることがあります。
今回は Node.js でコマンドライン引数を取得する方法の紹介です。
コマンドライン引数
コマンドライン引数は process.argv の配列に格納されています。process は 標準モジュールの 一つである Process モジュールが提供する グローバルオブジェクトで、プログラムのどこからでも使えます。
process_arg.js :
for (let cnt in process.argv) { console.log('%d : %s', cnt, process.argv[cnt]); }
$ node --no-deprecation process_arg.js foo bar 0 : c:\Program Files\nodejs\node.exe 1 : d:\home\programmers_notes\node\process_arg\process_arg.js 2 : foo 3 : barprocess.argv では 先頭に node のパス、 2 番めにスクリプトファイルのパスが格納され、 引数はそれ以降です。 process.argv は node プログラム自体に渡される引数は入っていません。
あまり必要になることはありませんが、 もしそれらの引数が必要な場合は process.execArgv に格納されています。 また、 node やスクリプトファイルのパスは process.argv 以外から取得することもできます。
メソッド(オブジェクト) | 対象 |
---|---|
process.argv | スクリプトの引数の配列 |
process.execArgv | node の引数の配列 |
process.execPath | node のパス |
__dirname | スクリプトファイルのディレクトリーのパス |
__filename | スクリプトファイルのパス |
console.log('process.execArgv = ', process.execArgv); console.log('process.execPath = ', process.execPath); console.log('__dirname = ', __dirname); console.log('__filename = ', __filename);
process.execArgv = [ '--no-deprecation' ] process.execPath = c:\Program Files\nodejs\node.exe __dirname = d:\home\programmers_notes\node\process_arg __filename = d:\home\programmers_notes\node\process_arg\process_arg.js
npm からの起動
npm の scripts のstart
などにコマンドを書くことによって、
npm から起動することができます。
package.json :
{ "name": "process_arg", "version": "1.0.0", "main": "process_arg.js", "scripts": { "start": "node process_arg.js" }, "license": "ISC" }npm から起動した場合、引数は npm の引数となります。 スクリプトに引数を渡したい場合は "--" 以降に記述します。
$ npm start -- foo bar > process_arg@1.0.0 start d:\home\programmers_notes\node\process_arg > node process_arg.js "foo" "bar" 0 : C:\Program Files\nodejs\node.exe 1 : d:\home\programmers_notes\node\process_arg\process_arg.js 2 : foo 3 : bar process.execArgv = [] process.execPath = C:\Program Files\nodejs\node.exe __dirname = d:\home\programmers_notes\node\process_arg __filename = d:\home\programmers_notes\node\process_arg\process_arg.js