问题描述
我试图弄清楚 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。
要知道的两件事。
-
有一个需要缓存。所以 require 中提到的每个模块都只加载一次,即使它在代码的各个部分的 require 操作中多次提到。
-
每个模块都被 require 实现包裹起来。
(function (exports,require,module,__filename,__dirname) {
const obj = require("./data_two.js");
console.log(obj);
})
因此,const obj
的作用域是模块的本地作用域,而不是包含 require 的作用域的本地作用域。
如果您习惯于像 php 这样的语言,其中 require 操作基本上是从模块中剪切代码并将其粘贴到 require 的位置,这可能会令人困惑。