es6模块如何导入自己?

Mr.*_*ice 8 javascript ecmascript-6 webpack es6-module-loader

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

import * as fooModule from './fooModule';

export function logFoo() {
  console.log(fooModule)
}
Run Code Online (Sandbox Code Playgroud)

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

Ber*_*rgi 10

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

解决方案是,a import不会将值导入变量,而是使变量成为导出变量的引用.看看这里有一个可变变量的例子,并在这个问题上找到确切的术语.
对于模块命名空间对象也是如此 - 它们的属性只是解析为实际导出变量的getter.

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

  1. 对源进行静态分析,exportimport声明构建依赖图
  2. 模块范围已创建
  3. 由于模块的唯一依赖性本身,并且已经初始化,因此不需要等待它
  4. 所述fooModule被创建的变量和实例化与所述模块的出口名称,这是众所周知的是一个对象["logFoo"].该fooModule.logFoo属性成为一个getter,将评估logFoo模块范围中的变量(如果您已经使用过export {A as B},那么fooModule.B将解析为A,但在您的情况下,两个名称都是相同的).
  5. 模块范围中的变量声明创建变量,在您的情况下logFoo,函数声明被初始化(即被logFoo赋予函数)
  6. 运行模块代码(在您的情况下,没有任何反应)

现在,当您调用logFoo导入它的模块时,fooModule将引用包含的命名空间logFoo.没有魔法:-)

  • @aaaaaa 我只能想到两个用例:获取自己的模块命名空间对象(用于动态属性访问、默认导出等 - 避免手动构造这样的对象),以及访问自己的 [匿名默认导出]( http://stackoverflow.com/a/35225936/1048572)(当由于某种原因无法命名时)。 (2认同)