单步调试理解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里原生模塊的加載原理。希望對前端開發人員有所幫助。
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":
總結
以上是生活随笔為你收集整理的单步调试理解webpack里通过require加载nodejs原生模块实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开空调睡觉要开窗户吗
- 下一篇: webpack-dev-server启动