Node.js分爲原生模塊 第三方模塊 自定義模塊javascript
global; process; timer; console; module; buffer
在模塊運行時,會自動生成一個 module 對象和一個 exports 對象,module 對象下也有一個 exports 對象;爲了方便使用,exports指向module.exports,至關於在模塊頭部加入了exports=module.exports,在對外輸出時,能夠給exports對象添加s屬性(不能直接賦值,由於會改變exports=module.exports)默認狀況下,module.exports 與 exports 是空對象 即exports=module.exports={}
;當module.exports與exports被賦值時,該模塊就是帶返回值的模塊。html
經過require加載模塊,經過exports和module.exports來暴露模塊內容java
全部代碼都運行在模塊做用域,不會污染全局做用域,模塊能夠屢次加載,但只會在第一次加載時運行一次,而後運行結果就被緩存,之後再加載,就直接讀取緩存結果,模塊的加載順序,按照代碼的出現順序同步加載的node
module.exports與exports的區別:npm
引用即[[exports指向的地址與module.exports指向的地址一致 exports的值改變時,地址(從新開闢新的空間)就會改變]] let obj1={a:1}; let obj2=obj1; console.log(obj1,obj2);//{a:1} {a:1} obj2.a=2; console.log(obj1,obj2);//{a:2} {a:2} obj2={b:2}; //開闢新的空間存儲 obj2 console.log(obj1,obj2);//{a:2} {b:2} obj2就是obj1的引用
因此node模塊常常這樣寫: exports=module.exports=()=>{ } 這是爲了讓exports引用指向module.exports同一塊內存,確保數據的一致性。數組
01.js var a=1; //變量 var b=['arr1','arr2']; //數組 var c={name:'對象',age:12}; //對象 var d=function t1(){ //函數 console.log("函數"); } /* 方法1:module.exports導出 module.exports.a=a; module.exports.b=b; module.exports.c=c; module.exports.d=d; */ /* 方法2:module.exports直接導出 module.exports={ a,b,c,d } */ /* 方法3:exports導出 exports.a=a; exports.b=b; exports.c=c; exports.d=d; */ 02.js const s=require("./01.js"); console.log(s.a); console.log(s.b) console.log(s.c.name); s.d(); console.log(s);
03.js function Demo(){ this.a="類屬性"; this.b=function(){ console.log("類方法"); } } module.exports=Demo; 04.js const Demo=require("./03.js"); var demo=new Demo(); console.log(demo.a); demo.b();
eg3:緩存
module.exports直接賦值導出 module.exports={ 'b':function(){ console.log('哈哈'); } } exports.b=function(){ console.log('哈哈'); }