單步除錯理解webpack裡通過require載入nodejs原生模組實現原理
在webpack和nodejs裡,我們經常使用require函式載入原生模組或者開發人員自定義的模組。
原生模組的載入,比如:
const path = require("path");
這個語句是webpack和nodejs應用裡經常使用到的。今天就來談談它的實現原理。
還是通過單步除錯的方式來學習。
大家首先得通過我前一篇文章 webpack打包過程如何除錯? 學會如何除錯webpack打包過程。
require函式的實現位於file:///internal/module.js
注意看第10行和第13行的requireDepth 加減一。因為一個module通過require被載入時,可能會遞迴地載入另外的依賴module,所以需要這個requireDepth欄位來記錄載入module的深度。
這個module.js的實際地址位於當前專案資料夾下的node_modules資料夾下面:
第11行的mod變數代表什麼?
從偵錯程式看出,就是當前命令列node啟動的webpack.js:
mod.require(path)會將執行投遞到Module._load函式:
首先會去Module._cache裡檢查path模組是否已經載入了。在我這個例子裡,path是第一次載入,所以Module._cache是空的。
那麼進入NativeModule.require(filename):
nativeModule,即原生模組,裡面也有cache快取機制。
因為path模組顯然是原生模組,而非開發人員自己定義的模組,因此NativeModule.getCached返回了已經被預載入的path模組.
cached.exports裡包含了一系列函式,這些函式就是我們nodejs應用裡經常使用的工具函式,比如join, parse, resolve等等。
這就是nodejs和webpack裡原生模組的載入原理。希望對前端開發人員有所幫助。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2217003/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- webpack最簡單的入門教程裡bundle.js之執行單步除錯的原理解析WebJS除錯
- webpack模組非同步載入原理解析Web非同步
- nodeJS 爬蟲,通過Puppeteer實現滾動載入NodeJS爬蟲
- 理解TCP/IP、UDP - 通過nodejs的net模組TCPUDPNodeJS
- nodejs通過phantomjs實現下載網頁簡單介紹NodeJS網頁
- Webpack模組載入器Web
- 【nodejs原理&原始碼賞析(5)】net模組與通訊的實現NodeJS原始碼
- nodejs的require模組及路徑NodeJSUI
- 深入理解React:懶載入(lazy)實現原理React
- 【模組化程式設計】理解requireJS-實現一個簡單的模組載入器程式設計UIJS
- webpack,非同步載入,程式碼分割,require.ensureWeb非同步UI
- 通過JLINK實現串列埠顯示除錯串列埠除錯
- require.js載入非規範的模組UIJS
- 自己動手實現java斷點/單步除錯(一)Java斷點除錯
- 自己動手實現java斷點/單步除錯(二)Java斷點除錯
- webpack 非同步載入原理Web非同步
- webpack打包過程如何除錯?Web除錯
- nodejs模組載入分析(1).mdNodeJS
- Laravel 通過 Macros 實現列印原生 MySQLLaravelMacROSMySql
- 原生JS實現最簡單的圖片懶載入JS
- 原生 JS 實現最簡單的圖片懶載入JS
- 通過單步除錯的方式學習 Angular 中 TView 和 LView 的概念除錯AngularView
- Webpack 模組打包原理Web
- 瀏覽器載入 CommonJS 模組的原理與實現瀏覽器JS
- 進擊的模組化+webpack的簡單實現Web
- Linux核心模組驅動載入與dmesg除錯Linux除錯
- NodeJS的模組原理NodeJS
- webpack模組化實現探究Web
- 使用require.context實現優雅的預載入UIContext
- 程式碼除錯-入門、實踐到原理除錯
- python如何單步除錯Python除錯
- Python實現模組熱載入Python
- webpack原理解析Web
- nodejs除錯NodeJS除錯
- [譯] 原生實現圖片懶載入
- webpack懶載入程式碼原理深究Web
- 單步除錯找到 cy.visit 的實現原始碼(二) - WebSocket?除錯原始碼Web
- 日誌庫 winston 的學習筆記 - logger.info 的實現原理單步除錯筆記除錯