在webpack和nodejs里,咱们常用require函数加载原生模块或者开发人员自定义的模块。前端
原生模块的加载,好比:node
const path = require("path");webpack
这个语句是webpack和nodejs应用里常用到的。今天就来谈谈它的实现原理。web
仍是经过单步调试的方式来学习。缓存
你们首先得经过我前一篇文章 webpack打包过程如何调试?学会如何调试webpack打包过程。函数
require函数的实现位于file:///internal/module.js工具
注意看第10行和第13行的requireDepth 加减一。由于一个module经过require被加载时,可能会递归地加载另外的依赖module,因此须要这个requireDepth字段来记录加载module的深度。学习
这个module.js的实际地址位于当前项目文件夹下的node_modules文件夹下面:ui
第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的原创文章,请关注公众号"汪子熙":