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

单步调试理解webpack里通过require加载nodejs原生模块实现原理

在webpack和nodejs里,我们经常使用require函数加载原生模块或者开发人员自定义的模块。

原生模块的加载,比如:

const path = require(“path”);

这个语句是webpack和nodejs应用里经常使用到的。今天就来谈谈它的实现原理。

还是通过单步调试的方式来学习。

大家首先得通过我前一篇文章学会如何调试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里原生模块的加载原理。希望对前端开发人员有所帮助。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • nodejs里require的调试截屏

    const TCPClient = require(’…/modules/tcpClient/index’)

    Jerry Wang
  • SAP CRM产品主数据无法根据产品描述字段进行搜索的原因

    版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.bl...

    Jerry Wang
  • Product change时关于change_log的讨论

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

    Jerry Wang
  • Android工程使用org.apache.commons.codec(commons-codec)库,运行时提示Base64.encodeBase64URLSafeString“java.lang.

    最近工作是开发FIDO UAF项目。FIDO UAF是一个旨在提供身份验证通用方案,以代替繁杂密码记忆的一个方案,Google,阿里这些大头都是核心成员,感觉是...

    sickworm
  • 校园交易平台后台系统git操作全过程项目初始化用户模块完成

    JavaEdge
  • 从0开始的Python学习009参数

    对于参数有时候我们希望他是可选的,前面介绍了函数柯里化,当然还有其他的解决方案。如果不想给某些参数提供值的话,就让这写参数使用默认值。在函数定义的时候给参数赋值...

    Happy、Liu
  • 茶馆专用小程序,掌柜们了解一下?

    去茶馆喝喝茶一直是追求生活品质的同仁们比较追捧的,不管是现在还是古代都是如此,而且茶馆的装修多是古色古香居多,但是我们生活习惯演变的非常快,借助移动互联网这班快...

    微盛企微管家
  • 关于移动web教程免费发布

    各位老铁大家好,最近经历了太多太多,精力一直不能集中做自己愿意做的事情。 移动Web课程一开始设置收费10块,其实本意是让大家感觉有支出,就会相对珍惜好好学习,...

    老马
  • Maven项目Spring整合RocketMQ消费者实现

    RocketMQ是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给Apache基金会,已经于2016年11月成为 Apache 孵化项目,相信Rock...

    麦克劳林
  • peewee的使用 python orm

    爬虫。 -- 自动判断 返回的编码 resp.encoding = resp.apparent_encoding

    py3study

扫码关注云+社区

领取腾讯云代金券