nodejsの中でexportsとmodule.exports
私は7日間の学会NodeJSのピットを見ましたが、同僚に質問されました.exportsとmodule.exportの違いは何ですか?初心者としては、よく分かりませんでした.テストをしたら、次のような結論が出ました.
まず、nodejsが起動したら、各ロードされたjsファイルのためにmoduleオブジェクトが発生します.(ここでは検証が必要です.関連文書を詳しく探していないので、目視結果だけです.)
app.jsファイルコード:
どうしましたかどうしましたか?完全に間違っていますよ.続けて直します.ap.js
foo.jsの正しい姿勢です.
exports = module.exports
でも大丈夫です.中には面白いものがたくさんあります.まず、nodejsが起動したら、各ロードされたjsファイルのためにmoduleオブジェクトが発生します.(ここでは検証が必要です.関連文書を詳しく探していないので、目視結果だけです.)
app.jsファイルコード:
console.log(module)
出力:{ id: '.',
exports: {},
parent: null,
filename: 'E:\
ode\\test\\app.js',
loaded: false,
children: [],
paths:
[ 'E:\
ode\\test\
ode_modules',
'E:\
ode\
ode_modules',
'E:\
ode\
ode\
ode_modules',
'E:\
ode\
ode_modules',
'E:\
ode_modules' ] }
これはapp.jsファイルから出力されたmoduleの対象です.皆さんにとって信じています.中の各パラメータの意味は全部分かりますが、初心者にとってはexportsは深いピットです.ap.jsを修正します.var foo = require("./foo");
新しいfoo.jsmodule.exports.hello = 'bbb'
console.log(exports.hello)
exports.hello = 'aaa'
console.log(module.exports.hello)
出力:bbb
aaa
えっと、私達は操作は同じものですか?間違いないです.これは冒頭の結論です.でも、続いて面白いものがあります.引き続きアプリ.jsを変えます.var foo = require("./foo");
console.log(foo);
foo.jsvar View = function (){}
View.prototype.test = function(){
console.log('test')
}
View.test1 = function(){
console.log('test1')
}
exports = View;
私はViewというfunctionの対象を出力してくれると予想しています.(javascriptは低かったので、予想が間違っています.)結果は戻ってきました.どうしましたかどうしましたか?完全に間違っていますよ.続けて直します.ap.js
....
console.log(foo.view);
foo.js....
exports.view = View;
やっと正常に出力されました.何か分かりました.requireが本当に戻ってきたのはmoduleのexports属性です.foo.jsのexportsはmoduleのexports属性の引用にすぎません.直接exportsに対して値を付けます.moduleには何の変化もありません.もちろん正常に出力されません.これで終わりますか?いいえ、以下は文法分析です.foo.jsを改めて、私が導き出す対象にexportで属性を追加します.....
// exports.view = View;
module.exports = View;
exports = function (argument) {
// body...
}
結局、本当にxxxになりました.私のxxx属性は?{ [Function] test1: [Function] }
えっと、今回は本当にハード怪我の問題です.module.export=Viewもmoduleのexportを変えたのではなくて、exportももとのあれを指しています.foo.jsの正しい姿勢です.
....
exports = module.exports = View;
exports.xxx= function (argument) {
// body...
}