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() より細かく制御できる。
 
(※) "Domain" は非推奨(Deprecated)、"TTY" は直接使う必要はないので、省略。

機能

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 : bar
process.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 の scriptsstart などにコマンドを書くことによって、 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 にもある機能なので、ブラウザーが対応していればクライアントサイドでも利用できます。

なお、今回説明している関数群は Node.js ではグローバル関数ですが、 JavaScript では window オブジェクトのメソッドです。
クライアントサイドで使う場合は 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 


 
このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
36位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
3位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

02月 | 2017年03月 | 03月
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。