nodejs所謂的模組就是乙個檔案,或者是匿名函式。(commonjs)
require
exports
module.exports。
複製**
364行列:
module.prototype.require = function(path) ;
複製**
module._load = function(request, parent, ismain)
var filename = module._resolvefilename(request, parent);
複製**
# module._compile:
module.prototype._compile = function(content, filename) ;
複製**
require 乙個檔案的時候,會對其進行進行乙個匿名函式的包裝。
(function (exports, require, module, __filename, __dirname) );
複製**
1、先從快取中讀取,如果沒有則繼續往下
2、判斷需要模組路徑是否以/結尾,如果不是,則要判斷
a. 檢查是否是乙個檔案,如果是,則轉換為真實路徑
b. 否則如果是乙個目錄,則呼叫trypackage方法讀取該目錄下的package.json檔案,把裡面的main屬性設定為filename
c. 如果沒有讀到路徑上的檔案,則通過tryextensions嘗試在該路徑後依次加上.js,.json和.node字尾,判斷是否存在,若存在則返回加上字尾後的路徑
3、如果依然不存在,則同樣呼叫trypackage方法讀取該目錄下的package.json檔案,把裡面的main屬性設定為filename
4、如果依然不存在,則嘗試在該路徑後依次加上index.js,index.json和index.node,判斷是否存在,若存在則返回拼接後的路徑。
5、若解析成功,則把解析得到的檔名cache起來,下次require就不用再次解析了,否則若解析失敗,則返回false
複製**
function require(/* ... */) };
((module, exports) =>
exports = somefunc;
module.exports = somefunc;
})(module, module.exports);
return module.exports;
}複製**
exports = module.exports,所以說,一開始這兩個東西指向同乙個物件例項
exports.x = function
()
module.exports.x();
複製**
# exports其實是module的屬性,require則是module原型的方法。exports.xx=xx,其實跟module.exports.xx=xx其實是一樣的,不過如果直接為export賦值,則不能寫成exports=xx,而應該寫成module.exports=xx,因為exports在這裡只是乙個引用。
# 從上面也可以看到,每一次require,都會把new乙個module,並且把這個module新增到當前模組的children中,並且返回新建的module物件的exports。
複製**
nodejs中的模組
nodejs中的模組管理遵循commonjs規範。使用module.exports 可簡寫為exports 匯出模組,使用require來引入模組。例 mymodule.js var myfunction function name module.exports myfunction 也可也成exp...
理解nodejs的module模組兒
在 node.js 模組系統中,每個檔案都視為獨立的模組,node在執行某個模組兒時會生成乙個module物件 module paths users leinov github node api module node modules users leinov github node api nod...
理解nodejs的module模組兒
在 node.js 模組系統中,每個檔案都視為獨立的模組,node在執行某個模組兒時會生成乙個module物件 module paths users leinov github node api module node modules users leinov github node api nod...