CommonJS

CommonJSはサーバーサイドJavaScriptを支える標準APIです。

クライアントサイドJavaScriptにはDOMという標準の拡張APIがありました。 しかし、サーバサイドJavaScriptやその他のJavaScript実行環境には このような標準APIがなく独自APIが多数存在し、ライブラリ利用者に大きな負担となっていました。

このため2009年頃からCommonJSという標準APIを定める活動が現れました。

そして、現在サーバサイドJavaScriptとして多く使われるNode.jsやJavaScriptを組み込んだアプリケーションはこのCommonJSに準拠したライブラリを備え、多数の開発者がCommonJS準拠のライブラリを使用しています。

このJavaScript実行環境OgOも、CommonJSに準拠したAPIを部分的に実装しています。今後 必要に応じてCommonJS APIを追加実装していく予定です。

参照
CommonJS - Wikipedia, the free encyclopedia

Node.js Manual & Documentation
Node.js マニュアル & ドキュメンテーション

CommonJS API分類
Bufferバイナリデータ操作
File System (fs)ファイル操作
Moduleモジュール機能
PathPath操作

Buffer クラス...

Buffer クラスは、バイナリデータを操作するためのクラスです。


Buffer : プロパティ・関数・・・リスト
プロパティ
lengthバイナリデータのバイト数
コンストラクタ
BufferBufferオブジェクトを作成
メソッド関数
copyバッファ間でコピー
fill指定された値でバッファを埋める
read{Type}
readUInt8,
readUInt16LE, readUInt16BE,
readUInt32LE, readUInt32BE,
readInt8,
readInt16LE, readInt16BE,
readInt32LE, readInt32BE
バッファから整数を取り出す
toStringバッファの内容を文字列化
write文字列をバイト化して書き込む
write{Type}
writeUInt8,
writeUInt16LE, writeUInt16BE,
writeUInt32LE, writeUInt32BE,
writeInt8,
writeInt16LE, writeInt16BE,
writeInt32LE, writeInt32BE
バッファへ整数を書き込む
inspectバッファの内容を文字列化
クラスプロパティ
INSPECT_MAX_BYTESinspectメソッドで表示するバイト数
クラス関数
byteLength文字列のエンコード(encoding)バイト列にサイズを得る
concatバッファを結合
isBufferBufferオブジェクトかどうかを判定

length プロパティ Buffer...

バイナリデータのバイト数(バッファのサイズ)

buffer.length : Integer [ReadOnly]

var buffer;
buffer = new Buffer(8);
print( buffer.length ); // 8

buffer = new Buffer("あいう", "uft8");
print( buffer.length ); // 9

Buffer コンストラクター Buffer...

Bufferオブジェクトを作成

new Buffer( size ) : Buffer
new Buffer( array ) : Buffer
new Buffer( string, [encoding] ) : Buffer

引数
size : Integer
sizeバイトのバッファを作成します。(lengthプロパティ)
バッファの内容は不定です。
array : Array
配列の要素をバイト値とするバッファを作成します。
string : String
string文字列の指定エンコード(encoding)バイト列をバッファの内容にします。
encoding : String
引数stringのエンコードを指定します。
指定できるエンコードは、'ascii', 'utf8', 'utf16le'('ucs2'),'base64', 'hex', 'sjis'(OgO限定).
省略した場合、'utf8'とします。
返値
作成したBufferオブジェクトを返します。
var buffer;
buffer = new Buffer(8);
print( buffer.inspect() ); // バッファの内容を表示   不定

buffer = new Buffer([8,9,10]);
print( buffer.inspect() ); // <Buffer 08 09 0a>

buffer = new Buffer("あいう");  // buffer = new Buffer("あいう", "utf8");
print( buffer.inspect() ); // <Buffer e3 81 82 e3 81 84 e3 81 86>

buffer = new Buffer("CAkKCwwN", "base64");
print( buffer.inspect() ); // <Buffer 08 09 0a 0b 0c 0d>

buffer = new Buffer("08090a0b0c0d", "hex");
print( buffer.inspect() ); // <Buffer 08 09 0a 0b 0c 0d>

copy メソッド関数 Buffer...

バッファ間でコピーする。

buffer.copy( targetBuffer, [targetStart], [sourceStart], [sourceEnd] ) : Integer

引数
targetBuffer : Buffer
コピー先のバッファ。buferと同じでもよい。
targetStart : Integer
コピー先の先頭位置を指定します。省略時は0.
sourceStart : Integer
コピー元の先頭位置を指定します。省略時は0.
sourceEnd : Integer
コピー元の最後位置の次を指定します。省略時はbuffer.length.
返値
コピーしたバイト数を返します。
参照
write関数
var buffer, bufferTarget;

