【问题标题】:What does it mean by live bindings?实时绑定是什么意思?
【发布时间】:2019-02-12 03:28:04
【问题描述】:

我正在关注一个教程,它说

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

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

【问题讨论】:

  • 你能提供更多的上下文吗?什么是 ESM?
  • 我认为 ESM 意味着 ES Modules @barmar

标签: javascript binding es6-modules


【解决方案1】:

实时绑定是 ES 模块中引入的一个概念。这意味着当导出模块更改一个值时,该更改将从导入端可见。这不是 CommonJS 模块的情况。模块导出在 CommonJS 中复制。因此导入模块看不到导出端发生的变化。


ESM

counter.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

有关该主题的更多资源:

【讨论】:

  • 值得注意的是,Live Bindings 为导出器和导入器提供了一个公共内存地址,即两者都指向同一个内存位置。
  • 这个答案其实是错误的。在 commonJS 中,exporter 所做的更改实际上无处不在。 CJS 示例中的increment 函数应该改变exports.count。然后变化​​无处不在。
  • Module exports are copied in CommonJS 是错误的。名为“exports”的对象被导出到每个使用 require() 的文件中,对该对象所做的任何更改都会反映在每个使用 require() 的文件中
  • 函数应该是function increment() { export.count += 1 }
【解决方案2】:

在 CJS 中,require("./foo") 为您提供对 foo.jsexports 对象的引用。

  1. 让我们在foo.js 中将exports.x 设置为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 对象的引用。

【讨论】:

    猜你喜欢
    • 2011-09-13
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2010-11-07
    相关资源
    最近更新 更多