nodejsの中でexportsとmodule.exports

2259 ワード

私は7日間の学会NodeJSのピットを見ましたが、同僚に質問されました.exportsとmodule.exportの違いは何ですか?初心者としては、よく分かりませんでした.テストをしたら、次のような結論が出ました.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.js
module.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.js
var 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...
}