情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでモジュールを作成する

2016/06/18

Node.jsではモジュールの単位はファイルです。すなわち、1つのJavaScriptファイルはNode.jsでは1つのモジュールとなります。

そのため、1つのJavaScriptファイルを作成した時点で、1つのモジュールを作成したということにもなります。

しかし、ただ単にJavaScriptファイルに処理を記述しただけではそれを他のJavaScriptファイルから参照したり、呼び出したりすることはできません。

なぜなら、単純にJavaScriptファイルの中で変数や関数を定義してもそれはそのファイル、あるいは、モジュールの中でローカルなものとなるからです(ただし、グローバルな変数や関数を定義する方法もあります。これに関しては「グローバル変数やグローバル関数を使用する」を参照してください)。

他のJavaScriptファイル、あるいは、モジュールから使用できるようにモジュールの変数や関数などを公開するにはmodule.exportsを使用しなければなりません。

module.exportsの値が、他のモジュールからrequire関数によりモジュールを読み込んだ際の関数の返り値となります。

また、module.exportsのデフォルト値は{}です。

そのため、module.exportsに変数や関数を追加するとその変数や関数はrequire関数の返り値を通して他のモジュールから使用することができるようになります。

module.exports.foo = 'xxx';
module.exports.bar = function () {
};

この場合、module.exportsの代わりにexportsを使用することもできます。

exports.foo = 'xxx';
exports.bar = function () {
};

つまり、exportsに変数や関数を追加するとmodule.exportsにもその変数や関数が追加されます。

これは単純にNode.jsの内部でvar exports = module.exports;というような処理がJavaScriptファイル、すなわち、モジュールが実行される前に行われているためです。

また、module.exportsに直接値を設定することもできます。

module.exports = 'xxx';

この場合、この値自体がrequire関数の返り値となり、他のモジュールから使用することができるようになります。

この場合、変数や関数を追加する場合とは異なり、module.exportsの代わりにexportsを使用することはできませんので注意してください。

これはexports = 'foo';などとしてもmodule.exportsの値には何の影響も与えないためです。

サンプルコード1

module.exportsに変数や関数を追加する例です。

module-exports-1-a.js

var b = require('./module-exports-1-b.js');

console.log(b.i);
b.print();

module-exports-1-b.js

module.exports.i = 100;
module.exports.print = function () {
    console.log('module b');
}

実行結果

C:\work\node>node module-exports-1-a.js
100
module b

サンプルコード2

module.exportsに直接値を設定する例です。

module-exports-2-a.js

var b = require('./module-exports-2-b.js');

console.log(b.i);
b.print();

module-exports-2-b.js

module.exports = {
    i: 100, 
    print: function () {
        console.log('module b');
    }
};

実行結果

C:\work\node>node module-exports-2-a.js
100
module b

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js