Node.js の「module.exports」と「exports」の違いを調べる
Node.js モジュール システムでは、 2 つの注目すべき変数は、「module.exports」と「exports」です。これらは互換性があるように見えますが、効果的なモジュール開発にはそれらのニュアンスを理解することが重要です。
提供された質問に記載されているコントラクトについて考えてみましょう。
module.exports = exports = nano = function database_module(cfg) {...}
この構文では、次のような疑問が生じます。 「module.exports」と「exports」の違い、そしてなぜ両方が使用されるのですか?
これを解明するにはパズルのように、すべてのモジュールが次の行で始まると想像してみましょう:
var module = new Module(...); var exports = module.exports;
本質的に、「module.exports」と「exports」は最初は同じオブジェクトを指します。 「exports」に値を割り当てると、実際には「module.exports」が参照するオブジェクトを変更することになります。
コントラクトの例では、まず「安全な」アプローチを検討してみましょう。
// Using module.exports module.exports.a = function() { console.log('a'); } module.exports.b = function() { console.log('b'); }
ここで、「安全」とは、「module.exports」がエクスポートされた関数を含むオブジェクトのままであることを意味します。このモジュールを必要とする場合、このオブジェクトを取得します。
ただし、'exports' への割り当ては「危険」になる可能性があります:
// Using exports exports.a = function() { console.log('a'); } exports.b = function() { console.log('b'); }
一方、'module.exports' と 'exports' の両方最初は同じオブジェクトを指しており、「exports」に直接代入すると、その参照が壊れます。結果として、「module.exports」は引き続き空のオブジェクト {} を指します。これは、モジュールが必要なときに返されます。
コンストラクター関数を「module.exports」に割り当てると、 「エクスポート」の場合とは異なる意味があります:
// Assigning constructor to module.exports module.exports = function Something() { console.log('bla bla'); }
この場合、返される結果の「typeof」は次のようになります。 '関数。'これにより、モジュールを関数として直接要求して呼び出すことができます。
ただし、コンストラクターを 'exports' に割り当てても同じ効果はありません。
// Assigning constructor to exports exports = function Something() { console.log('bla bla'); }
'exports を再割り当てすると、 ' 「module.exports」とコンストラクター関数の間の接続を切断し、「module.exports」を空のままにします。 object.
結論として、効果的な Node.js モジュールを開発するには、「module.exports」と「exports」の微妙な違いを理解することが不可欠です。両方の変数は最初は同じオブジェクトを指しますが、「module.exports」はエクスポートされたオブジェクトを一貫して指すため、モジュールから値をエクスポートする正式な方法であると考える必要があります。一方、「エクスポート」は、エクスポートされたオブジェクトを直接変更する必要がある場合、またはコンストラクター関数を割り当てる場合に便利です。
以上がNode.js の「module.exports」と「exports」の違いは何ですか?なぜ両方とも使用されるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。