buffer = new Buffer([1,2,3,4,5,6,7,8]);
bufferTarget = new Buffer(4);

buffer.copy(bufferTarget);
print( bufferTarget.inspect() ); // バッファの内容を表示  <Buffer 01 02 03 04>

buffer.copy(buffer, 3);
print( buffer.inspect() ); // <Buffer 01,02,03,01,02,03,04,05>

fill メソッド関数 Buffer...

指定された値でバッファを埋める.

buffer.fill( [value], [offset], [end] ) : Buffer

引数
value : Integer
埋める値
offset : Integer
埋める開始位置
end : Integer
埋める終了次位置
返値
bufferを返します.
参照
write関数, write{Type}関数
var buffer = new Buffer(8);
buffer.fill(0);
print( bufferTarget.inspect() ); // バッファの内容を表示  <Buffer 00 00 00 00 00 00 00 00>

buffer.fill(0xff, 4);
print( bufferTarget.inspect() ); // バッファの内容を表示  <Buffer 00 00 00 00 ff ff ff ff>

read{Type} メソッド関数 Buffer...
  read{Type} = readUInt8, readUInt16LE, readUInt16BE, readUInt32LE, readUInt32BE, readInt8, readInt16LE, readInt16BE, readInt32LE, readInt32BE

バッファから整数を取り出す.

buffer.read{Type}( offset, [noAssert] ) : Type

引数
offset : Integer
バッファの先頭位置を指定する.
noAssert : Boolean
trueならoffsetの是非をチェックしない. false(省略時)ならチェックします.
返値
各メソッド関数において バッファの先頭位置offsetから
readUInt8---1バイト 符号なし整数
readUInt16LE---2バイト 符号なし整数(Little-Endian)
readUInt16GE---2バイト 符号なし整数(Big-Endian)
readUInt32LE---4バイト 符号なし整数(Little-Endian)
readUInt32GE---4バイト 符号なし整数(Big-Endian)
readInt8---1バイト 符号あり整数
readInt16LE---2バイト 符号あり整数(Little-Endian)
readInt16GE---2バイト 符号あり整数(Big-Endian)
readInt32LE---4バイト 符号あり整数(Little-Endian)
readInt32GE---4バイト 符号あり整数(Big-Endian)
を読み出した値を返します.
参照
write{Type}関数
var buffer = new Buffer(6);

buffer.writeUInt32LE(0xffffffff);
buffer.writeUInt16LE(0x8000,4);

print(buffer.readInt32LE(0)); // -1
print(buffer.readInt16LE(4)); // -32768

toString メソッド関数 Buffer...

バッファの内容を文字列化する.

buffer.toString( [encoding], [start], [end] ) : String

引数
encoding : String
文字列化のエンコードを指定する.
start : Integer
bufferのバイト先頭位置を指定します. 省略した場合 0.
end : Integer
bufferのバイト終了位置を指定します. 省略した場合 buffer.length.
返値
buffer内のstartからendまでのバイト列をエンコード(encoding)した文字列を返します.
参照
inspect関数
var buf = new Buffer([0x41, 0x42, 0x43, 0x44, 0x45]);
print( buf.toString('utf8', 2) );	// "CDE"

write メソッド関数 Buffer...

文字列をバイト化して書き込む.

buffer.write( string, [offset], [length], [encoding] ) : Integer

引数
string : String
バイト化する文字列を指定.
offset : Integer
書き込みの先頭位置を指定します. 省略した場合 0.
length : Integer
書き込みバイト数を指定します. 省略した場合,Buffer.byteLength(string, encoding)
encoding : String
エンコードを指定します。
指定できるエンコードは、'ascii', 'utf8', 'utf16le'('ucs2'),'base64', 'hex', 'sjis'(OgO限定).
省略した場合、'utf8'とします。
返値
書き込んだバイト数を返します.ただし、bufferのサイズを超える書き込みはできません.
参照
copy関数
var buf = new Buffer([0x41, 0x42, 0x43, 0x44, 0x45]);
print( buf.toString() );	// "ABCDE"

var buf2 = new Buffer("あい");
buf.write(buf2, 2);
print( buf.toString() );  // "ABあ"

write{Type} メソッド関数 Buffer...
  write{Type} = writeUInt8, writeUInt16LE, writeUInt16BE, writeUInt32LE, writeUInt32BE, writeInt8, writeInt16LE, writeInt16BE, writeInt32LE, writeInt32BE

バッファへ整数を書き込む./div>

buffer.write{Type}( value, offset, [noAssert] ) : Integer

