es6 模块如何导入自身?

How can an es6 module import itself?

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

import * as fooModule from './fooModule';

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

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

循环依赖对于声明式来说没有问题imports/exports。在你的情况下,圆圈的长度是最小的:-)

解决方案是 import 不将值导入变量,而是使变量成为导出变量的 引用。查看 here for an example of a mutable variable, and at 了解确切的术语。
模块命名空间对象也是如此——它们的属性只是解析为实际导出变量的 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 的命名空间。没有魔法:-)