Node.js中require()是如何工作的?工作原理介绍

Node.js中require()是如何工作的?工作原理介绍

相关推荐:《nodejs 教程》

大多数人都知道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()是如何工作的?工作原理介绍的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2635030.html

(0)
上一篇 2025年3月7日 04:38:51
下一篇 2025年3月7日 04:39:04

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 了解Node.js中的模块系统

    相关推荐:《node js教程》 Node.js 的模块 JavaScript 做为一门为网页添加交互功能的简单脚本语言问世,在开始并不包含模块系统,随着 JavaScript 解决问题越来越复杂,把所有代码写在一个文件内,用 functi…

    2025年3月7日
    200
  • Node.js进行调试的几种方法介绍

    相关推荐:《nodejs 教程》 调试是解决程序问题的必备工具,在最早的时候 Node 的调试有些麻烦,社区也有不少工具包辅助,现在 Node 的调试已经比较简单,常用的有几种 Chrome DevTools Chrome 开发者工具交互通…

    2025年3月7日 编程技术
    200
  • Node.js中如何创建和提取zip文件?方法介绍

    相关推荐:《nodejs 教程》 Zip文件是常用的压缩文件格式。大多数开发人员最终使用tarball而不是zip文件。但在某些情况下,您需要使用zip文件,例如将函数上载到AWS Lambda。在本文中,我将演示如何用 adm-zip n…

    2025年3月7日
    200
  • 了解一下Node.js中的文件夹写入

    本篇文章给大家介绍一下node.js中的文件夹写入。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《node js教程》 fs.Dir & fs.Dirent fs.Dir 是可迭代的目录流的类,fs.…

    2025年3月7日
    200
  • 浅谈Node.js监视文件变化的方法

    相关推荐:《nodejs 教程》 fs.FSWatcher fs.FSWatcher类 继承了 EventEmitter,用于监视文件变化,调用 fs.watch 后返回一个 fs.FSWatcher 实例,每当指定监视的文件被修改时,实例…

    2025年3月7日
    200
  • 如何利用nvm工具来管理node版本?方法介绍

    相关推荐:《node js教程》 nvm 是一种流行的运行 Node.js 的方式。 例如,它可以轻松地切换 Node.js 版本,也可以安装新版本用以尝试并且当出现问题时轻松地回滚。 这对于使用旧版本的 Node.js 来测试代码非常有用…

    2025年3月7日 编程技术
    200
  • Node.js学习之静态资源服务器

    相关推荐:《nodejs 教程》 在创建 HTTP 服务器实现了一个最简单的静态资源服务器,可以对代码进行写改造,增加文件夹预览功能,暴露出一些配置,变成一个可定制的静态资源服务器模块 模块化 可定制的静态资源服务器理想的使用方式应该是这样…

    2025年3月7日 编程技术
    200
  • Node.js和java后台服务器的简单比较

    最近去了新公司,又拾起了被我抛下许久的后端了,不过因为公司的需求,后端采用Nodejs,最近一直在学习Node.js,随着逐渐深入的了解,发现真的Node.js能越来越变得热门是有其存在的道理的。可能有人会说,Java作为后端语言一直隐隐有…

    2025年3月7日
    200
  • node.js“多线程”如何处理高并发任务?

    下面本篇文章给大家介绍一下使用 nodejs “多线程”处理高并发任务的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《nodejs视频教程》 摩尔定律 摩尔定律是由英特尔联合创始人戈登·摩尔(Gordo…

    2025年3月7日 编程技术
    200
  • 卸载Node.js的方法

    怎么卸载nodejs?下面本篇文章给大家介绍一下卸载node.js的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《nodejs视频教程》 Node.js的卸载 在控制面板-程序-程序和功能中卸载 确保n…

    2025年3月7日
    200

发表回复

登录后才能评论