Javascript commonjs在导出和请求过程中如何制作两个副本?
我从中了解了CommonJS,但在理解以下代码方面遇到了困难: 在本例中,我们基本上制作了模块的两个副本:一个是 我们出口它,当我们需要它的时候,我们就出口一个。此外,副本 main.js现在已与原始模块断开连接。这就是为什么 当我们增加计数器时,它仍然返回1 — 因为柜台 我们导入的变量是计数器的断开连接的副本 来自模块的变量Javascript commonjs在导出和请求过程中如何制作两个副本?,javascript,module,commonjs,Javascript,Module,Commonjs,我从中了解了CommonJS,但在理解以下代码方面遇到了困难: 在本例中,我们基本上制作了模块的两个副本:一个是 我们出口它,当我们需要它的时候,我们就出口一个。此外,副本 main.js现在已与原始模块断开连接。这就是为什么 当我们增加计数器时,它仍然返回1 — 因为柜台 我们导入的变量是计数器的断开连接的副本 来自模块的变量 因此,如果创建了两个副本,那么每个副本不都有自己版本的计数器和增量?因此,每一个都将连接到它们自己的增量?作者说module.exports中有一个计数器、增量、和减量
因此,如果创建了两个副本,那么每个副本不都有自己版本的
计数器
和增量
?因此,每一个都将连接到它们自己的增量
?作者说module.exports中有一个计数器
、增量
、和减量
,另一个副本在var counter=require(“../../lib/counter”)中
因此,计数器.increment
不应该调用require copy和控制台.log(counter.counter)中的increment
函数
在require copy中返回已连接的计数器?我认为这句话是为了对比ES6模块和nodejs CommonJS模块。这并不完全正确
当你需要一个模块时,这里有一些你需要了解的东西
require
在幕后是如何工作的
简而言之,执行并缓存调用require
所需的模块代码。
在执行模块代码之前,Node.js将使用函数包装器()对其进行包装。这确保了顶级变量(如计数器)作用域为模块,而不是全局对象。这意味着,如果导出要在另一个模块中使用的函数,它可以作为与模块中声明的变量相关的函数。最后返回module.exports
的内容
对于基本类型和对象类型,值赋值是如何发生的
让我们看看lib/counter.js的模块.exports
您将看到它正在导出一个原语值(计数器
)加上两个函数(递增
和递减
)。计数器
作为原语值由其值复制,即数字1被设置为模块的值。exports.counter
而递增和递减(都是一级对象)通过其引用进行复制。实际上,module.exports.increment
和module.exports.decreation
都是与其主体内使用的计数器
变量相关的闭包。
您可以在post中阅读有关基本体与对象分配的更多信息
最后,在main.js
中,counter
变量(从计数器中获取module.exports的内容)是一个具有以下键的对象
计数器-它是number类型的基元值
增量-它是指向闭包的指针
减量-它也是一个指向闭包的指针
因此,您可以看到函数中的计数器变量是指计数器模块中定义的变量。由于counter.counter
值仅通过其值导出,因此对其进行的任何操作都不会对原始模块变量产生影响。我认为该声明是为了实现ES6模块之间的对比vs nodejs CommonJS模块。它不完全正确
当你需要一个模块时,这里有一些你需要了解的东西
require
在幕后是如何工作的
简而言之,执行并缓存调用require
所需的模块代码。
在执行模块代码之前,Node.js将使用函数包装器()对其进行包装。这确保了顶级变量(如计数器)作用域为模块,而不是全局对象。这意味着,如果导出要在另一个模块中使用的函数,它可以作为与模块中声明的变量相关的函数。最后返回module.exports
的内容
对于基本类型和对象类型,值赋值是如何发生的
让我们看看lib/counter.js的模块.exports
您将看到它正在导出一个原语值(计数器
)加上两个函数(递增
和递减
)。计数器
作为原语值由其值复制,即数字1被设置为模块的值。exports.counter
而递增和递减(都是一级对象)通过其引用进行复制。实际上,module.exports.increment
和module.exports.decreation
都是与其主体内使用的计数器
变量相关的闭包。
您可以在post中阅读有关基本体与对象分配的更多信息
最后,在main.js
中,counter
变量(从计数器中获取module.exports的内容)是一个具有以下键的对象
计数器-它是number类型的基元值
增量-它是指向闭包的指针
减量-它也是一个指向闭包的指针
因此,您可以看到函数中的计数器变量是指计数器模块中定义的变量。由于counter.counter
值仅通过其值导出,因此对其进行的任何操作都不会对原始模块变量产生影响
// lib/counter.js
var counter = 1;
function increment() {
counter++;
}
function decrement() {
counter--;
}
module.exports = {
counter: counter,
increment: increment,
decrement: decrement
};
// src/main.js
var counter = require('../../lib/counter');
counter.increment();
console.log(counter.counter); // 1