nodejsの中でexportsとmodule.exportsの実践

14155 ワード

nodejsに自分のファイルモジュールを書くと、module.exportとexportsの使用に出会います.他の人のコードを見ると、「module.export=exports=<対象/関数など>」という変な直列の使い方が多く使われます.理由を聞くと、雲の中の霧の中にあるようです.
このような問題はソースコードを見る以外に、コードを書いて検証するしかないです.
二つのモジュールファイルを書きました.プロバイダー.jsは任意の種類のオブジェクトを生成します. customer.jsはproviderオブジェクトを返して出力します.
第一の場合:
provider.jsは、直接exportsに任意の種類のオブジェクトを設定します.
exports = {name:'kxh'}

/*exports = function(){

  console.log('kxh');

};

exports = 'kxh';*/



console.log('*******provider-module***********');

console.log(module);

console.log('*******provider-exports***********');

console.log(exports);
customer.js
var p = require('./provider');



console.log('*******customer-result***********');

console.log(p);
customer.jsを実行した結果:
*******provider-module***********

{ id: 'D:\\ProgramDemos\\Web\
odejs\\TestNode\\provider.js', exports: {}, parent: { id: '.', exports: {}, parent: null, filename: 'D:\\ProgramDemos\\Web\
odejs\\TestNode\\customer.js', loaded: false, children: [ [Circular] ], paths: [ 'D:\\ProgramDemos\\Web\
odejs\\TestNode\
ode_modules', 'D:\\ProgramDemos\\Web\
odejs\
ode_modules', 'D:\\ProgramDemos\\Web\
ode_modules', 'D:\\ProgramDemos\
ode_modules', 'D:\
ode_modules' ] }, filename: 'D:\\ProgramDemos\\Web\
odejs\\TestNode\\provider.js', loaded: false, children: [], paths: [ 'D:\\ProgramDemos\\Web\
odejs\\TestNode\
ode_modules', 'D:\\ProgramDemos\\Web\
odejs\
ode_modules', 'D:\\ProgramDemos\\Web\
ode_modules', 'D:\\ProgramDemos\
ode_modules', 'D:\
ode_modules' ] } *******provider-exports*********** { name: 'kxh' } *******customer-result*********** {}
結果から見て、直接exportsに任意のタイプのオブジェクトを設定しても、requireに呼び出されるモジュールに戻りません.requireはmodule.exportsの空きオブジェクトを返します.
 
第二の場合:
provider.jsは、exportのために任意のタイプの属性を設定します.
exports.name = {firstName:'xh', lastName:'k'};

//exports.name = "kxh";

/*exports.printName = function(){

  console.log("kxh");

};*/



console.log('*******provider-module***********');

console.log(module);

console.log('*******provider-exports***********');

console.log(exports);
customer.jsは変わりません.
customer.jsを実行した結果:
*******provider-module***********

{ id: 'D:\\ProgramDemos\\Web\
odejs\\TestNode\\provider.js', exports: { name: { firstName: 'xh', lastName: 'k' } }, parent: { id: '.', exports: {}, parent: null, filename: 'D:\\ProgramDemos\\Web\
odejs\\TestNode\\customer.js', loaded: false, children: [ [Circular] ], paths: [ 'D:\\ProgramDemos\\Web\
odejs\\TestNode\
ode_modules', 'D:\\ProgramDemos\\Web\
odejs\
ode_modules', 'D:\\ProgramDemos\\Web\
ode_modules', 'D:\\ProgramDemos\
ode_modules', 'D:\
ode_modules' ] }, filename: 'D:\\ProgramDemos\\Web\
odejs\\TestNode\\provider.js', loaded: false, children: [], paths: [ 'D:\\ProgramDemos\\Web\
odejs\\TestNode\
ode_modules', 'D:\\ProgramDemos\\Web\
odejs\
ode_modules', 'D:\\ProgramDemos\\Web\
ode_modules', 'D:\\ProgramDemos\
ode_modules', 'D:\
ode_modules' ] } *******provider-exports*********** { name: { firstName: 'xh', lastName: 'k' } } *******customer-result*********** { name: { firstName: 'xh', lastName: 'k' } }
その結果、exportに任意のタイプの属性を設定し、module.exportは同期を維持し、requireに戻ることができます.
 
第三の場合:
provider.jsは、exportの任意のタイプの属性を設定し、module.exportsの同名または同名でない任意のタイプの属性を設定します.
exports.name = {firstName:'xh', lastName:'k'};

