【问题标题】:Why export * and import * work differently in ES2015 module为什么 export * 和 import * 在 ES2015 模块中的工作方式不同
【发布时间】:2019-03-08 20:03:32
【问题描述】:

在 ES2015 模块中,export * from 'someModule' 不会从“someModule”导出默认导出,而import * as m from 'someModule' 从“someModule”导入默认导出。

例如在module.js中:

export default 'default'
export const foo = 'foo'

在 proxy.js 中:

export * from './module'

在 bar.js 中:

import * as m from './module'  // m is { foo: 'foo', default: 'default' }
import * as p from './proxy'  // p is { foo: 'foo' }

我已经使用 webpack 4.29.6(零配置)对其进行了测试。

MDN 写道:

以下语法不会从 导入模块:

从……导出 *;

如果您需要导出默认值,请改写以下内容:

从 'mod' 导出 {default};

export * from 'someModule' 不从“someModule”导出默认导出是合理的,因为当前模块可能还想导出自己的默认模块。但是为什么import * 仍然包含默认导出?这是 ES2015 模块规范的预期行为吗?

【问题讨论】:

  • 在我看来import * 包含所有已导出的内容似乎是合乎逻辑的。如果有原因导致 2 个导出之间存在差异(并且您已说明),则反映在导入上是正常的。 (如果它是另一种方式,默认将总是丢失,如果你考虑一下)
  • 我很惊讶 import 语句中的 * 和 export 语句中的 * 不是同一个意思。在尝试之前我得到了错误的想法。

标签: javascript ecmascript-6 module


【解决方案1】:

但是为什么import * 仍然包含默认导出?

模块命名空间对象包括模块的所有导出。这里的标识符default 没有什么特别之处。没有理由明确省略它。

这是 ES2015 模块规范的预期行为吗?

是的。

export * from 'someModule' 不从“someModule”导出默认导出是合理的,因为当前模块可能还想导出自己的默认模块。

Afaik,异常的实际原因是您可以从多个模块中export * 而不会让它们的default 导出发生冲突。

【讨论】:

    猜你喜欢
    • 2021-08-01
    • 2021-08-30
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多