Node 如何真正解析 COMMON JS 模块?确定顺序和缓存的幕后确切算法是什么?

问题描述

我试图弄清楚 Node 中的 COMMON JS 模块是如何真正加载和解析的。决定特定执行顺序和缓存的算法和逻辑是什么?

例如,以下是这三个模块:

模块一:

const obj = require("./data_two.js");
require("./data_three.js");
obj.age = 44;

模块二:

module.exports = {
  name: "Peter",surname: "Smith",};

模块三:

const obj = require("./data_two.js");
console.log(obj);

现在,模块一由 Node 执行,输出如下:

{ name: 'Peter',surname: 'Smith' }

为什么没有将财产年龄添加输出中?任何人都可以解释这个或指导我使用一些有用的资源,以便我可以掌握引擎盖下的逻辑?

我在网上搜索了深入的解释,但一无所获...

解决方法

每个模块都有自己的作用域。在您的示例中的模块三中,它的 const obj 隐藏了需要它的模块中的 const obj

`toobz 中充满了对这个模块加载过程的体面解释。这是just one

要知道的两件事。

  1. 有一个需要缓存。所以 require 中提到的每个模块都只加载一次,即使它在代码的各个部分的 require 操作中多次提到。

  2. 每个模块都被 require 实现包裹起来。

(function (exports,require,module,__filename,__dirname) {
    const obj = require("./data_two.js");
    console.log(obj);
})

因此,const obj 的作用域是模块的本地作用域,而不是包含 require 的作用域的本地作用域。

如果您习惯于像 php 这样的语言,其中 require 操作基本上是从模块中剪切代码并将其粘贴到 require 的位置,这可能会令人困惑。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...