es6模块如何导入自己?

时间:2016-10-25 12:59:15

标签: javascript ecmascript-6 webpack es6-module-loader

我有一个名为fooModule的模块。在这个模块中,我导入fooModule(本身):

import * as fooModule from './fooModule';

export function logFoo() {
  console.log(fooModule)
}

调用logFoo()时,我可以看到fooModule的所有导出。 这是如何运作的?

1 个答案:

答案 0 :(得分:10)

循环依赖对于声明性导入/导出没有问题。在你的情况下,圆圈的长度最小: - )

解决方案是import不会将值导入变量,而是将变量作为引用变量导出变量。请查看here以获取可变变量的示例,并在this question查看完整的术语。
模块命名空间对象也是如此 - 它们的属性只是解析为实际导出变量的getter。

因此,在加载和评估模块时,会发生以下步骤:

  1. exportimport声明进行静态分析,以构建依赖关系图
  2. 创建模块范围
  3. 由于模块的唯一依赖性本身,并且已经初始化,因此不需要等待它
  4. 创建fooModule变量并将其实例化为具有模块导出名称的对象,已知为["logFoo"]fooModule.logFoo属性将成为评估模块范围中logFoo变量的getter(如果您使用了export {A as B},那么fooModule.B将解析为A ,但在你的情况下,两个名字是相同的。)
  5. 模块范围中的变量声明创建变量,在您的情况下logFoo,并初始化函数声明(即为logFoo分配函数)
  6. 运行模块代码(在您的情况下,没有任何反应)
  7. 现在,当您在导入它的模块中调用logFoo时,fooModule将引用包含logFoo的命名空间。没有魔法: - )