node.js—如何解析常见的js模块,并最终由节点执行?幕后决定顺序和缓存的确切算法是什么?

szqfcxe2  于 2021-10-10  发布在  Java
关注(0)|答案(1)|浏览(400)

我试图弄清楚node中常见的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);

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

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

为什么没有将财产年限添加到输出中?有没有人能解释一下,或者告诉我一些有用的资源,以便我能够掌握幕后的逻辑?
我在网上搜索了一个深刻的解释,但什么也没找到。。。

2jcobegt

2jcobegt1#

每个模块都有自己的范围。在您的示例中的模块三中 const obj 隐藏 const obj 在需要它的模块中。
“toobz”中有很多关于这个模块加载过程的合理解释。这里只有一个。
有两件事需要知道。
有一个必需的缓存。因此,require中提到的每个模块只加载一次,即使在代码的各个部分的require操作中多次提到它。
每个模块都由require实现 Package 成这样。

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

那么,范围是什么? const obj 是模块的本地,而不是包含需求的范围的本地。
如果您习惯于像php这样的语言,其中require操作基本上是从模块中剪切代码并将其粘贴到require的位置,那么这可能会令人困惑。

相关问题