我正在遵循一个教程,它说
ES 模块使用实时绑定。这意味着支持周期性的功能 依赖关系。
但是我不太清楚这个概念。这是什么意思?
实时绑定是 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
有关该主题的更多资源:
require("./foo")
为您提供对
exports
的
foo.js
对象的引用。
exports.x
中将 foo.js
设置为 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
对象的引用。
var o = { x: 5 }
function increment () { o.x++ }
with (o) {
console.log(x) // 5
increment()
console.log(x) // 6
}
因此,您可以编写模块和包装器来获得所需的行为,而无需使用 ESM。