本篇文章要為大家詳細介紹一下nodejs中require的執行過程。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
最近在看node,所以就特意了解了下,它模組引入的過程。今天做個回顧記錄,希望對正在閱讀的你也有所幫助
node中的模組分類
核心模組,或稱內置模組(就是node自帶的fs ,http,vm。。。)詳情見官網api
第三方模組,或是自己封裝的npm包放私庫或公庫上(npm 上透過npm install來安裝使用的)
#文件模組,專案內部文件,透過相對路徑或絕對路徑的方法require使用
#【推薦學習:《nodejs 教學》】
#模組的導入require
##我這邊的除錯工具用的是vscode自帶的
require的過程
1、讀取文件,進入require方法return mod.require (path)
2、進入mod.require發現實質執行了Module.prototype.require,(這裡的id就是一開始的path),嗯~ 怎麼又呼叫了Module._load,木的事,我們繼續走
3、進入Module._load(),Module._load(id, this, /* isMain */ false)根據路徑載入模組
以檔案名稱作為Module._cache 物件的鍵查詢該檔案是否已經被緩存,命中快取的話,直接exports-
#如果不存在快取數組中,Module._resolveFilename解析檔案路徑為絕對路徑,再執著的去查一次緩存,命中緩存的話exports-
#前兩次的快取查找排除了外部模組的,再判斷是不是內建模組,是的話就exports-
走到這裡真的說明這個模組真的沒有快取過,那就new 一個-
#4、new Module()進入,創建空對象this.exports = {}:也就是我們最終要的exports對象,(其他模組裡引模組此處不繼續深入研究)
#5、Module._cache [filename] 步驟3解析的路徑做key ,步驟4建立的物件做值存入我們的快取陣列。 keep going! !
6、module.load(),進入函數
#7、module._compile()進入
,發現又將content作wrapSafe(filename, content, this)的參數執行
#8、再進入wrapSafe()ps:我在這裡直接講老版本的,執行比較好理解
- 先是呼叫了Module.wrap,進入該函數,node模組包裝成了必包的樣子(function (){ }),形成一個獨立模組
- 然後將傳回的包裝過的字串模組做vm.runInThisContext參數執行該模組程式碼(和js中new Function一樣的效果可以讓字串變成js來執行),node自己的內建方法詳情查閱node官方
9、到這裡一個模組的require過程就執行完了,使用者就會預設拿到module.export的回傳結果
總結
#讀取檔案
- ##讀取到文件以後給檔案包裝一個函數
- 函數格式function (exports,module,require,_dirname,filename){}
- 透過runThisContext將模組變成js語法進行呼叫
更多程式相關知識,請造訪:
程式設計入門! !
以上是nodejs如何導入模組? require的執行過程介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!