您好,登錄后才能下訂單哦!
這篇文章主要介紹“nodejs導入模塊的方法以及require模塊的執行過程”,在日常操作中,相信很多人在nodejs導入模塊的方法以及require模塊的執行過程問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”nodejs導入模塊的方法以及require模塊的執行過程”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
最近在看node,所以就特意了解了下,它模塊引入的過程。今天做個回顧記錄,希望對正在閱讀的你也有所幫助
核心模塊,或者稱內置模塊(就是node自帶的 fs ,http,vm。。。)詳情見官網api
第三方模塊 ,或者自己封裝的npm包放私庫或者公庫上(npm 上 通過 npm install來安裝使用的)
文件模塊,項目內部文件,通過相對路徑或者絕對路徑的方法require使用
我這邊的調試工具用的是vscode自帶的
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(),進入該函數
findLongestRegisteredExtension計算文件名后綴,
Module._extensions[extension](this, filename)根據不同的后綴去調用不同的加載方法(這里用的是策略模式)
我這里命中的是.js,該方法里又用fs.readFileSync同步讀取文件,然后作參數調用 module._compile(content, filename)
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模塊的執行過程”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。