引数
value : Type
書き込む整数
offset : Integer
バッファの先頭位置を指定する.
noAssert : Boolean
trueならoffsetの是非をチェックしない. false(省略時)ならチェックします.
返値
バッファへ書き込んだバイト数を返します.
解説
バッファへ整数(value)の書き込みは 各メソッド関数において バッファの先頭位置offsetから
writeUInt8---1バイト 符号なし整数
writeUInt16LE---2バイト 符号なし整数(Little-Endian)
writeUInt16GE---2バイト 符号なし整数(Big-Endian)
writeUInt32LE---4バイト 符号なし整数(Little-Endian)
writeUInt32GE---4バイト 符号なし整数(Big-Endian)
writeInt8---1バイト 符号あり整数
writeInt16LE---2バイト 符号あり整数(Little-Endian)
writeInt16GE---2バイト 符号あり整数(Big-Endian)
writeInt32LE---4バイト 符号あり整数(Little-Endian)
writeInt32GE---4バイト 符号あり整数(Big-Endian)
で書き込みを行います.
参照
read{Type}関数

inspect メソッド関数 Buffer...

バッファの内容を文字列化する

buffer.inspect( [size] ) : String

引数
size : Integer
バッファの内容の表示バイト数を指定します。省略時はBuffer.INSPECT_MAX_BYTES.
返値
形式<Buffer 1バイト目16進表記 2バイト目 .....> の文字列を返します.
参照
toString関数

INSPECT_MAX_BYTES クラスプロパティ Buffer...

inspectメソッドで表示するバイト数

Buffer.INSPECT_MAX_BYTES : Integer (初期値 50)

byteLength クラス関数 Buffer...

文字列のエンコード(encoding)バイト列にサイズを得る

Buffer.byteLength( string, [encoding] ) : Integer

引数
string : String
文字列
encoding : String
エンコードを指定します。
指定できるエンコードは、'ascii', 'utf8', 'utf16le'('ucs2'),'base64', 'hex', 'sjis'(OgO限定).
省略した場合、'utf8'とします。
返値
文字列のエンコード(encoding)バイト列にサイズを返します.
print(Buffer.byteLength("あいう")); // 9
print("あいう".length); // 3

concat クラス関数 Buffer...

バッファを結合

Buffer.concat( list, [totalLength] ) : Buffer

引数
list : Array of Buffers
バッファのリスト
totalLength : Integer
バッファ全体の長さを制限します。
引数が省略された場合、制限しない。このとき、リストにあるバッファのサイズの合計が制限となる。
返値
結合されたBufferオブジェクトを返します.
var buf1 = new Buffer([1,2,3]);
var buf2 = new Buffer([0x10,0x20]);
var buf = Buffer.concat( [buf1, buf2] );
print( buffer.inspect() ); // <Buffer 01 02 03 10 20>

isBuffer クラス関数 Buffer...

Bufferオブジェクトかどうかを判定する.

Buffer.isBuffer( object ) : Boolean

引数
object : Object
調べたいオブジェクト.
返値
objectがBuuferならtrueを返します。そうでなければfalseを返します。
var array = [1,2,3];
var buffer = new Buffer(array);

print( Buffer.isBuffer(array) );  // false
print( Buffer.isBuffer(buffer));  // true

File System (fs)モジュール...

File Systemは、ファイル操作を扱うモジュールです。

このモジュールを使うには、最初にrequire関数でモジュールをロードします。

