专栏首页Jerry的SAP技术分享单步调试理解webpack里通过require加载nodejs原生模块实现原理
原创

单步调试理解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的原创文章,请关注公众号"汪子熙":

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SAP Customer Data Cloud(Gigya)的用户搜索实现

    我在Gigya前台根据email搜索,输入一个邮箱地址,回车,在Chrome开发者工具里观察到到后台的网络请求:

    Jerry Wang
  • SAP标准培训课程C4C10学习笔记(一)第一单元

    C4C10:SAP Hybris Cloud for Customer Administration

    Jerry Wang
  • SAP Cloud for Customer Sales Lead明细页面视图的UI模型

    SalesLead的明细页面的UI模型路径:COD_MarketingLead.TI.uicomponent

    Jerry Wang
  • CRM, C4C和Hybris的后台作业

    ABAP_TEXT_INDEX这个job执行的report是ABAP_DOCU_CREATE_TEXT_INDEX:

    Jerry Wang
  • 如何查找Authorization object在哪些ABAP代码里使用到

    双击where-Used List->Authorization Objects->In Programs:

    Jerry Wang
  • SAP Vim和ABAP Editor的个人设置

    每个user SE80的配置存在表RSEUMOD里。比如我想参考Wade 的SE80设置,最后一次打开了哪些package,program之类的信息:

    Jerry Wang
  • SAP CRM和Cloud for Customer的扩展字段元数据

    在product search & search result上创建了一个extension field:

    Jerry Wang
  • 如何为SAP WebIDE开发扩展(Extension),并部署到SAP云平台上

    本文通过一个最简单的例子,介绍如何给SAP WebIDE开发扩展(WebIDE Extension)

    Jerry Wang
  • S/4HANA和CRM Fiori应用的搜索分页实现

    在我的博客Paging Implementation in S/4HANA for Customer Management 我介绍了S/4HANA for Cu...

    Jerry Wang
  • 数据结构中的队列 ADT

    队列的基本操作是Enqueue(入队),它是在表的末端(rear)插入一个元素,还有Dequeue(出队),它是删除(货返回)在表的开头(叫做队头(front)...

    于小勇

扫码关注云+社区

领取腾讯云代金券