在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的原创文章,请关注公众号"汪子熙":

最新文章

  1. 使用HTML5的History API
  2. JAVA 多线程和并发学习笔记(三)
  3. 操作素有的ul的元素
  4. G面经prepare: Jump Game Return to Original Place
  5. windows系统下Tomcat与Apache服务器集成
  6. SQL Server数据库自增字段正确的插入值的描述
  7. EL表达式获取数据
  8. bjfu1097 图标排列
  9. 对比iOS网络组件:AFNetworking VS ASIHTTPRequest
  10. jdbc的入门学习
  11. IIS服务器被配置为不列出此目录的内容
  12. 读《javascript语法精粹》知识点总结
  13. PythonStudy——阶段总结
  14. 【Java】Comparable和Comparator接口的区别
  15. 设计模式 -创建型模式 ,python工厂模式 抽象工厂模式(1)
  16. sencha touch 百度地图扩展(2014-12-17)
  17. 2017/2/7utf-8与GBK的区别与修改
  18. 【IneliJ 】使用IneliJ IDEA 2016将Java Web项目导出为War包
  19. Setting an Event to Null
  20. 字符串 CSV解析 表格 逗号分隔值 通讯录 电话簿 MD

热门文章

  1. HDU3555 区间的数里面有49的个数(数位dp)
  2. Lintcode 摊平嵌套的列表
  3. LINUX下用PHPIZE安装PHP GD扩展
  4. Why do you need a new Launch X431 scan tool?
  5. Xshell设置主机名高亮
  6. [转]jQuery为控件添加水印文字
  7. java学习第十四天
  8. [转]png图片压缩大小但是不改变透明部分
  9. WEBAPI测试
  10. WPF的组成架构