Node.jsでのModule.exportsおよびexport

この記事の翻訳元:module.exportsとNode.jsのエクスポート

Node.jsモジュールで次のコントラクト 見つけました。Node.jsモジュールで次のコントラクト見つけました

module.exports = exports = nano = function database_module(cfg) {...}

ワンダーで異なることはI BETWEENいただきましたmodule.exportsし、exports両方なぜここで使用されている壁紙。 私には何の違いを知らないmodule.exportsexports、ここで使用されている理由を。


#1階

リファレンス:module-exportsとhttps://stackoom.com/question/TwlJ/Node-jsでのエクスポート


#2F

このリンクは上記の質問への回答に役立ちましたこのリンクは上記の質問への回答に 役立ちました。

http://timnew.me/blog/2012/04/20/exports-vs-module-exports-in-node-js/ http://timnew.me/blog/2012/04/20/exports-vs- module-exports-in-node-js /

他の記事にモジュールを追加するノードにシステムがない システムのノードに追加モジュールは、他の投稿を行います

var exports = module.exports 

コードを実行する前 したがって、exports = fooを実行する場合、おそらくmodule.exports = exports = foo を実行する必要がありますが、exports.foo = fooを使用するのが適切です。exports= fooが必要な場合は、module.exports = exports = fooですが、exports.foo = fooを使用しても問題ありません。


#3階

基本的には、requireステートメントを介してモジュールが必要なときに実際に何が起こるかという答えがあり、 基本的にrequirerequire ステートメントモジュールを渡すときに実際に何が起こるかが答えです。モジュールが 必要なのはこれが初めてであり、モジュールが必要なのはこれが初めてであると想定します。

例: 例:

var x = require('file1.js');

file1.jsの内容:file1.jsの内容

module.exports = '123';

上記の文を実行するとModuleオブジェクトが作成され、上記の文を実行するとオブジェクトが作成 されModuleます。 そのコンストラクター関数は次のとおりです。 そのコンストラクターは次のとおりです。

function Module(id, parent) {
    this.id = id;
    this.exports = {};
    this.parent = parent;
    if (parent && parent.children) {
        parent.children.push(this);
    }

    this.filename = null;
    this.loaded = false;
    this.children = [];
}

お会いした各オブジェクトモジュールAS Aプロパティの名前でありexports あなたが見ることができるように、各モジュールのオブジェクトは、名前のために持っているexports財産を。 どのような最終的にこの一部として返されるのは、require これは最終的なものでrequire、戻りの一部。

requireの次のステップは、以下のようにfile1.jsのコンテンツを匿名関数にラップすることです 。次に示すように、require の次のステップは、file1.jsのコンテンツを匿名関数にラップすることです

(function (exports, require, module, __filename, __dirname) { 
    //contents from file1.js
    module.exports = '123;
});

匿名はこれが呼び出される機能と、次のように、moduleここに壁紙がで指しModuleオブジェクト以前に作成した。 そして、この無名関数は、次のように呼ばれてmodule、ここを指しModuleますが、以前に作成したオブジェクト。

(function (exports, require, module, __filename, __dirname) { 
    //contents from file1.js
    module.exports = '123;
}) (module.exports,require, module, "path_to_file1.js","directory of the file1.js");

機能、AS WE CANで確認インサイドexportsを指し仮引数module.exports 我々は関数の中で見てきたようにexports、正式なパラメータポイントmodule.exports 本質的には、これはモジュールプログラマーに提供される便利さ です本質的に、これはモジュールプログラマーに提供される便利さです。

ただし 、この便利さは慎重に実行する必要がありますが、この便利さには注意が必要です。 いずれにしても、エクスポートに新しいオブジェクトを割り当てようとする場合は、この方法で行ってください。 とにかく、エクスポートに新しいオブジェクトを割り当てようとする場合は、必ずこの方法を採用してください。

exports = module.exports = {};