var fs = require('fs');
print( fs.rename("test.dat", "text.txt) );

rename, renameSyncファイル名変更
truncate, truncateSyncファイルのサイズを変更
unlink, unlinkSyncファイルの削除
exists, existsSyncパスがあるかチェック
chmod, chmodSyncファイルのモードを変更
readFile, readFileSyncファイルからデータを読み出す
writeFile, writeFileSyncファイルを作成し、データを書き込む
appendFile, appendFileSyncファイルにデータを追記する
mkdir, mkdirSyncディレクトリ作成
rmdir, rmdirSyncディレクトリの削除
open, openSyncファイルを開く
close, closeSyncファイルを閉じる
write, writeSyncファイルへデータを書く
read, readSyncファイルからデータを読む

rename 関数File System...

ファイル名を変更する。

fs.rename( source, dest )
fs.renameSync( source, dest )

引数
source : String
既存パス名
dest : String
変更後の新パス名
返値
なにも返しません。(undefined)
sourceパス名が存在しないため、変更できない場合には例外が発生します。
var fs = require('fs');

try{
  fs.rename("d:\\work\\t.dat", "d:\\work\\t.txt");  // t.datファイル名を t.txtに変更
}catch(e){
  // ファイル名変更失敗
}

truncate 関数File System...

ファイルのサイズを変更する。

fs.truncate( path, size )
fs.truncateSync( path, size )

引数
source : String
サイズ変更したいパス名
size : Integer
変更後のサイズ
返値
なにも返しません。(undefined)
サイズ変更できない場合には例外が発生します。
var fs = require('fs');

try{
  fs.rename("d:\\work\\t.dat", 128);  // t.datファイルのサイズを 128バイト変更
}catch(e){
  // ファイルのイズ変更失敗
}

unlink 関数File System...

ファイルを削除する。

fs.unlink( filename )
fs.unlinkSync( filename )

引数
filename : String
削除したいファイルパス名
返値
なにも返しません。(undefined)
削除できない場合には例外が発生します。
var fs = require('fs');

try{
  fs.unlink("d:\\work\\t.dat");
}catch(e){
  // ファイル削除を失敗
}

exists 関数File System...

パスがあるかチェック。

fs.exists( path ) : Boolean
fs.existsSync( path ) : Boolean

引数
path : String
パス名。
返値
パスがあれば、trueを返します。なければ、falseを返します。
var fs = require('fs');

print( fs.exists("d:\\work\\t.dat");  //あればtrue, なければfalse

chmod 関数File System...

ファイルのモードを変更。

fs.chmod( path, mode )
fs.chmodSync( path, mode )

引数
path : String
ファイルパス名。
mode : Integer or String
変更したいファイルのモード。
8進数 0abc で与える。ただし、0<=a,b,c<=8 の数であり、
a は所属ユーザの権限, b は所属グループの権限, c はその他のユーザの権限を指定します。
a,b,cそれぞれは、1(実行権限), 2(書き込み権限), 4(読み取り権限)を | (演算)した結果を与えます。
返値
なし
var fs = require('fs');
fs.chmod("d:\\work\\t.dat", 0666);  //書き込みと読み取り(6 => 2|4)の権限をセットします

readFile 関数File System...

ファイルからデータを読み出す。

fs.readFile( filename, [encoding] ) : String or Buffer
fs.readFileSync( filename, [encoding] ) : String or Buffer

引数
filename : String
ファイルパス名。
encoding : String
encodingが 空文字列, 'binary'または省略ならば、ファイルデータをBufferオブジェクトで返します。
encodingが 'ascii', 'utf8', 'utf16le'('ucs2'),'base64', 'hex', 'sjis'(OgO限定)ならば、ファイルデータをそのエンコードと解釈して文字列を返します。
返値
encodingが 空文字列, 'binary'または省略ならば、読み込んだファイルデータをBufferオブジェクトで返します。 その他のencodingならば、ファイルデータをその文字列形式として読み込み、その文字列を返します。
読み出しを失敗したら、例外が発生します。
var fs = require('fs');

var txt = fs.readFile("d:\\work\\t.dat", 'utf8');

writeFile 関数File System...

ファイルを作成し、データを書き込む。

fs.writeFile( filename, data, [encoding] )
fs.writeFileSync( filename, data, [encoding] )

引数
filename : String
ファイルパス名。既存ファイルは中身を空にしてから、書き込みます。
data : String or Buffer
書き込むデータ。
encoding : String
data引数が文字列である場合、文字列のエンコードを指定します。
エンコードは'ascii', 'utf8', 'utf16le'('ucs2'),'base64', 'hex', 'sjis'(OgO限定)のいづれかを指定します
返値
返値なし(undefined). 書き込みを失敗したら、例外が発生します。
var fs = require('fs');

var buf = new Buffer([1,2,3,4,5]);
try{
  fs.writeFile("d:\\work\\t.dat", "あいうえお', 'utf8');
  fs.writeFile("d:\\work\\bin.dat", buf);
}catch(e){
  //書き込み失敗
}

appendFile 関数File System...

ファイルにデータを追記する。

fs.appendFile( filename, data, [encoding] )
fs.appendFileSync( filename, data, [encoding] )

引数
filename : String
ファイルパス名。
data : String or Buffer
書き込むデータ。
encoding : String
data引数が文字列である場合、文字列のエンコードを指定します。
エンコードは'ascii', 'utf8', 'utf16le'('ucs2'),'base64', 'hex', 'sjis'(OgO限定)のいづれかを指定します
省略した場合、'utf8'とします。
返値
返値なし(undefined). 書き込みを失敗したら、例外が発生します。
var fs = require('fs');

var buf = new Buffer([1,2,3,4,5]);
var buf2 = new Buffer([6,7,8,9,10]);
try{
  fs.writeFile("d:\\work\\t.dat", "abcd", 'utf8');
  fs.appendFile("d:\\work\\t.dat", "あいうえお', 'utf8');

  fs.writeFile("d:\\work\\bin.dat", buf);
  fs.appendFile("d:\\work\\bin.dat", buf2);
}catch(e){
  //追記 失敗
}

mkdir 関数File System...

ディレクトリを作成する。(ネストしたディレクトリも一度に作成)

fs.mkdir( dirname )
fs.mkdirSync( dirname )

引数
dirname : String
ディレクトリパス名。
返値
返値なし(undefined). ディレクトリ作成を失敗したら、例外が発生します。
var fs = require('fs');

try{
  fs.mkdir("d:\\work\\A");
}catch(e){
  //削除失敗
}

rmdir 関数File System...

ディレクトリを削除する。

fs.rmdir( dirname )
fs.rmdirSync( dirname )

引数
dirname : String
ディレクトリパス名。
返値
返値なし(undefined). ディレクトリ削除を失敗したら、例外が発生します。
var fs = require('fs');

try{
  fs.rmdir("d:\\work");
}catch(e){
  //削除失敗
}

open 関数File System...

ファイルを開く。

fs.open( path, flags, [mode] ) : Integer
fs.openSync( path, flags, [mode] ) : Integer

引数
path : String
ファイルパス名。
flags : String
オープンフラッグ。
'r' ファイルを読み込み専用でオープンします。 ファイルが存在しない場合は例外が発生します。
'r+' ファイルを読み書き両用でオープンします。 ファイルが存在しない場合は例外が発生します。
'rs' 'r'と同じ。
'rs+' 'r+'と同じ。
'w' ファイルを書き込み専用でオープンします。 ファイルは作成されるか (存在しない場合)、または長さ 0 に切り詰められます (存在する場合)。
'wx' 'w' と似ていますが、path が存在すると失敗します。
'w+' ファイルを読み書き両用でオープンします。 ファイルは作成されるか (存在しない場合)、または長さ 0 に切り詰められます (存在する場合)。
'wx+' 'w+' と似ていますが、path が存在すると失敗します。
'a' ファイルを追記用でオープンします。 ファイルが存在しない場合は作成されます。
'ax' 'a' と似ていますが、path が存在すると失敗します。
'a+' ファイルを読み込みおよび追記用でオープンします。 ファイルが存在しない場合は作成されます。
'ax+' 'a+' と似ていますが、path が存在すると失敗します。
mode : Integer
ファイルモード(読み書き許可)。ファイルのモード変更関数chmodを参照。
返値
ファイルディスクリプタ番号を返します. 失敗したら、例外が発生します。
参照
close関数
var fs = require('fs');

var fd = -1;
var buffer, len;
try{
  // write
  fd = fs.open("mytext.data", "w", 0666);
  fs.write(fd, "I like OgO.");
  fs.close(fd);

  // read
  fd = fs.open("mytext.data", "r");
  buffer = new Buffer(128);
  len = fs.read(fd, buffer);
  print(buffer.toString()); // I like OgO.
  fs.close(fd);
}catch(e){
  //失敗
}

close 関数File System...

ファイルを閉じる。

fs.close( fd )
fs.closeSync( fd )

引数
fd : Integer
ファイルディスクリプタ番号。
返値
返値なし(undefined). 失敗したら、例外が発生します。
参照
open関数

write 関数File System...

ファイルへデータを書く。

fs.write( fd, buffer[, offset[, length[, position]]] ) : Integer
fs.write( fd, data[, position[, encoding]] ) : Integer
fs.writeSync( fd, buffer[, offset[, length[, position]]] ) : Integer
fs.writeSync( fd, data[, position[, encoding]] ) : Integer

引数
fd : Integer
ファイルディスクリプタ番号。
buffer : Buffer
Bufferオブジェクト。これに含まれるバイトデータが書き込まれる。
offset : Integer
Bufferオブジェクトbufferの先頭からの位置。省略した場合、offset=0。
length : Integer
書き込みバイト数。省略した場合、buffer.length - offset。
position : Integer or null
ファイルの書き込み位置指定。省略したまたはnullの場合、ファイルの現在位置から書き込まれる。
data : Buffer以外
文字列に変換し、引数encodingでバイト化してから書き込みます。
encoding : String
エンコーディングを指定します。省略した場合、"utf8"。
返値
書き込まれたバイト数を返します. 失敗したら、例外が発生します。
参照
read関数
var fs = require('fs');

var fd = -1;
var buffer;
try{
  fd = fs.open("mydata.dat", "w", 0666);
  buffer = new Buffer("あいう");
  
  fs.write(fd, buffer);
  fs.close(fd);
}catch(e){
  //失敗
}

read 関数File System...

ファイルからデータを読む。

fs.read( fd, buffer[, offset[, length[, position]]] ) : Integer
fs.readSync( fd, buffer[, offset[, length[, position]]] ) : Integer

引数
fd : Integer
ファイルディスクリプタ番号。
buffer : Buffer
Bufferオブジェクトに読み込んだバイトデータがセットされる。
offset : Integer
Bufferオブジェクトbufferのこのoffset位置から読み込んだデータがセットされる。省略した場合、offset=0。
length : Integer
読込みバイト数。省略した場合、buffer.length - offset。
position : Integer or null
ファイルのシーク位置指定。省略したまたはnullの場合、ファイルの現在位置から読み込まれる。
返値
読み込んだバイト数を返します. 失敗したら、例外が発生します。
参照
write関数
var fs = require('fs');

var fd = -1;
var buffer;
try{
  fd = fs.open("mydata.dat", "r");
  buffer = new Buffer(128);
  
  fs.read(fd, buffer, 0, buffer.length);
  print( buffer.toString() );

  fs.close(fd);
}catch(e){
  //失敗
}

Module...

CommonJSではモジュール機能を exports, moduleオブジェクトとrequire関数を使ってを実現します。

モジュールとして読み込まれる側のコードと、モジュールを読む側のコードをそれぞれ以下のように書きます。

■ モジュールとして読み込まれる側のコード smath.js

// smath.js
function add(x,y) {
  return x + y;
}
function mul(x,y) {
  return x * y;
}

exports.add = add;  //add関数を他のモジュールから使えるようにexportします。
exports.mul = mul;  //mull関数を ・・・

■ モジュールを読む側のコード sample.js

var smath = require('./smath');	// このコードと同じフォルダーにあるモジュールをロード

alert( smath.add(10, 20) );   // 30
alert( smath.mul(10, 20) );   // 200

//=別バージョン=
var {add, mul} = require('./smath');	// このコードと同じフォルダーにあるモジュールをロード

alert( add(10, 20) );   // 30
alert( mul(10, 20) );   // 200

JavaScriptでは、複数のコードに同名のグローバル変数が定義されることを「変数の衝突」と呼んでいます。この「変数の衝突」がバグを起こす原因を多く作っています。
そこで exports変数,require関数を使ってモジュール化すれば、モジュールとして読み込まれる側のコードにある変数はすべてローカル変数となり「変数の衝突」を防げます。

そして モジュールの情報はmoduleオブジェクトにセットされています。


exports exportしたい変数や関数をプロパティにセットする
module モジュール情報
module.exports exportしたい変数や関数をプロパティにセットする
module.filename モジュールのフルパス名
module.id モジュールの識別子
require関数 ファイルモジュールをロード
require.main関数 メインモジュール
__dirname 現在実行されているスクリプトのディレクトリ
__filename 現在実行されているスクリプトのフルパス名

exports Module...

exportしたい変数や関数をプロパティにセットする

exports : Object

解説
exportsはモジュールとして読み込まれる側のコードにおいて、外部に公開したい関数やデータをexportsオブジェクトのプロパティにセットします。
各モジュールのexportsは異なるオブジェクトであり、このモジュールを読む側のコードのrequire関数の返値はこのexportsオブジェクトです。

exportsはmodule.exportsオブジェクトがセットされたモジュール内のローカル変数です。

例
  ■ モジュールとして読み込まれる側のコード smath.js
    // smath.js
    function add(x,y) {
      return x + y;
    }
    function mul(x,y) {
      return x * y;
    }
    
    exports.add = add;  //add関数を他のモジュールから使えるようにexportします。
    exports.mul = mul;  //mull関数を ・・・
  
  ■ モジュールを読む側のコード sample.js
    var smath = require('./smath');	// このコードと同じフォルダーにあるモジュールをロード
    
    alert( smath.add(10, 20) );   // 30
    alert( smath.mul(10, 20) );   // 200
    
    //=別バージョン=
    var {add, mul} = require('./smath');	// このコードと同じフォルダーにあるモジュールをロード
    
    alert( add(10, 20) );   // 30
    alert( mul(10, 20) );   // 200
参照

moduleModule...

モジュール情報

module : Object

解説
moduleは実行中のモジュールの情報を含んだオブジェクトです。
各モジュールのmoduleは異なるオブジェクトであり、外部公開しない限り他のモジュールから参照できません。ただし、メイン(Scriptスタートモジュールの)moduleオブジェクトはrequire.mainで参照できます。

例
  モジュールがメイン(Scriptスタート)モジュールかどうかの判定

    if (module==require.main) {
      // このモジュールはメインモジュールである
      // ・・・
    }

module.exports Module...

exportしたい変数や関数をプロパティにセットする

module.exports : Object

解説
module.exportsはモジュールとして読み込まれる側のコードにおいて、外部に公開したい関数やデータをmodule.exportsオブジェクトのプロパティにセットします。
各モジュールのmodule.exportsは異なるオブジェクトであり、このモジュールを読む側のコードのrequire関数の返値はこのmodule.exportsオブジェクトです。

モジュール内のローカル変数 exportsは モジュール実行直前にmodule.exportsオブジェクトがセットされ、exportのコードを簡略にしています。

例
  ■ モジュールとして読み込まれる側のコード smath.js
    // smath.js  exportsオブジェクトを関数に変更する例
    exports = module.exports = function() { alert("I am a smath-module."); }
    
    function add(x,y) {
      return x + y;
    }
    function mul(x,y) {
      return x * y;
    }
    
    module.exports.add = add;  //add関数を他のモジュールから使えるようにexportします。
    module.exports.mul = mul;  //mull関数を ・・・
  
  ■ モジュールを読む側のコード sample.js
    var smath = require('./smath');	// このコードと同じフォルダーにあるモジュールをロード
    
    alert( smath.add(10, 20) );   // 30
    alert( smath.mul(10, 20) );   // 200
    
    smath();  // I am a smath-module.
参照

module.filenameModule...

モジュールのフルパス名

module.filename : String

解説
module.filenameは実行中のモジュールのフルパス名です。

例
  ■ モジュールとして読み込まれる側でフルパス名を表示
    // smath.js
    function add(x,y) {
      return x + y;
    }
    function mul(x,y) {
      return x * y;
    }
    
    exports.add = add;  //add関数を他のモジュールから使えるようにexportします。
    exports.mul = mul;  //mull関数を ・・・

    alert(module.filename);  // d:\work\smath.js
参照

module.idModule...

モジュールの識別子

module.id : String

解説
module.idは実行中のモジュールの識別子です。
現在の仕様では
  file://モジュールのフルパス名
となっています。(将来変更される可能性あり)

例
  ■ モジュールとして読み込まれる側で識別子を表示
    // smath.js
    function add(x,y) {
      return x + y;
    }
    function mul(x,y) {
      return x * y;
    }
    
    exports.add = add;  //add関数を他のモジュールから使えるようにexportします。
    exports.mul = mul;  //mull関数を ・・・

    alert(module.id);  // file://d:\work\smath.js

require 関数 Module...

ファイルモジュールをロード

require( modulename ) : Object

引数
modulename : String
モジュール名
"./" または "../"で始まるモジュール名は 現在実行中モジュールのフォルダーからの相対パス名となります。
それ以外から始まるモジュール名はOgOの指定パス順序でモジュールをサーチします。(参照:Core JavaScript load関数 解説)
返値
引数のモジュール内のexportsオブジェクトを返します。
解説

require関数を使ったモジュールロードは、「名前空間の衝突」を避けます。 さらに、ロードは最初の1回のみで次回からのrequire関数呼出はモジュールのロードされずシステムキャッシュに保存された exportsオブジェクトを返します。


例
  ■ モジュールを読む側のコード
    var smath = require('./smath');	// このコードと同じフォルダーにあるモジュールをロード
    
    alert( smath.add(10, 20) );   // 30
    alert( smath.mul(10, 20) );   // 200
    
    //=別バージョン=
    var {add, mul} = require('./smath');	// このコードと同じフォルダーにあるモジュールをロード
    
    alert( add(10, 20) );   // 30
    alert( mul(10, 20) );   // 200

    //OgOの指定パス順序でモジュールをサーチ
    var {WScript} = require("wsh");
    var excel = WScript.CreateObject("Excel.Application");
    excel.Visible = true;

require.mainModule...

メインモジュール

require.main : Object

解説
require.mainはメイン(Scriptスタートモジュールの)moduleです。
requireは各モジュールの関数であることから、各モジュールはメインモジュールを知ることができます。

例
  モジュールがメイン(Scriptスタート)モジュール)かどうかの判定

    if (module==require.main) {
      // このモジュールはスタートモジュールである
      // ・・・
    }

__dirnameModule...

現在実行されているスクリプトのディレクトリ

__dirname : String

参照

__filenameModule...

現在実行されているスクリプトのフルパス名

__filename : String

解説
module.filenameと同じ内容です。
参照

Path モジュール...

Pathは、ファイルパスを扱うモジュールです。

このモジュールを使うには、最初にrequire関数でモジュールをロードします。

var Path = require('path');
print( Path.basename("d:\\work\\test.dat") ); // test.dat

定数
sepファイルセパレータ
delimiter環境変数Path内の区切り
関数
normalizeパス名を正規化
join文字列を結合してパス名を作成
resolve絶対パスを作成する
isAbsolute絶対パスかどうかを判定
dirnameディレクトリ名を取得
basenameファイル名を取得
extname拡張子を取得
parseファイルパスの各部分を取得

sep 定数JS1.0Path...

プラットフォーム固有のファイルセパレータ。 '\\' または '/'。

Path.sep : String

解説
プラットフォームがWindowならば、'\\'。
そのプラットフォームでは、'/'。
var Path = require('path');

'foo\\bar\\baz'.split(Path.sep);  // ['foo', 'bar', 'baz']

delimiter 定数JS1.0Path...

プラットフォーム固有の環境変数内のパス区切り文字、';' または ':'

Path.delimiter : String

解説
プラットフォームがWindowならば、';'。
そのプラットフォームでは、':'。

normalize 関数JS1.0Path...

パス名を正規化する。
"/"は"\"に変更し、".", ".."があればディレクトリ位置修正します。

Path.normalize( pathname ) : String

引数
pathname : String
パス名
返値
正規化したパス名を返します。
".."があれば、親ディレクトリを1つ上がります。ただし、pathnameが相対パスで親ディレクトリが不定となれば".."は変換されません。
var Path = require('path');

print( Path.normalize("d:\\work\\..\\t.dat") ); // d:\t.dat
print( Path.normalize("d:/work/../t.dat") ); // d:\t.dat
print( Path.normalize("..\\..\\t.dat") );    // ..\..\t.dat

join 関数Path...

文字列を結合してパス名を作成します。
得られたパス名は正規化します。

Path.join( [path1],[path2], [...] ) : String

引数
path1, path2, ... : String
結合する文字列
返値
separator "\"を使ってつなぎ、正規化したパス名を返します。
var Path = require('path');

print( Path.join("work", "t.dat") ); // work\t.dat
print( Path.join("d:\\work", "..", "t.dat") ); // d:\t.dat

resolve 関数Path...

絶対パスを作成します。
toの前に fromをseparator "\"でつないで絶対パスを作成します。

Path.resolve( [from ...], to ) : String

引数
from, ... : String
引数 toの前につなぐ文字列。
from ...引数の右から左の順につなぎます。
to : String
絶対パス化したい文字列。
返値
toの前に from ...引数を右から左へ順に separator "\"でつないで絶対パス化します。
絶対パスになったところで終了し、正規化したパス名を返します。
絶対パスにならなければ、先頭にカレントディレクトリ名をつなげます。
var Path = require('path');

print( Path.resolve("d:\\work", "test", "temp", "..", "t.dat") ); // d:\work\test\t.dat
print( Path.resolve("work", "test", "..", "t.dat") ); // d:\work\t.dat

isAbsolute 関数Path...

絶対パスかどうかを判定します。

Path.isAbsolute( path ) : Boolean

引数
path : String
パス名。
返値
pathが絶対パスであれば、trueを返します。
そうでなければ、falseを返します。
var Path = require('path');

print( Path.isAbsolute("d:\\work\\test.dat") ); // true
print( Path.isAbsolute("work\\test.dat") ); // false

dirname 関数Path...

ディレクトリ名を取得します。

Path.dirname( path ) : String

引数
path : String
パス名。
返値
パス名から取り出したディレクトリ名を返します。
var Path = require('path');

print( Path.dirname("d:\\work\\test.dat") ); // d:\work
print( Path.dirname("work\\..\\test.dat") ); // work\..\test.dat

basename 関数Path...

ファイル名を取得します。

Path.basename( path ) : String

引数
path : String
パス名。
返値
パス名から取り出したファイル名を返します。
var Path = require('path');

print( Path.basename("d:\\work\\test.dat") ); // test.dat
print( Path.basename("work\\..\\test.dat") ); // test.dat

extname 関数Path...

拡張子を取得します。

Path.extname( path ) : String

引数
path : String
パス名。
返値
パス名から取り出した拡張子を返します。(拡張子をもてば 先頭が"."である文字列です)
var Path = require('path');

print( Path.extname("d:\\work\\test.dat") ); // .dat
print( Path.extname("work\\..\\test") ); // 空文字列

parse 関数Path...

ファイルパスの各部分を取得します。

Path.parse( path ) : Object

引数
path : String
パス名。
返値
オブジェクト
{dir:ディレクトリ名, root:パスルート名, base:ファイル名, name:拡張子を除いたファイル名, ext:拡張子}
を返します。
  var Path = require('path');
  var ans = Path.parse("d:\\work\\test.dat"); 
  print( ans.dir ); // d:\work
  print( ans.root ); // d:\
  print( ans.base ); // test.dat
  print( ans.name ); // test
  print( ans.ext ); // .dat