この記事の翻訳元:module.exportsとNode.jsのエクスポート
Node.jsモジュールで次のコントラクト を見つけました。Node.jsモジュールで次のコントラクトを見つけました。
module.exports = exports = nano = function database_module(cfg) {...}
ワンダーで異なることはI BETWEENいただきましたmodule.exports
し、exports
両方なぜここで使用されている壁紙。 私には何の違いを知らないmodule.exports
とexports
、ここで使用されている理由を。
#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
ステートメントを介してモジュールが必要なときに実際に何が起こるかという答えがあり、 基本的にrequire
require
、ステートメントモジュールを渡すときに実際に何が起こるかが答えです。モジュールが 必要なのはこれが初めてであり、モジュールが必要なのはこれが初めてであると想定します。
例: 例:
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=exports
、require
この関数はオブジェクトを返し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。 "