亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

nodejs導入模塊的方法以及require模塊的執行過程

發布時間:2021-06-18 11:10:56 來源:億速云 閱讀:537 作者:chen 欄目:web開發

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

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

node中的模塊分類

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

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

  • 文件模塊,項目內部文件,通過相對路徑或者絕對路徑的方法require使用

模塊的導入require

我這邊的調試工具用的是vscode自帶的

nodejs導入模塊的方法以及require模塊的執行過程

require的過程

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

nodejs導入模塊的方法以及require模塊的執行過程

2、進入mod.require發現是 實質執行了Module.prototype.require,(這里的id就是一開始的path),嗯~ 怎么又調用了Module._load,木的事,我們繼續走

nodejs導入模塊的方法以及require模塊的執行過程

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

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

nodejs導入模塊的方法以及require模塊的執行過程

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

nodejs導入模塊的方法以及require模塊的執行過程

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

nodejs導入模塊的方法以及require模塊的執行過程

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

nodejs導入模塊的方法以及require模塊的執行過程

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

nodejs導入模塊的方法以及require模塊的執行過程

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

nodejs導入模塊的方法以及require模塊的執行過程

6、module.load(),進入該函數

nodejs導入模塊的方法以及require模塊的執行過程

nodejs導入模塊的方法以及require模塊的執行過程

  • findLongestRegisteredExtension計算文件名后綴,

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

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

nodejs導入模塊的方法以及require模塊的執行過程

7、module._compile()進入 ,發現又將content作wrapSafe(filename, content, this)的參數執行

nodejs導入模塊的方法以及require模塊的執行過程

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

nodejs導入模塊的方法以及require模塊的執行過程

  • 先是調用了Module.wrap,進入該函數,node模塊包裝成了必包的樣子(function (){ }),形成一個獨立模塊

nodejs導入模塊的方法以及require模塊的執行過程

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

9、到這里 一個模塊的require過程就執行完了,用戶就會默認拿到module.export的返回結果

總結

  • 讀取文件

  • 讀取到文件以后給文件包裝一個函數

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

  • 通過runThisContext將模塊變成js語法進行調用

到此,關于“nodejs導入模塊的方法以及require模塊的執行過程”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江达县| 靖远县| 丰镇市| 贵南县| 绥德县| 松潘县| 梁平县| 南平市| 台南县| 永川市| 邳州市| 安塞县| 苍南县| 旺苍县| 西宁市| 开封县| 井研县| 区。| 唐山市| 京山县| 稷山县| 休宁县| 麻城市| 章丘市| 望城县| 浦城县| 海兴县| 葵青区| 灵台县| 湖北省| 合肥市| 鄯善县| 石首市| 山阴县| 西吉县| 宜春市| 门源| 兴海县| 若尔盖县| 五大连池市| 双桥区|