在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原生模块实现原理相关推荐

  1. 单步调试学习WordPress PHP文件的加载顺序

    index.php作为入口,加载的调用栈如下图所示: 加载后在console里打印的加载日志: [Wed Jul 17 11:39:59 2019] 127.0.0.1:56156 [404]: /? ...

  2. Nodejs之require加载机制(模块可以污染全局空间)

    以前就觉得Nodejs的MooTools库很奇怪,因为用他的时候,不需要把require的返回值保存起来,今天实在憋不住,就研究了下,对NodeJs的require机制又有了几分深刻的理解. MooT ...

  3. 通过单步调试理解Angular里routerLink指令实际url的生成逻辑

    My Analysis I set a breakpoint in function generateUrlPart in file Spartacus-core.js: For every path ...

  4. webpack配置vue组件加载器

    前言 App.vue单文件组件代码 <template><div><h1>App根组件</h1></div> </template&g ...

  5. webpack教程——css的加载

    首先要安装css的loader npm install css-loader style-loader --save-dev 然后在webpack.config.js中配置如下代码 意思是先用css- ...

  6. 未能加载指定的模块“\Neo4j-Management.psd1

    未能加载指定的模块"\Neo4j-Management.psd1 解决方案 方法一 增加环境变量PSScriptRoot = "D:\beforeInstalling\neo4j- ...

  7. flutter UiKitView 加载ios 原生view

    更多文章请查看 flutter从入门 到精通 flutter 中提供的 UiKitView 组件 是用来 加载 ios 原生view 在这里有详细阐述 点击查看详情

  8. 【Ubuntu】自动加载第三方ko模块

    有时候,我们需要让系统加载第三方的内核模块,但是重新编译内核显然太繁琐,我们可以使用某些手段来手动加载或者自动加载这些模块. 手动加载 直接执行以下指令即可 sudo insmod *.ko 或者将k ...

  9. android去广告实现原理,分析某视频软件加载方案和去广告原理

    分析某视频软件加载方案和去广告原理0x1用到的工具:AndroidKiller eclipse jd-gui Android逆向助手0x2拿到APK后首先想到的是是否有签名验证,因此用逆向助手重新签名 ...

最新文章

  1. SQL 基础命令和函数
  2. 廖雪峰为你无门槛讲述高并发那些事
  3. Jmeter之控制线程执行到某个结果时退出执行
  4. 程序设置横屏后,锁屏时会被销毁一遍,解锁时又重新加载onCreat的问题解决
  5. html 入门例子(一)
  6. Spring Cloud Alibaba基础教程:支持的几种服务消费方式(RestTemplate、WebClient、Feign)
  7. js逻辑训练题_二建冲刺必刷300题!精选历年真题+母子题+模考易错题!
  8. Netty权威指南之伪异步I/O编程
  9. keil4编译c语言,用keil4编译C语言代码,编译通过,但是链接时无法产生.hex文件。...
  10. 非线性动力学_非线性科学中的现代数学方法:综述
  11. [转载]了解Linux的进程与线程
  12. Java中 java.io.IOException: Broken pipe
  13. VC++ 6.0如何创建与调用动态链接库
  14. webpack前端工程打包入门级教程
  15. Android下最简单的Camera应用APP
  16. java ini_Java读取ini文件 [org.dtools.javaini] | 学步园
  17. zabbix纯内网环境监控服务器发送邮件报警
  18. DLS 深度受限搜索 狼羊 过河 问题 python 实现
  19. 预估期刊2021年的影响因子
  20. 【深度学习原理第1篇】前馈神经网络,感知机,BP神经网络

热门文章

  1. Jacoco字节码植入原理(源码分析)
  2. 分布式与人工智能课程(part8)--Pandas绘图
  3. 第三次学JAVA再学不好就吃翔(part106)--字符流
  4. 小白的算法初识课堂(part9)--SHA及Simhash算法
  5. SAP Spartacus 里的 icon 设计
  6. SAP ABAP 编程语言里允许哪些特殊字符作为变量名的一部分?
  7. SAP Fiori Elements List Report 里的表格类型(tableType)是如何决定出来的
  8. 如何查找历史版本的SAP UI5 API文档
  9. Angular refreshView里Component template函数的执行原理
  10. 如何在JSP里自定义标签