詳解Node.js中exports和module.exports的區(qū)別
今天看了下node.js的require方法的源碼,終于搞清楚exports和module.exports的區(qū)別了。
我們知道,node.js的模塊暴露有兩種方法。
1. 方式一:用exports
//a.js
exports.log =function (str) {
console.log(str);
}
//b.js
var s = require("./a");
s.log("哈哈哈哈");
2. 方式二:用module.exports
//a.js
module.exports = function (str) {
console.log(str);
}
//b.js
var s = require("./a");
s("嘻嘻嘻嘻");
如果將第一種方式的exports按照第二種方式寫成下面這樣就會出錯:
//a.js
exports = function (str) {
console.log(str);
}
//b.js
var s = require("./a");
s("哈哈哈哈");
exports和module.exports的初始值指向的是空對象,即{}。從源碼可以看到,其實模塊的require方法實質(zhì)上是調(diào)用了_load方法,而_load方法,最終返回的是module.exports

來分析一下出錯的原因。
由于最開始的時候,exports和module.exports都指向同一個對象。
第一種方式,是在給這個空對象{}添加屬性,又因為module.exports也是指向這個對象的,所以最終require方法返回的module.exports是指向了這個具有log方法的對象的,可以引用到模塊。
第二種方式是讓module.exports指向一片新的內(nèi)存空間,exports指向的仍然是{},但是由于require方法返回的是module.exports,所以最終也能引入模塊。
但是最后那種寫法是讓exports指向一片新的內(nèi)存空間,module.exports指向的仍然還是{},那么最終require方法是將module.exports返回,所以會導(dǎo)致報錯,說s不是一個function。
所以:
請牢記:require方法返回的是module.exports!
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
npm?install的--save和--save-dev使用說明(推薦)
這篇文章主要介紹了npm?install的--save和--save-dev使用說明,文中給大家提到了各個命令的區(qū)別及各種安裝參數(shù)的區(qū)別,需要的朋友可以參考下2022-08-08
基于node打包可執(zhí)行文件工具_(dá)Pkg使用心得分享
下面小編就為大家分享一篇基于node打包可執(zhí)行文件工具_(dá)Pkg使用心得分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
node.js抓取并分析網(wǎng)頁內(nèi)容有無特殊內(nèi)容的js文件
nodejs獲取網(wǎng)頁內(nèi)容綁定data事件,獲取到的數(shù)據(jù)會分幾次相應(yīng),如果想全局內(nèi)容匹配,需要等待請求結(jié)束,在end結(jié)束事件里把累積起來的全局?jǐn)?shù)據(jù)進(jìn)行操作,本文給大家介紹node.js抓取并分析網(wǎng)頁內(nèi)容有無特殊內(nèi)容的js文件,需要的朋友參考下2015-11-11

