搜索
首页web前端js教程浅谈Node.js中require()的工作原理

浅谈Node.js中require()的工作原理

Sep 27, 2020 pm 01:42 PM
node.jsrequire()

浅谈Node.js中require()的工作原理

【视频教程推荐:node js教程 】

大多数人都知道Node.js中require()函数做什么的,但是有多少人知道它的工作原理呢?我们每天使用它加载库包和模块,但是它的内部行为原理很神秘。

我们追寻Node模块系统的核心: module.js,这个文件包含一个令人惊讶的神奇功能,它负责加载 编译和缓存每个用过的文件,让我们揭开它的神秘面纱。

function Module(id, parent) { 
  this.id = id; 
  this.exports = {}; 
  this.parent = parent; 
  // ...

在module.js中可以发现这个Module类型,扮演两个主要角色:首先,它提供一个所有Node.js模块从其文件被加载时构建一个实例的基础功能,甚至在文件运行时持久,这就是为什么我们能够将一些属性加入module.exports,并在需要时返回它们。

module的第二个事情是处理Node模块的加载机制,标准的require函数其实是基于module.require的抽象,后者只是一个对Module._load的简单包装,加载方法处理每个文件的实际加载。看看它的代码大概如下:

Module._load = function(request, parent, isMain) { 
  // 1.在Module._cache中检查模块是否被缓存
  // 2.如果缓存中为空,创建一个新的模块实例。
  // 3. 保存到缓存
  // 4. 使用指定的名称调用module.load() 
  //    在读取了文件内容后将调用module.compile() 
  // 5.如果加载和分析文件时有错误
  //    从缓存中删除坏的模块
  // 6. 返回 module.exports 
};

Module._load负责加载新的模块并且管理模块缓存,缓存每个模块能够降低文件的读取频率,从而提高性能,共享模块实例允许像单例模块那样跨应用保存状态。

如果一个模块在缓存中不存在,Module._load将读取文件创建一个新的,读取文件内容成功后会调用module._compile

如果你注意上面第六步,你会看到返回的是module.exports,这就是为什么当你定义公共接口时,可以使用exports和module.exports,因为它们确实是Model._load和require返回的。

下面看看module._compile:

Module.prototype._compile = function(content, filename) { 
  // 1. 创建调用模块需要的require标准函数
  // 2.将其他帮助方法加入require. 
  // 3.包装JS代码到一个函数,这个函数提供我们的require
  //  模块, 比如变量本地化到模块的作用域
  // 4.返回这个函数
};

这里有魔术发生,首先,一个特殊的标准require函数将被创建,这就是我们熟悉的require()函数,当函数自己包装了Module.require,它还包含一些很少人知道的帮助属性和方法,如:

  • require():加载一个外部模块

  • require.resolve(): 根据其绝对路径解决模块名称

  • require.main: 主要的模块

  • require.cache: 所有缓存模块

  • require.extensions: 基于文件的扩展名可用于编译的方法。

一旦require准备就绪,整个源码将被包装进一个新的函数,这个函数有require module和exports和其他暴露变量作为参数,这创建了模块的一个新函数作用域,这样就不会污染Node.js环境的其余部分。

(function (exports, require, module, __filename, __dirname) { 
  // YOUR CODE INJECTED HERE! 你的代码在这里
});

最后,这个包装了模块的函数将运行,整个Module._compile方法同步执行,这样原来对Module._load方法调用将会等待这个代码运行,然后才会完成,返回module.exports给用户。

现在,我们已经知道require('模块')是如何通过模块系统加载你定义的模块的, module.js source code包含更多代码原理,如果你有兴趣可以发现更多。

更多编程相关知识,可访问:编程教学!!

以上是浅谈Node.js中require()的工作原理的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:jdon。如有侵权,请联系admin@php.cn删除
JavaScript是用C编写的吗?检查证据JavaScript是用C编写的吗?检查证据Apr 25, 2025 am 12:15 AM

是的,JavaScript的引擎核心是用C语言编写的。1)C语言提供了高效性能和底层控制,适合JavaScript引擎的开发。2)以V8引擎为例,其核心用C 编写,结合了C的效率和面向对象特性。3)JavaScript引擎的工作原理包括解析、编译和执行,C语言在这些过程中发挥关键作用。

JavaScript的角色:使网络交互和动态JavaScript的角色:使网络交互和动态Apr 24, 2025 am 12:12 AM

JavaScript是现代网站的核心,因为它增强了网页的交互性和动态性。1)它允许在不刷新页面的情况下改变内容,2)通过DOMAPI操作网页,3)支持复杂的交互效果如动画和拖放,4)优化性能和最佳实践提高用户体验。

C和JavaScript:连接解释C和JavaScript:连接解释Apr 23, 2025 am 12:07 AM

C 和JavaScript通过WebAssembly实现互操作性。1)C 代码编译成WebAssembly模块,引入到JavaScript环境中,增强计算能力。2)在游戏开发中,C 处理物理引擎和图形渲染,JavaScript负责游戏逻辑和用户界面。

从网站到应用程序:JavaScript的不同应用从网站到应用程序:JavaScript的不同应用Apr 22, 2025 am 12:02 AM

JavaScript在网站、移动应用、桌面应用和服务器端编程中均有广泛应用。1)在网站开发中,JavaScript与HTML、CSS一起操作DOM,实现动态效果,并支持如jQuery、React等框架。2)通过ReactNative和Ionic,JavaScript用于开发跨平台移动应用。3)Electron框架使JavaScript能构建桌面应用。4)Node.js让JavaScript在服务器端运行,支持高并发请求。

Python vs. JavaScript:比较用例和应用程序Python vs. JavaScript:比较用例和应用程序Apr 21, 2025 am 12:01 AM

Python更适合数据科学和自动化,JavaScript更适合前端和全栈开发。1.Python在数据科学和机器学习中表现出色,使用NumPy、Pandas等库进行数据处理和建模。2.Python在自动化和脚本编写方面简洁高效。3.JavaScript在前端开发中不可或缺,用于构建动态网页和单页面应用。4.JavaScript通过Node.js在后端开发中发挥作用,支持全栈开发。

C/C在JavaScript口译员和编译器中的作用C/C在JavaScript口译员和编译器中的作用Apr 20, 2025 am 12:01 AM

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。 1)C 用于解析JavaScript源码并生成抽象语法树。 2)C 负责生成和执行字节码。 3)C 实现JIT编译器,在运行时优化和编译热点代码,显着提高JavaScript的执行效率。

JavaScript在行动中:现实世界中的示例和项目JavaScript在行动中:现实世界中的示例和项目Apr 19, 2025 am 12:13 AM

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

JavaScript和Web:核心功能和用例JavaScript和Web:核心功能和用例Apr 18, 2025 am 12:19 AM

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器