谁能解释一下为什么CommonJS是动态的,而ES是静态的?在这种情况下,动态和静态是什么意思?此外,我对解析时间和运行时间之间的区别也很困惑,希望有人也能解释一下。谢谢!
发布于 2021-05-08 08:28:17
说“解析时间”有点学究,因为它指的是运行应用程序之前的时间,通常称为编译时间。模块允许在“解析时”运行之前,检查和映射与每个模块的文件位置、导入和导出相关的一些代码。在运行单个函数之前,每个函数都会被解析,这意味着它的名称和其他属性被组合在一起,以便其他模块可以导入它们。此时函数调用的结果和变量的值是未知的,但函数本身是已知的。
当使用ES导入时,导入的变量、函数等通常不会动态组装(有一个部分实现的提案文档here),这是在运行时发生的。使用ES,程序会显式地声明依赖关系,而不考虑任何程序差异。以不同的顺序导入并不重要。无论导入的代码是否可靠,结果都是相同的-即,在将任何代码评估为任何值之前,导入语句都是正确或不正确的。
因为CommonJS一次比ES一次评估更多的代码,所以如果以顺序的方式跟踪,就会知道更多。其中一个含义是,一个require语句的字符串中的代码可以有变量,从而使语句成为动态的,但ES不能。ES导出会被解析,但在计算import语句时,导入整个模块的其他模块将无法使用整个模块。
有一个MDN article可以更彻底地解释这一点。
https://stackoverflow.com/questions/62421092
复制相似问题