まずはその違いから
1.exports = module.exports = {};
2.exportsはmodule.exportsへの参照です。
3. module.exportsの初期値は空のオブジェクト{}なので、exportsの初期値も{}です。
4. requireはモジュールを参照し、exportsの代わりにmodule.exportsを返します!!!!
5. exports.xxxは、呼び出されたモジュールから直接見えるように、エクスポートされたオブジェクトのプロパティをぶら下げることと同じです。
6. exports = exportsオブジェクトを再割り当てすることと同じです。このモジュールがクラスである場合、呼び出し元がクラスのコンストラクタであり、新しいインスタンスを直接生成できるように、module.exportsを直接割り当てる必要があります。
もう一度例を。
例1:
var name = 'rainbow';
exports.name = name;
exports.sayName = function(){
console.log(name);
}
// 輸出に値を割り当てることは、輸出に値を割り当てることと同じである。 module.exports この空のオブジェクトは、等価な2つのプロパティを追加する:
var name = 'rainbow';
module.exports.name = name;
module.exports.sayName = function(){
console.log(name);
}
例2:
exports = module.exports = somethings
//
module.exports = somethings
exports = module.exports
// module.exports = somethings mudole.exports オーバーライドが実行され、その時点で module.exports 輸出との関係は破綻している。mudole.exports は新しいメモリブロックを指し、エクスポートは元のブロックを指す。 module.exports 輸出もまた、同じメモリー、あるいは同じ" "以上 exports = module.exports.
例3:
exports = function(){};
// これは輸出に値を再割り当てしている。 module.exports この2つには何の関連性もない。
例4:
module.exports.something = function(){};
exports.something = function(){};
// 上の2つの方程式は等価である
例5が最も重要です:
// index.js
var something = require('./requireMe');
something();
// requireMe.js
exports.something = function(){
console.log('am a function');
}
// 上記のコードではエラーが発生する。 module.exports これはオブジェクトであり、直接実行することはできない
//修正モード1
// requireMe.js
module.exports = function(){
console.log('am a function');
}
// コードを上記のように変更しても、エラーは報告されない。 module.exports は関数で、直接実行できる。
// 修正モード2
// index.js
var something = require('./requireMe');
something.something();
// 最も重要なのは、必要とするオブジェクトがsomething属性を持つオブジェクトであることだ。