Node.js:模块查找,引用及缓存机制详解

下面为您详细讲解“Node.js:模块查找,引用及缓存机制详解”的完整攻略。

Node.js:模块查找、引用及缓存机制详解

模块查找

在 Node.js 中,require 方法用于加载模块。当加载一个模块时,Node.js 需要使用一定的规则来查找该模块,这些规则将在下面详细解释。

核心模块

当加载一个核心模块时,Node.js 会优先从内置的核心模块列表中查找该模块,该列表包含了一些 Node.js 内部实现的模块。如果该模块没有找到,Node.js 会接着进行下一步查找。

文件模块

如果要加载的模块不是核心模块,Node.js 将会将其视为文件模块。文件模块通常是开发者编写的 JavaScript 代码文件或者是其他 Node.js 模块。

当加载一个文件模块时,Node.js 会依次尝试以下四个操作:

  1. 将模块路径解析为绝对路径;
  2. 将解析后的路径缓存起来,以优化下一次查找;
  3. 检查是否为已缓存的模块,如果发现已缓存的模块,Node.js 会直接返回该模块;
  4. 如果是第一次加载该模块,则根据路径读取该模块文件并编译。

包模块

当加载一个文件模块时,如果该模块是一个包模块,则 Node.js 会按照以下步骤查找加载的 module 目录下 package.json 文件中的 main 指定的入口文件。

  1. 在 module 目录下查找是否存在 package.json 文件,如果不存在将作为普通文件模块处理;
  2. 如果存在 package.json 文件,Node.js 将读取该文件,并去读取 main 指定的入口文件;
  3. 如果不存在 main 指定的入口文件,则 Node.js 将查找 index.js 或 index.node,如果都不存在将作为普通文件模块处理;
  4. 根据入口文件的完整路径读取该模块,并编译执行。

模块引用

在 Node.js 中,模块相当于一个包含多个函数和变量的 JavaScript 文件。

Node.js 中的 require 方法用于加载模块。

例如,下面的代码用于加载 Node.js 的内置模块 http

var http = require('http');

上面的代码可以将 Node.js 内置的 http 模块加载进来,并将它赋值给变量 http。在代码的后续部分,您可以使用 http 变量来调用 http 模块的各种方法和属性。

如果要引用其他文件(如一个名为 utils.js 的 JavaScript 文件),您可以通过以下代码实现:

var utils = require('./utils');

在上面的代码中,我们使用 require 方法将 utils.js 加载为一个模块,并将它赋值给变量 utils。

需要注意的是,相对路径 ./utils 中的 ./ 是必需的,它告诉 Node.js 找到 utils.js 的位置是相对于当前文件的目录。

模块缓存

为了提高模块的加载速度,Node.js 会使用一个称为“模块缓存”的机制,用于缓存已经加载的模块。

当第一次加载一个文件模块时,Node.js 在加载过程中会将该模块缓存起来。之后如果在该进程中需要再次加载该模块,Node.js 将直接从内存中读取该模块。缓存的机制既能提高性能,也能减少磁盘 I/O。

在 Node.js 中,模块缓存是以一个对象来实现的,其中该对象的键为模块的绝对路径名,值则为模块的导出对象。这个对象存在 process 对象的缓存属性中。

Node.js 使用过 require 方法加载的模块都会被存储在该对象中。

模块缓存的实例

下面我们来看一个例子,假设我们有一个名为 a.js 的 JavaScript 文件:

// a.js
console.log('a.js 被加载了!');
module.exports = function () {
  console.log('a.js 被执行了!');
}

接下来,让我们来编写一个名为 demo.js 的文件,它将会利用 a.js 文件:

// demo.js
var a = require('./a');
a();

运行 demo.js 文件时,我们可以看到以下输出:

a.js 被加载了!
a.js 被执行了!

在第一次加载 a.js 文件时,我们可以看到 a.js 被加载了!这一输出信息。这是因为本质上 Node.js 是在编译和执行 demo.js 代码时才加载了 a.js 文件。

另外,当第二次对 a.js 文件进行 require 时,我们将无法看到 a.js 被加载了的输出信息了。这是因为第一次 require 已经将其缓存,并在内存中保存起来了。执行 a() 后,我们会发现一条新的输出:a.js 被执行了!这意味着在第一次对 a.js 文件进行 require 时,a.js 这个模块已经被读入内存,并且它的代码已经被执行。因此,当再次调用 a() 时,不会有任何 loading 的事件出现。

