nodejsの中でexportsとmodule.exportsの実践
14155 ワード
nodejsに自分のファイルモジュールを書くと、module.exportとexportsの使用に出会います.他の人のコードを見ると、「module.export=exports=<対象/関数など>」という変な直列の使い方が多く使われます.理由を聞くと、雲の中の霧の中にあるようです.
このような問題はソースコードを見る以外に、コードを書いて検証するしかないです.
二つのモジュールファイルを書きました.プロバイダー.jsは任意の種類のオブジェクトを生成します. customer.jsはproviderオブジェクトを返して出力します.
第一の場合:
provider.jsは、直接exportsに任意の種類のオブジェクトを設定します.
第二の場合:
provider.jsは、exportのために任意のタイプの属性を設定します.
customer.jsを実行した結果:
第三の場合:
provider.jsは、exportの任意のタイプの属性を設定し、module.exportsの同名または同名でない任意のタイプの属性を設定します.
customer.jsを実行した結果:
第四の場合:
provider.jsは、exportのためにどのようなタイプの属性を設けても、直接module.exportsのために任意の種類のオブジェクトを設定します.
customer.jsを実行した結果:
上記の四つの実践結果から見て:
requireはmodule.exportsを返します.module.exportには関数、オブジェクトのインスタンス、基本タイプの変数などを設定できます.したがって、モジュールの随所にmodule.exportsがあります.
exportsをモジュールとして返す場合は、属性を設定し、module.exportに同名の属性を設定しないでください.
end
^-^
このような問題はソースコードを見る以外に、コードを書いて検証するしかないです.
二つのモジュールファイルを書きました.プロバイダー.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.jsvar 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
^-^