在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的原创文章,请关注公众号"汪子熙":
相关推荐
Seajs是一款客户端的JavaScript模块加载器,它通过`require`语法来引入模块,类似于服务器端的CommonJS。Seajs的核心理念是模块化,它可以让你的代码结构清晰,易于维护。然而,在实际项目中,如果每个模块都单独...
其次,Node.js拥有丰富的模块系统,通过`require`函数可以方便地引入和使用其他模块。NPM(Node Package Manager)是Node.js的包管理器,它提供了大量的开源库,可以加速开发过程。在压缩包中,可能包含了一些特定的...
* LoadJs 模块化加载原理与实现 * 创建 script 标签,需要 id 映射到资源 url * onload 加载模块队列判断全部加载完成后触发加载失败问题优化 五、Polyfill 与 Shim * Polyfill 提供了开发者们希望浏览器原生提供...
3. **模块系统**:NodeJS拥有强大的模块系统,通过`require`函数可以方便地引入和使用模块,如`fs`模块用于文件操作,`http`模块用于构建HTTP服务器。 4. **npm(Node Package Manager)**:NodeJS的包管理器,是...
`require()`函数用于加载模块,`module.exports`和`exports`用于导出模块的公共接口。Node.js 核心库包含了许多内置模块,如`fs`用于文件系统操作,`http`和`https`用于网络通信,`path`处理文件路径等。 **npm ...
在Node.js环境中,分离HTML文件中的JavaScript(JS)和CSS代码是常见的前端构建任务,用于优化网站性能,便于管理和版本控制。...通过这样的方法,我们可以更好地管理和优化前端资源,提高网站的加载速度和用户体验。
Node.js是一种基于Chrome V8引擎的...综上所述,这个"NODEJS"项目可能包含了对以上各种Node.js特性的探索和实践,通过查看解压后的"NODEJS-master"文件,我们可以深入学习和理解Node.js的各个方面,提升我们的技能。
1. **模块系统**:Node.js 使用 CommonJS 规范,通过 `require` 导入模块,`module.exports` 或 `exports` 输出模块。此外,还有 `npm`(Node Package Manager)作为全球最大的开源库生态系统,方便开发者共享和复用...
3. CommonJS 模块系统:Node.js 使用 CommonJS 规范实现模块化,通过 `require` 导入模块,`module.exports` 或 `exports` 导出模块功能。 4. 文件系统(fs):Node.js 提供了内置的 fs 模块,用于处理文件和目录...
2. **模块系统**:Node.js 提供了一套强大的模块化系统,通过 `require` 函数可以导入并使用其他模块,有利于代码组织和复用。例如,`fs` 模块用于文件操作,`http` 模块则用于创建 HTTP 服务器。 3. **V8 引擎**:...
`require()`函数用于加载模块,`module.exports`或`exports`用于导出模块内容。 5. **File System (FS) 模块** Node.js提供了FS模块用于文件系统操作,如读取、写入、创建、删除文件等。这是Node.js在服务器端操作...
2. **模块系统**:Node.js使用CommonJS模块规范,通过`require`导入模块,`module.exports`或`exports`导出模块。这便于代码组织和复用。 3. **npm(Node Package Manager)**:Node.js的包管理器,是世界上最大的...
4. **模块系统**:Node.js使用CommonJS模块系统,通过require()函数导入模块,export关键字导出模块。TypeScript也支持这种模式,并且增加了ES模块导入/导出语法,兼容未来的JavaScript标准。 5. **Express框架**:...
3. **模块系统**:Node.js 内置了模块系统,通过 `require` 函数可以导入和导出模块,方便代码组织和复用。 4. **文件系统操作**:Node.js 提供了丰富的内置模块,如 fs 模块,用于进行文件系统操作,如读写文件、...
4. **模块系统**:Node.js 提供了一个内置的模块系统,通过 `require` 函数可以方便地导入和使用其他模块。npm(Node Package Manager)是世界上最大的开源软件包仓库,拥有成千上万的第三方模块,涵盖了从数据库...
- **模块系统**:Node.js 内置了 CommonJS 规范的模块系统,通过 `require` 和 `module.exports` 或 `exports` 进行模块导入与导出。 - **npm(Node Package Manager)**:Node.js 的包管理器,用于安装、管理和共享...
Node.js拥有丰富的第三方库和框架,例如Express用于快速构建Web应用,React Native允许使用Node.js开发原生移动应用,MongoDB的Node.js驱动程序提供了与数据库交互的便利,以及webpack、Gulp和Grunt等构建工具。...
- 脚本编写:Node.js 文件以`.js`为扩展名,通过`console.log()`输出信息,使用`require()`导入模块。 - 调试:利用内置的`node inspect`命令或IDE的调试工具进行调试,查看变量值、设置断点等。 5. **NPM的使用*...
2. **模块系统**:Node.js的`require`和`module.exports`机制使得代码可重用性增强。 3. **npm**:Node包管理器,提供了丰富的第三方库,如Express、MongoDB驱动等,帮助快速构建应用。 4. **流(Stream)**:Node....