实时绑定是什么意思?

问题描述 投票:0回答:3

我正在遵循一个教程,它说

ES 模块使用实时绑定。这意味着支持周期性的功能 依赖关系。

但是我不太清楚这个概念。这是什么意思?

javascript binding es6-modules
3个回答
23
投票

实时绑定是 ES 模块中引入的概念。这意味着当导出模块更改值时,更改将从导入器端可见。 CommonJS 模块的情况并非如此。模块导出被复制到 CommonJS 中。因此导入模块无法看到导出方发生的更改。


ESM

计数器.mjs

export let count = 1;
export function increment() {
    ++count;
}

index.mjs

import { count, increment } from './counter.mjs';
console.log(count);
increment();
console.log(count);

输出

$ node --experimental-modules index.mjs
1
2

CJS

counter.js

let count = 1;
function increment() {
    ++count;
}

exports.count = count;
exports.increment = increment;

index.js

const { count, increment } = require('./counter.js');
console.log(count);
increment();
console.log(count);

输出

$ node index.js
1
1

有关该主题的更多资源:


0
投票
在 CJS 中,

require("./foo")

 为您提供对 
exports
foo.js
 对象的引用。

    让我们在
  1. exports.x
     中将 
    foo.js
    设置为 0
exports.x = 0

  1. 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
 对象的引用。


0
投票
如果有人真的想要的话,也许另外值得注意的是在普通的旧 JavaScript 中支持“实时绑定”。

var o = { x: 5 } function increment () { o.x++ } with (o) { console.log(x) // 5 increment() console.log(x) // 6 }
因此,您可以编写模块和包装器来获得所需的行为,而无需使用 ESM。

© www.soinside.com 2019 - 2024. All rights reserved.