为什么导出*和导入*在ES2015模块中的工作方式不同

时间:2019-03-08 08:59:16

标签: javascript ecmascript-6 module

在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模块规范中的预期行为吗?

1 个答案:

答案 0 :(得分:1)

  

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

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

  

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

是的

  

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

Afaik,发生该异常的实际原因是,您可以从多个模块中export *进行操作,而不会使其default的输出冲突。