浅析当下的 Nodejs CommonJS 模块系统

在 ES2015 标准之前,JavaScript 语言没有原生的组织代码的方式。Node.js 用 CommonJS 模块规范填补了这个空白。我想通过这篇文章和大家分享一下当下的 CommonJS 模块系统的一些机制和细节。

模块是代码结构的基本组成部分。通过模块系统,我们可以用模块化的方式来组织应用代码。模块可以通过 module.exports 自由地隐藏内部实现、对外暴露接口 。我们只需要通过 require ,就能实现模块加载引入。

我们可以在这异常错误堆栈看到,当我们用 require() 时,它内部调用了那些方法。

为了使之后代码细节显得不那么TLDR,先通过这个图,对整体流程有一定印象:

虽然在 Node.js 8 之后开始做 Node.js 支持 ES Module 的工作,CommonJs 模块系统的实现还是经过了不小的变化。但是总体流程仍然是和之前几乎一致。

代码中的 this 是一个模块实例(module),至于模块实例是怎么生成的我们之后再细看。

完成上面的铺垫,回归主线,开始解析 makeRequireFunction 做了什么。

通过上面的代码我们完整了解了 makeRequireFunction 的实现,它主要实现了:

tryModuleLoad 这这里做了检测,如果模块加载失败,会清理模块的缓存。

同步读取文件,清除文件中的 BOM 编码字符,然后调用 module._compile 编译

以下的代码是 module._compile 的部分代码,去掉了 调试相关和文件 stat 缓存的代码。

3.3 相对路径模块、绝对路径的模块与 node_modules 中的模块

通过这篇文章,我们从代码实现了解了 Node.js 的 CommonJS 模块系统的实现,再次回顾模块系统的流程:

发表评论

电子邮件地址不会被公开。 必填项已用*标注