【发布时间】:2019-02-12 03:28:04
【问题描述】:
我正在关注一个教程,它说
ES 模块使用实时绑定。这意味着支持周期性的功能 依赖关系。
但我并不清楚这个概念。这是什么意思?
【问题讨论】:
-
你能提供更多的上下文吗?什么是 ESM?
-
我认为 ESM 意味着 ES Modules @barmar
标签: javascript binding es6-modules
我正在关注一个教程,它说
ES 模块使用实时绑定。这意味着支持周期性的功能 依赖关系。
但我并不清楚这个概念。这是什么意思?
【问题讨论】:
标签: javascript binding es6-modules
实时绑定是 ES 模块中引入的一个概念。这意味着当导出模块更改一个值时,该更改将从导入端可见。这不是 CommonJS 模块的情况。模块导出在 CommonJS 中复制。因此导入模块看不到导出端发生的变化。
export let count = 1;
export function increment() {
++count;
}
import { count, increment } from './counter.mjs';
console.log(count);
increment();
console.log(count);
$ node --experimental-modules index.mjs
1
2
let count = 1;
function increment() {
++count;
}
exports.count = count;
exports.increment = increment;
const { count, increment } = require('./counter.js');
console.log(count);
increment();
console.log(count);
$ node index.js
1
1
有关该主题的更多资源:
【讨论】:
increment 函数应该改变exports.count。然后变化无处不在。
Module exports are copied in CommonJS 是错误的。名为“exports”的对象被导出到每个使用 require() 的文件中,对该对象所做的任何更改都会反映在每个使用 require() 的文件中
function increment() { export.count += 1 }
在 CJS 中,require("./foo") 为您提供对 foo.js 的 exports 对象的引用。
foo.js 中将exports.x 设置为0
exports.x = 0
bar.js 中,我们获得了对 foo 导出的引用并对其进行了变异:const fooExports = require("./foo")
fooExports.x += 1
现在我们在main.js 中执行所有操作
const fooExports = require("./foo") // getting a reference to exports
console.log(fooExports.x) // x is indeed 0
require("./bar") // we execute bar.js that mutate exports
console.log(fooExports.x) // x is now 1, because fooExports is a reference to exports
TLDR:我们从require 收到的不是副本。它是对exports 对象的引用。
【讨论】: