`
JerryWang_SAP
  • 浏览: 1024157 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

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

阅读更多

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

 
0
0
分享到:
评论

相关推荐

    【nodejs】nodejs版seajs压缩部署工具

    Seajs是一款客户端的JavaScript模块加载器,它通过`require`语法来引入模块,类似于服务器端的CommonJS。Seajs的核心理念是模块化,它可以让你的代码结构清晰,易于维护。然而,在实际项目中,如果每个模块都单独...

    nodejs文件打包

    其次,Node.js拥有丰富的模块系统,通过`require`函数可以方便地引入和使用其他模块。NPM(Node Package Manager)是Node.js的包管理器,它提供了大量的开源库,可以加速开发过程。在压缩包中,可能包含了一些特定的...

    前端架构体系技术.docx

    * LoadJs 模块化加载原理与实现 * 创建 script 标签,需要 id 映射到资源 url * onload 加载模块队列判断全部加载完成后触发加载失败问题优化 五、Polyfill 与 Shim * Polyfill 提供了开发者们希望浏览器原生提供...

    NodeJS:Desarrollo存储库NodeJS-Desarrollo存储库

    3. **模块系统**:NodeJS拥有强大的模块系统,通过`require`函数可以方便地引入和使用模块,如`fs`模块用于文件操作,`http`模块用于构建HTTP服务器。 4. **npm(Node Package Manager)**:NodeJS的包管理器,是...

    node-v16.15.0-win-x64.zip

    `require()`函数用于加载模块,`module.exports`和`exports`用于导出模块的公共接口。Node.js 核心库包含了许多内置模块,如`fs`用于文件系统操作,`http`和`https`用于网络通信,`path`处理文件路径等。 **npm ...

    nodejs分离html文件里面的js和css的方法

    在Node.js环境中,分离HTML文件中的JavaScript(JS)和CSS代码是常见的前端构建任务,用于优化网站性能,便于管理和版本控制。...通过这样的方法,我们可以更好地管理和优化前端资源,提高网站的加载速度和用户体验。

    NODEJS:对于nodejs中的proyects

    Node.js是一种基于Chrome V8引擎的...综上所述,这个"NODEJS"项目可能包含了对以上各种Node.js特性的探索和实践,通过查看解压后的"NODEJS-master"文件,我们可以深入学习和理解Node.js的各个方面,提升我们的技能。

    nodeJS:实用结节

    1. **模块系统**:Node.js 使用 CommonJS 规范,通过 `require` 导入模块,`module.exports` 或 `exports` 输出模块。此外,还有 `npm`(Node Package Manager)作为全球最大的开源库生态系统,方便开发者共享和复用...

    nodejs-concepts

    3. CommonJS 模块系统:Node.js 使用 CommonJS 规范实现模块化,通过 `require` 导入模块,`module.exports` 或 `exports` 导出模块功能。 4. 文件系统(fs):Node.js 提供了内置的 fs 模块,用于处理文件和目录...

    iginite_conceitos_nodejs

    2. **模块系统**:Node.js 提供了一套强大的模块化系统,通过 `require` 函数可以导入并使用其他模块,有利于代码组织和复用。例如,`fs` 模块用于文件操作,`http` 模块则用于创建 HTTP 服务器。 3. **V8 引擎**:...

    NodeJS_Programs:Node.js程序

    `require()`函数用于加载模块,`module.exports`或`exports`用于导出模块内容。 5. **File System (FS) 模块** Node.js提供了FS模块用于文件系统操作,如读取、写入、创建、删除文件等。这是Node.js在服务器端操作...

    NODEJS:在没有CSS的情况下学习Java ..

    2. **模块系统**:Node.js使用CommonJS模块规范,通过`require`导入模块,`module.exports`或`exports`导出模块。这便于代码组织和复用。 3. **npm(Node Package Manager)**:Node.js的包管理器,是世界上最大的...

    des5-ing-nodeJs

    4. **模块系统**:Node.js使用CommonJS模块系统,通过require()函数导入模块,export关键字导出模块。TypeScript也支持这种模式,并且增加了ES模块导入/导出语法,兼容未来的JavaScript标准。 5. **Express框架**:...

    project_with_nodejs:Node.JS,Boostrap

    3. **模块系统**:Node.js 内置了模块系统,通过 `require` 函数可以导入和导出模块,方便代码组织和复用。 4. **文件系统操作**:Node.js 提供了丰富的内置模块,如 fs 模块,用于进行文件系统操作,如读写文件、...

    nodejs

    4. **模块系统**:Node.js 提供了一个内置的模块系统,通过 `require` 函数可以方便地导入和使用其他模块。npm(Node Package Manager)是世界上最大的开源软件包仓库,拥有成千上万的第三方模块,涵盖了从数据库...

    Node.js 资源汇总

    - **模块系统**:Node.js 内置了 CommonJS 规范的模块系统,通过 `require` 和 `module.exports` 或 `exports` 进行模块导入与导出。 - **npm(Node Package Manager)**:Node.js 的包管理器,用于安装、管理和共享...

    intro-nodejs

    Node.js拥有丰富的第三方库和框架,例如Express用于快速构建Web应用,React Native允许使用Node.js开发原生移动应用,MongoDB的Node.js驱动程序提供了与数据库交互的便利,以及webpack、Gulp和Grunt等构建工具。...

    node.js64位安装包

    - 脚本编写:Node.js 文件以`.js`为扩展名,通过`console.log()`输出信息,使用`require()`导入模块。 - 调试:利用内置的`node inspect`命令或IDE的调试工具进行调试,查看变量值、设置断点等。 5. **NPM的使用*...

    很棒:很棒的列表是在Node.js,ReactJS和React Native生态系统中开发项目的最佳工具,软件,库和指南

    2. **模块系统**:Node.js的`require`和`module.exports`机制使得代码可重用性增强。 3. **npm**:Node包管理器,提供了丰富的第三方库,如Express、MongoDB驱动等,帮助快速构建应用。 4. **流(Stream)**:Node....

Global site tag (gtag.js) - Google Analytics