私たちは道IT IFを以下でください間違った方法module.exportsウィルはまだオブジェクトモジュールのインスタンスで作成されたのAS一部であることを指すことによって。 私たちは場合は間違った方法を操作するmodule.exportsモジュールインスタンスの一部として作成されたオブジェクトを指します。

exports = {};

その結果、上記のexportsオブジェクトに何かを追加しても、module.exportsオブジェクトには影響がなく、requireの一部として何もエクスポートまたは返されません。 その結果、上記のexportオブジェクトに何かを追加しても、module.exportsオブジェクトは生成されません影響はなく、必要の一部としてエクスポートまたは返送されるものはありません。


#4F

まず、module.exports=exportsおよびでrequireオブジェクトに機能が戻るのA module.exportsを参照する。 まずmodule.exports=exportsrequireこの関数はオブジェクトを返しmodule.exports、オブジェクトへの参照。

WE IF 追加プロパティオブジェクトでの、言っexports.a=1た後module.exportsはと輸出は、まだ同じ、オブジェクトでを参照してください。 私たちがオブジェクトにある場合は、属性を追加するには、このようなexport.aなどを、exports.a=1、module.exportsは、輸出はまだ同じオブジェクトを参照してください。 したがって、requireを呼び出してモジュールを変数に割り当てると、変数のプロパティはaになり、その値は1になります。 したがって、requireを呼び出してモジュールを変数に割り当てると、変数の属性はaになり、その値は1になります。 ;

しかし、たとえばそれらの1つオーバーライドする場合exports=function(){}それらは異なります。エクスポートは新しいオブジェクトとモジュールを参照します。エクスポートは元のオブジェクトを参照します。 ただし、エクスポートなどの1つカバーする場合exports=function(){}、それらは現在異なりますOK:ポイントを新しいオブジェクトにエクスポートし、module.exportsは元のオブジェクトをポイントします。 また、ファイルが必要な場合、module.exportsは 新しいオブジェクトを参照しないため、新しいオブジェクトは返されませんファイルが必要な場合、module.exportsは新しいオブジェクトを参照しないため、新しいオブジェクトは返されません。

私にとっては、新しいプロパティを追加し続けるか、両方を新しいオブジェクトにオーバーライドします。 私にとっては、新しいプロパティを追加するか、それらをすべて新しいオブジェクトに上書きします。 1つをオーバーライドするだけでは正しくありません。1つをオーバーライドするだけでは正しくありません それmodule.exportsが本当のボスだということを覚えておいて ください。本当のボスであることを覚えておいてくださいmodule.exports


#5F

私はいくつかのテストを行っただけですが、nodejsのモジュールコード内では、次のようになります。 いくつかのテストを実行したところ、nodejsモジュールコードで次のようになります。

var module.exports = {};
var exports = module.exports;

so: so:

1: 1:

exports = function(){}; // this will not work! as it make the exports to some other pointer
module.exports = function(){}; // it works! cause finally nodejs make the module.exports to export.

2: 2:

exports.abc = function(){}; // works!
exports.efg = function(){}; // works!

3:しかし、この場合は 3:この場合は

module.exports = function(){}; // from now on we have to using module.exports to attach more stuff to exports.
module.exports.a = 'value a'; // works
exports.b = 'value b'; // the b will nerver be seen cause of the first line of code we have do it before (or later)

#6階

ノードjsのmodule.jsファイルは、module.load systemを実行するために使用されます。ノードがファイルを実行するたびに、jsファイルのコンテンツを次の ノードとしてラップします。ノードjsのmodule.jsファイルは、module.loadシステムを実行するために使用されます。ノードがファイルを実行するたびに、次のようにjsファイルのコンテンツをラップします

'(function (exports, require, module, __filename, __dirname) {',+
     //your js file content
 '\n});'

