module.exports與exports與require

module.exports與exports與require

1.nodejs的模塊

Node.js分爲原生模塊 第三方模塊 自定義模塊javascript

  • 原生模塊:不須要加載也不須要指定地址也不用npm下載 常見的有:
global;  process;  timer;  console;  module;  buffer
  • 第三方模塊:npm下載到node_moules,不須要指定地址
  • 自定義模塊:用require引用,須要指定地址
2.nodejs的遵循的規則
  • nodejs的模塊遵循CommonJs規範;模塊是Node.js的重要組成部分,文件與模塊一一對應,一個Node.js文件就是一個模塊,擁有單獨的做用域。普通方式定義的變量,函數,對象都屬於該模塊內.
2.CommonJs
  • 在模塊運行時,會自動生成一個 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

(1)exports只是module.exports的一個引用;
(2)一個模塊真正導出的是module.exports,require引用的也是module.exports而非exports
(3)module.exports能夠把類,方法,數組,對象,類公佈給外部文件,module.exports可直接導出(直接賦值)

(4)exports只能以引用的方式把值,方法,數組,對象公佈給外部文件,exports不能夠直接導出

引用即[[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同一塊內存,確保數據的一致性。數組

延伸export和export default
  • export與export default能夠用於導出常量,函數,文件,模塊
  • 在一個文件或模塊中,export,import能夠有多個,export default只能有一個
  • 經過export方式導出 ,在導出時要加入{},export default則不須要
  • export能直接導出變量表達式, export default不行
  • require: node和ES6都支持的引入
  • export/import:只用ES6支持的導出與引入
  • module.exports/exports只有node支持的導出
eg1:
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);
eg2:
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('哈哈');
}
參考文章

http://javascript.ruanyifeng.com/nodejs/module.html函數

相關文章
相關標籤/搜索