module.exports
1.
在a.js中
var b=require('./b.js'); console.log(b);
在b.js中
function add(x,y){ return x+y; } var result=add(100,1000); console.log(result);
執行a.js
當加載一個模塊,默認被require()加載后,返回的是一個對象{}
2.
在b.js中
function add(x,y){ return x+y; } var result=add(100,1000); console.log(result); //return "hello";會有問題 //給module.exports符什么值,加載b.js模塊的時候就會返回什么值 module.exports='hello world!';
執行a.js
給module.exports符什么值,加載b.js模塊的時候就會返回什么值
3.
b.js
function add(x,y){ return x+y; } var result=add(100,1000); console.log(result); //return "hello";會有問題 //給module.exports符什么值,加載b.js模塊的時候就會返回什么值 //module.exports='hello world!';//字符 //module.exports=32233;//數字 module.exports=function(x){ console.log(x); };
a.js
var b=require('./b.js'); console.log(b); b('hahaha');
執行a.js
module.exports后面可以符字符串,數值,還有函數
4.
那么我們還可以這樣
b.js
function add(x,y){ return x+y; } var result=add(100,1000); console.log(result); //return "hello";會有問題 //給module.exports符什么值,加載b.js模塊的時候就會返回什么值 //module.exports='hello world!';//字符 //module.exports=32233;//數字 /*module.exports=function(x){ console.log(x); };*/ module.exports.name='Jim'; module.exports.age=11; module.exports.show=function(){ console.log(this.name+this.age); }
a.js
var b=require('./b.js'); console.log(b.name); console.log(b.age); console.log(b.show);
b.show();
執行a.js
b.js也可以返回出這樣的對象
總結:
所以,require用來加載模塊,module.exports用來暴露模塊
module.export與export的區別
a.js
var b=require('./b.js'); console.log(b.name); console.log(b.age); b.show();
b.js
module.exports.name='Bob'; exports.age=12; exports.show=function(){ console.log(this.name+this.age); }
執行a.js
得到的結果與module.export的1結果相同,但是module.export與export之間還是有些差別的,我們來看下面的例子
a.js
var b=require('./b.js'); console.log(b); console.log(b.name); console.log(b.age); b.show(); b('hahaha');
b.js
module.exports.name='Bob'; exports.age=12; exports.show=function(){ console.log(this.name+this.age); }; module.exports='Hello !';
執行a.js
可以看出最后暴露出的只有module.exports=“Hello !”,而exports的都沒有暴露出來
原因:
因為module.exports和exports相當於一個棧里的兩個變量,module.exports先指向堆里的一個對象,給對里添加了一個name屬性
exports會和module.exports指向同一個對象,添加屬性
之后如果又對module.export賦值:module.exports=‘Hello !’;,這個時候module.exports會指向堆里的一個新的地方
exports就沒有和module.exports在同一個對象里了,而會返回的值會是module.exports的值,所以exports不會暴露出來
再修改一下b.js
module.exports.name='Bob'; exports.age=12; exports.show=function(){ console.log(this.name+this.age); }; exports='Hello !';
可以看出,最終返回的還是module.exports
exports存在因為它是一個快捷方式,是為了我們使用更方便