はじめに
皆さん。こんにちは! DreamHanksのエルムです。
今回はNode.jsのExportモジュールについて説明していきます。
前回の記事は[第3回] Node.jsのモジュールです。
ここでは、module.exportsを使って、異なるタイプをモジュールとして公開する方法を学びます。
module.exportsは、Node.jsアプリケーションのすべてのJavaScriptファイルにデフォルトで含まれている特別なオブジェクトです。moduleは現在のモジュールを表す変数で、exportsはモジュールとして公開されるオブジェクトです。つまり、module.exportsに割り当てたものは、モジュールとして公開されることになります。
それでは、module.exportsを使って、異なるタイプをモジュールとして公開する方法を見てみましょう。
エクスポートリテラル
前述の通り、exportsはオブジェクトです。つまり、割り当てたものをモジュールとして公開するのです。例えば、文字列リテラルを割り当てると、その文字列リテラルがモジュールとして公開されます。
以下の例では、Message.jsで単純な文字列messageをモジュールとして公開しています。
Message.js:
1 |
module.exports = 'Hello DreamHanks'; |
このメッセージモジュールをインポートして、以下のように使用します。
app.js:
1 2 3 |
var msg = require('./Messages.js'); console.log(msg); |
上記の例を実行して、以下のような結果を確認してください。
1 2 |
C:\> node app.js Hello DreamHanks |
ローカルモジュールをインポートするには、ルートフォルダのパスとして./を指定する必要があります。ただし、Node.jsのコアモジュールやNPMモジュールをインポートする際には、require()関数にパスを指定する必要はありません。
エクスポートオブジェクト
エクスポートはオブジェクトです。そのため、プロパティやメソッドを添付することができます。次の例では、Message.jsファイルの中で、文字列プロパティを持つオブジェクトをexportしています。
Message.js:
1 2 3 4 5 |
exports.SimpleMessage = 'Hello DreamHanks'; //or module.exports.SimpleMessage = 'Hello DreamHanks'; |
上の例では、exportsオブジェクトにSimpleMessageというプロパティを付けています。それでは、以下のようにこのモジュールをインポートして使ってみましょう。
app.js:
1 2 3 |
var msg = require('./Messages.js'); console.log(msg.SimpleMessage); |
上の例では、require()関数がオブジェクト { SimpleMessage : ‘Hello DreamHanks’} を返し、それを msg 変数に代入しています。これで、msg.SimpleMessageを使用できるようになりました。
コマンドプロンプトでnode app.jsと記述して上記の例を実行すると、以下のような出力が得られます。
1 2 |
C:\> node app.js Hello DreamHanks |
上記と同様に、オブジェクトを関数付きで公開することができます。次の例では,log関数を持つオブジェクトをモジュールとして公開しています.
Log.js:
1 2 3 |
module.exports.log = function (msg) { console.log(msg); }; |
上記のモジュールは、{ log : function(msg){ console.log(msg); }というオブジェクトを公開します。 上記のモジュールを以下のように使用します。
app.js:
1 2 3 |
var msg = require('./Log.js'); msg.log('Hello DreamHanks'); |
実行すると、コマンドプロンプトに以下のような出力が表示されます。
1 2 |
C:\> node app.js Hello DreamHanks |
以下のように、module.exportsにオブジェクトをアタッチすることもできます。
data.js:
1 2 3 4 |
module.exports = { firstName: 'Elmu', lastName: 'Bond' } |
app.js:
1 2 |
var person = require('./data.js'); console.log(person.firstName + ' ' + person.lastName); |
上記の例を実行して、以下のような結果を確認してください。
1 2 |
C:\> node app.js Elmu Bond |
エクスポートメソッド
以下のように、exportsオブジェクトに無名関数をアタッチすることができます。
Log.js:
1 2 3 |
module.exports = function (msg) { console.log(msg); }; |
上記のモジュールを使用すると、以下のようになります。
app.js:
1 2 3 |
var msg = require('./Log.js'); msg('Hello DreamHanks'); |
上の例では、変数 msg が関数式になります。そのため、括弧()を使って関数を呼び出すことができます。
上記の例を実行すると、以下のような出力が得られます。
1 2 |
C:\> node app.js Hello DreamHanks |
エクスポートクラス
JavaScriptでは、関数をクラスのように扱うことができます。次の例では、クラスのように使用できる関数を公開しています。
Person.js:
1 2 3 4 5 6 7 |
module.exports = function (firstName, lastName) { this.firstName = firstName; this.lastName = lastName; this.fullName = function () { return this.firstName + ' ' + this.lastName; } } |
上記のモジュールを使用すると、以下のようになります。
app.js:
1 2 3 4 5 |
var person = require('./Person.js'); var person1 = new person('Elmu', 'Bond'); console.log(person1.fullName()); |
newキーワードを使ってpersonオブジェクトを作成しています。
上記の例を実行すると、以下のようになります。
1 2 |
C:\> node app.js Elmu Bond |
このようにして、ルートフォルダーの下の別のファイルに作成されたローカルモジュールをエクスポートおよびインポートすることができます。
また、Node.jsでは、サブフォルダにモジュールを作成することができます。ここでは、サブフォルダからモジュールをロードする方法を説明します。
別フォルダのモジュールをロードする方法
module.exportsを使ってエクスポートしたモジュールファイルのフルパスを使用します。例えば、log.jsのlogモジュールが、アプリケーションのルートフォルダ下のユーティリティーフォルダに格納されている場合、以下のようにインポートします。
app.js:
1 |
var log = require('./utility/log.js'); |
上記の例では、“.”はルートフォルダを意味し、モジュールファイルの正確なパスを指定します。また、Node.jsでは、ファイル名を指定せずに、フォルダのパスを指定することができます。
例えば、以下のようにlog.jsを指定せずにユーティリティーフォルダのみを指定することができます。
app.js:
1 |
var log = require('./utility'); |
上記の例では、Node.jsはユーティリティーフォルダ内のpackage.jsonというパッケージ定義ファイルを検索します。これは、Nodeがこのフォルダをパッケージと仮定し、パッケージの定義を探そうとするためです。package.jsonファイルは、moduleディレクトリに置く必要があります。utilityフォルダ下のpackage.jsonでは、以下のようにmainキーでファイル名を指定します。
./utility/package.json:
1 2 3 4 |
{ "name" : "log", "main" : "./log.js" } |
これで、Node.jsはpackage.jsonのmainエントリを使ってlog.jsファイルを見つけ、それをインポートします。
package.jsonファイルが存在しない場合は、デフォルトでモジュールファイルとしてindex.jsファイルを探します。
終わりに
今回の記事は以上になります。
次回は [第5回]Node.js Webサーバを学びましょう。
ご覧いただきありがとうございます。
コメント