Node.js モジュールで次の契約を見つけました。
module.exports = exports = nano = function database_module(cfg) {...}
module.exports
との違いは何でexports
、なぜここで両方が使われているのか疑問に思います。
ベストアンサー1
この質問はずっと前に回答され、受け入れられていますが、私は自分の意見を述べたいと思います。
ファイルの先頭には次のような内容が含まれていると想像できます (説明のため)。
var module = new Module(...);
var exports = module.exports;
module.exports
したがって、何をするにしても、他の場所からそのモジュールを要求するときに、モジュールからおよび NOTexports
が返されることを覚えておいてください。
したがって、次のようなことを行うと:
exports.a = function() {
console.log("a");
}
exports.b = function() {
console.log("b");
}
a
2 つの関数とを、b
が指すオブジェクトに追加しているのでmodule.exports
、typeof
返される結果は次のようになりますobject
。{ a: [Function], b: [Function] }
もちろん、module.exports
この例で の代わりにを使用した場合も、同じ結果が得られますexports
。
これは、 をエクスポートされた値のコンテナのように動作させたい場合ですmodule.exports
。一方、コンストラクター関数のみをエクスポートしたい場合は、module.exports
または の使用について知っておくべきことがあります。何かを要求すると ではなく が返されるexports
ことを思い出してください。module.exports
exports
module.exports = function Something() {
console.log('bla bla');
}
これで、typeof
結果が返されるよう'function'
になり、それを require して次のようにすぐに呼び出すことができます。
var x = require('./file1.js')();
これは、返される結果を関数として上書きするためです。
ただし、exports
次のようなものは使用できません:
exports = function Something() {
console.log('bla bla');
}
var x = require('./file1.js')(); //Error: require is not a function
exports
の場合、参照は が指すオブジェクトを指さなくなるため、とmodule.exports
の間にはもはや関係がありません。この場合、は返される空のオブジェクトをまだ指しています。exports
module.exports
module.exports
{}
別のトピックからの受け入れられた回答も役立つはずです:JavaScript は参照渡しされますか?