このur jsソースコード内でのラッピングにより、エクスポート、要求、モジュールなどにアクセスできます。jsファイルに別の機能を書き込む他の方法がないため、この方法が使用されます。 このパッケージはur jsソースコードにあるため、そのため、エクスポート、要求、モジュールなどにアクセスできます。jsファイルに記述された関数を別のファイルにコピーする方法が他にないため、この方法が使用されます。

次に、ノードは c ++を使用してこのラップされた関数を実行し、ノードはc ++を使用してこのラップされた関数を実行しますその時点で、この関数に渡されたエクスポートオブジェクトが入力され ます。

この関数のパラメーターのエクスポートとモジュールの内部を見ることができますこの関数のパラメーターのエクスポートとモジュールの内部を見ることができ ます 実際、exportsはモジュールコンストラクター関数のパブリックメンバーですが、exportsはモジュールコンストラクター関数のパブリックメンバーです

以下のコードを見て 、以下のコードを見て

b.jsがにこのコードをコピー b.js内のコードをコピー

console.log("module is "+Object.prototype.toString.call(module));
console.log("object.keys "+Object.keys(module));
console.log(module.exports);
console.log(exports === module.exports);
console.log("exports is "+Object.prototype.toString.call(exports));
console.log('----------------------------------------------');
var foo = require('a.js');
console.log("object.keys of foo: "+Object.keys(foo));
console.log('name is '+ foo);
foo();

a.jsがにこのコードをコピー a.jsにこのコードをコピー

exports.name = 'hello';
module.exports.name = 'hi';
module.exports.age = 23;
module.exports = function(){console.log('function to module exports')};
//exports = function(){console.log('function to export');}

今ノードを使用して実行し 、今実行しているノードを使用して

これは出力され 出力されます

module is [object Object]
object.keys id,exports,parent,filename,loaded,children,paths
{}
true

exports is [object Object] exports is [object Object]

fooのobject.keys:name is function(){console.log( 'function to module exports')} function to module exports fooのobject.keys:名前がfunction(){console.log( 'function to module导out' )}関数からモジュールへのエクスポート

ここで、a.jsのコメント行を削除し、その行より上の行をコメント化し、b.jsの最後の行を削除して実行します。 次に、a.jsのコメント行を削除し、その行より上の行をコメント化して、b 削除します。 jsとrunの最後の行。

JavaScriptの世界では、パラメーターとして渡されたオブジェクトを再割り当てすることはできませんが、その関数のオブジェクトがパラメーターとして別の関数に設定されている場合は、関数のパブリックメンバーを変更できます 。JavaScriptの世界では、パラメーターとして渡されたオブジェクトを再割り当てできませんが、関数がオブジェクトが別の関数のパラメーターとして設定されている場合、関数のパブリックメンバーを変更できます

覚えていますか 覚えて

requireキーワードを使用して関数を取得したい場合に のみ module.exports を使用しますrequireキーワードを使用して関数を取得したい場合にのみmodule.exports を使用します。上記の例ではvar foo = require(a.js); 上記の例では、var foo = require(a.js); fooを関数として呼び出す ことができます; fooを使用できることがわかります関数として呼び出されます。

これは、ノードのドキュメントがそれを説明する方法です。「エクスポートオブジェクトはモジュールシステムによって作成されます。これは受け入れられない場合があります。多くの場合、モジュールをあるクラスのインスタンスにしたいです。これを行うには、目的のエクスポートオブジェクトをmodule.exportsに割り当てます。」 これはノードのドキュメントで説明されている方法です:「エクスポートオブジェクトはモジュールシステムによって作成されます。これは受け入れられない場合があり、多くの人々はモジュールをクラスのインスタンスにしたいと考えています。これには、必要なエクスポートオブジェクトをモジュールに割り当ててください.exports。 "

元の記事を0件公開 75 件を賞賛 56万回の閲覧+

おすすめ

転載: blog.csdn.net/w36680130/article/details/105484246