Node.js の module.exports と exports の違い 質問する

Node.js の module.exports と exports の違い 質問する

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");
}

a2 つの関数とを、bが指すオブジェクトに追加しているのでmodule.exportstypeof返される結果は次のようになりますobject{ a: [Function], b: [Function] }

もちろん、module.exportsこの例で の代わりにを使用した場合も、同じ結果が得られますexports

これは、 をエクスポートされた値のコンテナのように動作させたい場合ですmodule.exports。一方、コンストラクター関数のみをエクスポートしたい場合は、module.exportsまたは の使用について知っておくべきことがあります。何かを要求すると ではなく が返されるexportsことを思い出してください。module.exportsexports

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の間にはもはや関係がありません。この場合、は返される空のオブジェクトをまだ指しています。exportsmodule.exportsmodule.exports{}

別のトピックからの受け入れられた回答も役立つはずです:JavaScript は参照渡しされますか?

おすすめ記事