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。
因此,当您的模块被加载和评估时,会发生以下步骤:
- 针对
export
和 import
声明对源进行静态分析以构建依赖关系图
- 模块范围已创建
- 因为你的模块唯一的依赖是它本身,而且它已经被初始化,所以不需要等待它
- 创建
fooModule
变量并将其实例化为具有模块导出名称的对象,已知为 ["logFoo"]
。 fooModule.logFoo
属性 变成一个 getter ,它将计算为模块范围内的 logFoo
变量(如果您使用了 export {A as B}
,那么 fooModule.B
将解析为 A
,但在您的情况下,两个名称相同)。
- 模块作用域中的变量声明创建变量,在您的情况下
logFoo
,函数声明被初始化(即 logFoo
被分配函数)
- 模块代码是运行(在你的情况下,没有任何反应)
现在,当您在导入它的模块中调用 logFoo
时,fooModule
将引用包含 logFoo
的命名空间。没有魔法:-)
我有一个名为 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。
因此,当您的模块被加载和评估时,会发生以下步骤:
- 针对
export
和import
声明对源进行静态分析以构建依赖关系图 - 模块范围已创建
- 因为你的模块唯一的依赖是它本身,而且它已经被初始化,所以不需要等待它
- 创建
fooModule
变量并将其实例化为具有模块导出名称的对象,已知为["logFoo"]
。fooModule.logFoo
属性 变成一个 getter ,它将计算为模块范围内的logFoo
变量(如果您使用了export {A as B}
,那么fooModule.B
将解析为A
,但在您的情况下,两个名称相同)。 - 模块作用域中的变量声明创建变量,在您的情况下
logFoo
,函数声明被初始化(即logFoo
被分配函数) - 模块代码是运行(在你的情况下,没有任何反应)
现在,当您在导入它的模块中调用 logFoo
时,fooModule
将引用包含 logFoo
的命名空间。没有魔法:-)