nodejsの中でexportsとmodule.exportsは違います。

3340 ワード

本文の英文リンク:http://www.hacksparrow.com/node-js-exports-vs-module-exports.html
nodejsモジュールのexportオブジェクトをよく知っています。モジュールで関数を作成できます。
exports.name = function() {
    console.log('My name is Lemmy Kilmister');
};
は他のファイルでこのように呼び出しられます。
var rocker = require('./rocker.js');
rocker.name(); // 'My name is Lemmy Kilmister'
ですが、module.exportsとは何ですか?もっと正式な使い方ですか?
実は、module.exportsは本当の使い方です。exportsはmodule.exportsの補助ツールです。あなたのモジュールが最終的に利用者に戻ったのはmodule.exportsではなく、exportsです。module.exportに値が存在しない場合、exportは属性を収集し、それらをmodule.exportに添付する。module.exportに既に属性がある場合、exportsは無視されます。
下のコードをロック.jsファイルに入れます。
module.exports = 'ROCK IT!';
exports.name = function() {
    console.log('My name is Lemmy Kilmister');
};
のもう一つの调节者のファイルの内容は以下の通りで、コードを実行します。
var rocker = require('./rocker.js');
rocker.name(); // TypeError: Object ROCK IT! has no method 'name'
ロックモジュールは、完全にexports.nameを無視して、「ROCK IT!」文字列だけを返します。これからもモジュールは必ず「モジュールインスタンス」ではないことが分かります。モジュールは、任意の合法的なJavaScriptオブジェクト-bollan、number、date、JSON、string、function、arrayなどでありうる。モジュールはmodule.exportsを設定するかどうかを問わない。module.exportsを明示的に設定していないと、exportsの属性はmodule.exportsに付加されて戻ってきます。
この場合、モジュールはクラスです。
module.exports = function(name, age) {
    this.name = name;
    this.age = age;
    this.about = function() {
        console.log(this.name +' is '+ this.age +' years old');
    };
};
はこのように使えます。
var Rocker = require('./rocker.js');
var r = new Rocker('Ozzy', 62);
r.about(); // Ozzy is 62 years old
この場合、モジュールは配列である。
module.exports = ['Lemmy Kilmister', 'Ozzy Osbourne', 'Ronnie James Dio', 'Steven Tyler', 'Mick Jagger'];
はこのように使えます。
var rocker = require('./rocker.js');
console.log('Rockin in heaven: ' + rocker[2]); //Rockin in heaven: Ronnie James Dio
以上より、モジュールを特定の対象としたい場合は、module.exportsを使用するという結論が得られます。モジュールを従来のモジュールの例としたい場合は、exportsを使用します。
module.exportに属性を付加した結果は似ています。たとえば:
module.exports.name = function() {
    console.log('My name is Lemmy Kilmister');
};
も同じです。
exports.name = function() {
    console.log('My name is Lemmy Kilmister');
};
しかし、注意が必要なのは、それらは一つのことではない。前にも述べたように、module.exportsは本尊です。exportは補助ツールだけです。とはいえ、モジュールオブジェクトのタイプを従来のモジュールから他のモジュールに変更する計画がない場合、exportは推奨の対象となります。
もしあなたがmodule.exportの対象に対して価値を与えていないなら、module.exportとexportsに添付した内容は使えます。
たとえば、あなたのモジュールにはこう書かれています。
module.exports.age = 68;
exports.name = 'Lemmy Kilmister';
以下のコードは正常に動作します。
var rocker = require('./rocker.js');
console.log('%s is %s', rocker.name, rocker.age); // Lemmy Kilmister is 68
しかし、もしあなたがmodule.exportsを賦課によってカバーしたら、コードの運行は失敗します。
module.exports = 'LOL';
module.exports.age = 68;
exports.name = 'Lemmy Kilmister';
または
module.exports.age = 68;
exports.name = 'Lemmy Kilmister';
module.exports = 'WTF';
は順序とは関係なく、ロック.ageとロック.nameを定義します。
また、module.exports.ageとexports.nameの両方が導出されているだけで、これは両者を結合して使用できるという意味ではない。私はexport.*を使うことを勧めます。module.exports.*。