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
Node.js API - JavaScript のタイマー機能と非同期呼び出し
今回は Node.js API を使ったタイマー機能とそれに関連する関数の非同期呼び出しについて説明します。
Node.js API にある機能ですが、もともと JavaScript にもある機能なので、ブラウザーが対応していればクライアントサイドでも利用できます。
クライアントサイドで使う場合は window. をつけたものに読み替えてください。(例 : setTimeout → window.setTimeout)
タイマーの設定
setTimeout
タイマー機能で最も基本的な関数は setTimeout() です。 これは指定した時間がたった後に関数を実行します。setTimeout(func, delay [, arg0, arg1, ...])delay が指定する時間で ミリ秒 で設定します。 以下の例では 5 秒後にログを出力します。
setTimeout(() => { console.log('Timeout'); }, 5000);実行する関数が引数をとる場合には delay の後に引数を渡します。
setTimeout((a, b) => { console.log('Timeout', a, b); // Timeout foo bar }, 5000, 'foo', 'bar');ただ、無名関数を使う場合はクロージャーの機能で変数を持たせることができるので、使う必要はないです。
setInterval
setTimeout() では渡した関数を一回実行して終わりですが、 setInterval() の場合は指定した間隔で繰り返し呼び出します。 それ以外は setTimeout() と同じです。setInterval(func, delay [, arg0, arg1, ...])以下の例では 1 秒間隔でログを出力します。 ただ、これを本当に実行すると止まらなくなります。
setInterval(() => { console.log('Interval'); }, 1000);
タイマーの解除
設定したタイマーを解除する場合、各関数に対応した clearXxxx() の関数を呼び出します。clearTimeout(timeoutID) clearInterval(intervalID)解除関数にはタイマーの ID となるオブジェクトを渡す必要があります。 これは各設定関数の戻り値です。
前章のサンプルでは setInterval() の関数は止まりませんでしたが、 次の例では 5 秒後に止まります。
var intervalID = setInterval(() => { console.log('Interval'); }, 1000); setTimeout(() => { clearInterval(intervalID); }, 5000);ちなみに、無名関数を使わずに短く書くと次のようになります。
setTimeout(clearInterval, 5000, setInterval(console.log, 1000, 'Interval'));
非同期呼び出し setImmediate
setImmediate() は指定した関数をすぐに(Immediately) 実行します。setImmediate(func, [, arg0, arg1, ...])以下の例ではすぐにログを出力します。
setImmediate(()=>console.log('Immediate'));setImmediate() は setTimeout で 0 秒を設定したものに相当します。 ただ、相当はするのですが、 setTimeout(..., 0) と同じでもありません。
setTimeout() には制限があって、最小遅延(4,5ns 程度)が必要なので、すぐに実行したい場合には setImmediate() の方を使います。
タイムアウト時間を設定しない setImmediate() はなぜ必要なのでしょうか?
これは "すぐ" といっても、本当に "すぐ" ではないところがポイントです。
setImmediate() を実行すると、すぐに処理を返します。ここは本当にすぐです。その後、一連の処理が終わってから、指定した関数を実行します。 つまり、 関数を非同期に呼び出すことになります。
例えば、ボタンなどをクリックした後の処理ではすぐに処理を返さないと固まってしまいます。 そこで時間のかかる処理を行うことはユーザビリティーを悪化させます。
そこで、実行時間の長い処理は setImmediate() に設定して、一旦処理を返します。 ブラウザーはレイアウトや描画などの未処理の作業を処理してから、その時間のかかる処理を実行するようになります。
サンプルコード
記事で使用したサンプルコードは以下のリンクから取得(名前をつけて保存)できます。 これを node コマンドの引数に渡して実行します。$ node timer.js