//exports.name = "kxh";

/*exports.printName = function(){

  console.log("kxh");

};*/

//module.exports.name = {firstName:'wf', lastName:'z'};

module.exports.mail = "[email protected]";



console.log('*******provider-module***********');

console.log(module);

console.log('*******provider-exports***********');

console.log(exports);
customer.jsは変わりません.
customer.jsを実行した結果:
*******provider-module***********

{ id: 'D:\\ProgramDemos\\Web\
odejs\\TestNode\\provider.js', exports: { name: { firstName: 'xh', lastName: 'k' }, mail: '[email protected]' }, parent: { id: '.', exports: {}, parent: null, filename: 'D:\\ProgramDemos\\Web\
odejs\\TestNode\\customer.js', loaded: false, children: [ [Circular] ], paths: [ 'D:\\ProgramDemos\\Web\
odejs\\TestNode\
ode_modules', 'D:\\ProgramDemos\\Web\
odejs\
ode_modules', 'D:\\ProgramDemos\\Web\
ode_modules', 'D:\\ProgramDemos\
ode_modules', 'D:\
ode_modules' ] }, filename: 'D:\\ProgramDemos\\Web\
odejs\\TestNode\\provider.js', loaded: false, children: [], paths: [ 'D:\\ProgramDemos\\Web\
odejs\\TestNode\
ode_modules', 'D:\\ProgramDemos\\Web\
odejs\
ode_modules', 'D:\\ProgramDemos\\Web\
ode_modules', 'D:\\ProgramDemos\
ode_modules', 'D:\
ode_modules' ] } *******provider-exports*********** { name: { firstName: 'xh', lastName: 'k' }, mail: '[email protected]' } *******customer-result*********** { name: { firstName: 'xh', lastName: 'k' }, mail: '[email protected]' }
その結果、同名の属性が設定されていない場合は、module.exportに統合して返します.同名の属性であれば、requireはすべてmodule.exportsに戻ります.
 
第四の場合:
provider.jsは、exportのためにどのようなタイプの属性を設けても、直接module.exportsのために任意の種類のオブジェクトを設定します.
exports.name = {firstName:'xh', lastName:'k'};

//exports.name = "kxh";

/*exports.printName = function(){

  console.log("kxh");

};*/



//module.exports = {name:'kxh'};

module.exports = function(){

  console.log('kxh');

};



console.log('*******provider-module***********');

console.log(module);

console.log('*******provider-exports***********');

console.log(exports);
customer.jsは変わりません.
customer.jsを実行した結果:
*******provider-module***********

{ id: 'D:\\ProgramDemos\\Web\
odejs\\TestNode\\provider.js', exports: [Function], parent: { id: '.', exports: {}, parent: null, filename: 'D:\\ProgramDemos\\Web\
odejs\\TestNode\\customer.js', loaded: false, children: [ [Circular] ], paths: [ 'D:\\ProgramDemos\\Web\
odejs\\TestNode\
ode_modules', 'D:\\ProgramDemos\\Web\
odejs\
ode_modules', 'D:\\ProgramDemos\\Web\
ode_modules', 'D:\\ProgramDemos\
ode_modules', 'D:\
ode_modules' ] }, filename: 'D:\\ProgramDemos\\Web\
odejs\\TestNode\\provider.js', loaded: false, children: [], paths: [ 'D:\\ProgramDemos\\Web\
odejs\\TestNode\
ode_modules', 'D:\\ProgramDemos\\Web\
odejs\
ode_modules', 'D:\\ProgramDemos\\Web\
ode_modules', 'D:\\ProgramDemos\
ode_modules', 'D:\
ode_modules' ] } *******provider-exports*********** { name: { firstName: 'xh', lastName: 'k' } } *******customer-result*********** [Function]
その結果、exportのために会社のどのタイプの属性を設けても、直接module.exportsのために任意のタイプのオブジェクトを設定したら、requireはすべてmodule.exportsに戻ります.
 
上記の四つの実践結果から見て:
requireはmodule.exportsを返します.module.exportには関数、オブジェクトのインスタンス、基本タイプの変数などを設定できます.したがって、モジュールの随所にmodule.exportsがあります.
exportsをモジュールとして返す場合は、属性を設定し、module.exportに同名の属性を設定しないでください.
 
end
^-^