`Object.defineProperty(exports, '__esModule', { value: true })` 与 `exports.__esModule = true`

`Object.defineProperty(exports, '__esModule', { value: true })` vs `exports.__esModule = true`

我认为这是:

Object.defineProperty(exports, '__esModule', { value: true })

应该给出与此相同的结果:

exports.__esModule = true

但我见过的所有 UMD 包生成器都使用了第一个选项。有什么原因吗?

Object.defineProperty() 与通常分配 属性 有不同的默认值。具体来说,如果不指定,以下属性都默认为false

configurable
enumerable
writable

因此,Object.defineProperty(exports, '__esModule', { value: true }) 将具有相同的值,但不可配置、不可枚举或可写,而 exports.__esModule = true 将所有这些属性默认为 true

您可以在 Object.definePropert() here on MDN 上阅读有关此级别的详细信息。

But all UMD bundle generators I've seen have used the first option. Is there a reason?

据推测,这些工具的设计者希望 属性 配置为无法更改(可写)或删除(可配置)或枚举。