nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程

這篇文章主要介紹“nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程”,在日常操作中,相信很多人在nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供方山網(wǎng)站建設(shè)、方山做網(wǎng)站、方山網(wǎng)站設(shè)計(jì)、方山網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、方山企業(yè)網(wǎng)站模板建站服務(wù),10多年方山做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

最近在看node,所以就特意了解了下,它模塊引入的過程。今天做個(gè)回顧記錄,希望對正在閱讀的你也有所幫助

node中的模塊分類

  • 核心模塊,或者稱內(nèi)置模塊(就是node自帶的 fs ,http,vm。。。)詳情見官網(wǎng)api

  • 第三方模塊 ,或者自己封裝的npm包放私庫或者公庫上(npm 上 通過 npm install來安裝使用的)

  • 文件模塊,項(xiàng)目內(nèi)部文件,通過相對路徑或者絕對路徑的方法require使用

模塊的導(dǎo)入require

我這邊的調(diào)試工具用的是vscode自帶的

nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程

require的過程

1、讀取文件,進(jìn)入require方法 return mod.require(path)

nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程

2、進(jìn)入mod.require發(fā)現(xiàn)是 實(shí)質(zhì)執(zhí)行了Module.prototype.require,(這里的id就是一開始的path),嗯~ 怎么又調(diào)用了Module._load,木的事,我們繼續(xù)走

nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程

3、進(jìn)入Module._load(),Module._load(id, this, /* isMain */ false)根據(jù)路徑加載模塊

  • 以文件名作為 Module._cache 對象的鍵查詢該文件是否已經(jīng)被緩存,命中緩存的話,直接 exports

nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程

  • 如果不存在緩存數(shù)組中,Module._resolveFilename解析文件路徑 為絕對路徑,再執(zhí)著的去查一次緩存,命中緩存的話 exports

nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程

  • 前兩次的緩存查找排除了外部模塊的,再判斷是不是內(nèi)置模塊,是的話 就exports

nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程

  • 走到這里真的說明這個(gè)模塊真的沒有緩存過,那就new 一個(gè)

nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程

4、new Module()進(jìn)入,創(chuàng)建空對象this.exports = {}:也就是我們最終要的exports對象,(其他模塊里引模塊 此處不繼續(xù)深入研究)

nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程

5、Module._cache[filename] 步驟3中解析的路徑做key ,步驟4中創(chuàng)建的對象做值存入我們的緩存數(shù)組。keep going??!

nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程

6、module.load(),進(jìn)入該函數(shù)

nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程

nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程

  • findLongestRegisteredExtension計(jì)算文件名后綴,

  • Module._extensions[extension](this, filename)根據(jù)不同的后綴去調(diào)用不同的加載方法(這里用的是策略模式)

  • 我這里命中的是.js,該方法里又用fs.readFileSync同步讀取文件,然后作參數(shù)調(diào)用 module._compile(content, filename)

nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程

7、module._compile()進(jìn)入 ,發(fā)現(xiàn)又將content作wrapSafe(filename, content, this)的參數(shù)執(zhí)行

nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程

8、再進(jìn)入wrapSafe()ps:我這里直接講老版本的,執(zhí)行比較好理解

nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程

  • 先是調(diào)用了Module.wrap,進(jìn)入該函數(shù),node模塊包裝成了必包的樣子(function (){ }),形成一個(gè)獨(dú)立模塊

nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程

  • 然后將返回的包裝過的字符串模塊做vm.runInThisContext參數(shù) 執(zhí)行該模塊代碼(和js中new Function一樣的效果 可以讓字符串變成js來執(zhí)行),node自己的內(nèi)置方法詳情查閱node官方

9、到這里 一個(gè)模塊的require過程就執(zhí)行完了,用戶就會(huì)默認(rèn)拿到module.export的返回結(jié)果

總結(jié)

  • 讀取文件

  • 讀取到文件以后給文件包裝一個(gè)函數(shù)

  • 函數(shù)格式function (exports,module,require,_dirname,filename){}

  • 通過runThisContext將模塊變成js語法進(jìn)行調(diào)用

到此,關(guān)于“nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

當(dāng)前題目:nodejs導(dǎo)入模塊的方法以及require模塊的執(zhí)行過程
本文鏈接:http://muchs.cn/article18/ipgsgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、品牌網(wǎng)站制作定制網(wǎng)站網(wǎng)站制作、定制開發(fā)App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司