这就是 Node.js 中模块缓存的机制。

清除模块缓存

但是,如何在运行时清除缓存呢?这可以通过下面的语句实现:

delete require.cache[require.resolve('./a')];

上述语句将通过 require.resolve() 查找指定模块的本地路径名,并将 Node.js 中 require 方法使用的缓存对象中的该模块删除。

由于 Node.js 中 require 方法具有缓存特性,我们需要小心,在调试和开发阶段时可能需要经常手动清除缓存。

总结

在本文中,我们详细介绍了 Node.js 中模块查找、引用及缓存机制的相关知识。我们介绍了模块查找中的核心模块、文件模块和包模块。我们还了解了如何使用 require 方法加载模块,以及如何访问被加载模块的属性和方法。最后,我们了解了 Node.js 中模块缓存的机制,以及如何清除缓存。

希望本文可以帮助您深入了解 Node.js 中的模块加载机制,这有助于更好地理解 Node.js 的本质。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.js:模块查找,引用及缓存机制详解 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • AngularJS 2.0入门权威指南

    AngularJS 2.0入门权威指南 AngularJS 是一款流行的前端 JavaScript 框架,可以通过 web 应用程序构建可扩展和动态交互的用户界面。AngularJS 版本 2.0 是 AngularJS 的下一个版本,具有很多新的功能和增强的性能。要学习 AngularJS 2.0 ,以下是完整攻略。 安装 AngularJS 2.0 要使…

    node js 2023年6月8日
    00
  • 初学者AngularJS的环境搭建过程

    下面是初学者AngularJS的环境搭建过程的完整攻略: 1. Node.js和npm安装 AngularJS是基于Node.js开发的,因此需要先在系统上安装Node.js和npm。具体的安装过程请参考Node.js和npm官网说明文档,这里不再赘述。 2. 安装Angular CLI Angular CLI是一个命令行工具,用于从模板快速生成Angula…

    node js 2023年6月9日
    00
  • Nodejs之http的表单提交

    首先,在Node.js中,通过使用内置的http模块,我们可以轻松地创建一个Web服务器。本文将围绕如何实现HTTP表单提交展开,先介绍如何在Node.js中创建一个简单的Web服务器,然后展示如何接收并处理表单提交数据。 创建Web服务器 我们先来看一下如何使用Node.js的http模块创建一个简单的Web服务器,示例代码如下: const http =…

    node js 2023年6月8日
    00
  • js select option对象小结

    下面是针对“js select option对象小结”的完整攻略: 什么是select option对象 select option对象是指HTML中的下拉列表控件(\<select>标签)中的选项(\<option>标签)的一种JavaScript对象表示方式,它包含了选项的各种属性以及相关方法,可以通过这个对象来动态修改下拉列表内…

    node js 2023年6月8日
    00
  • node.js中的path.normalize方法使用说明

    下面是详细讲解“node.js中的path.normalize方法使用说明”的完整攻略。 什么是path.normalize方法 在node.js中,path模块提供了一系列与路径相关的方法,其中之一就是normalize方法。normalize方法的作用是规范化一个路径,消除路径中的冗余部分并将其转换为标准格式。这在处理路径时非常有用,尤其是在跨平台开发时…

    node js 2023年6月8日
    00
  • Nest.js系列之Providers及模块功能使用详解

    让我为你详细讲解“Nest.js系列之Providers及模块功能使用详解”。 一、Providers及模块功能介绍 Nest.js是一个基于Node.js的Web框架,它使用了现代化的技术,帮助我们快速地开发可伸缩且易于维护的Web应用程序。其中,Providers及模块功能是其核心机制之一。下面,我们就来一一了解。 1. Providers 在Nest.…

    node js 2023年6月8日
    00
  • 详解axios在node.js中的post使用

    详解axios在node.js中的post使用攻略 什么是axios? axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。它支持请求和响应拦截、转换请求数据和响应数据、自动转换 JSON 数据、取消请求等一系列常用功能。 安装axios 在 node.js 中使用 axios,需要通过 npm 安装 axios,…

    node js 2023年6月8日
    00
  • node安装–linux下的快速安装教程

    下面我将详细讲解“node安装–linux下的快速安装教程”的完整攻略。 1. 安装nodeJS 在Linux系统下,安装NodeJS需要进行以下步骤: 1.1 添加NodeJS官方源 在终端中执行以下命令: curl -sLhttps://deb.nodesource.com/setup_14.x | sudo -E bash – 1.2 安装NodeJ…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部