【发布时间】:2020-10-06 19:19:37
【问题描述】:
有人能解释一下为什么 CommonJS 是动态的,而 ES 是静态的吗?在这种情况下,动态和静态意味着什么?而且我对解析时间和运行时间之间的区别感到很困惑,希望有人也能解释一下。谢谢!
【问题讨论】:
-
“静态”指的是static analysis,用于在不执行代码的情况下确定模块具有哪些依赖项。
标签: javascript commonjs es6-modules
有人能解释一下为什么 CommonJS 是动态的,而 ES 是静态的吗?在这种情况下,动态和静态意味着什么?而且我对解析时间和运行时间之间的区别感到很困惑,希望有人也能解释一下。谢谢!
【问题讨论】:
标签: javascript commonjs es6-modules
说“解析时间”有点迂腐,因为这是指运行应用程序之前的时间,通常称为编译时间。模块允许在运行之前检查和映射与每个模块的文件位置、导入和导出相关的一些代码 - 在“解析时间”。在运行单个函数之前,会解析每个函数,这意味着它的名称和其他属性被组装,以便其他模块可以导入它们。此时函数调用的结果和变量的值是未知的,但函数本身是已知的。
使用 ES 导入时,导入的变量、函数等不是通常动态组装的(有一个部分实现的提案记录在 here),这发生在运行时。使用 ES 程序显式声明依赖关系,而不管任何程序差异。以不同的顺序导入并不重要。无论导入的代码是否健全,结果都是相同的——即静态的,并且在任何代码被评估为任何值之前,导入语句是正确还是不正确。
因为 CommonJS 一次计算的代码比 ES 多,所以如果以顺序方式执行,就会知道更多。其中一个含义是 require 语句的字符串中的代码可以有变量,使语句动态,但 ES 不能。 ES 导出被解析,但在评估 import 语句时,整个模块对导入它的其他模块不可用。
有一个MDN article 更彻底地解释了这一点。
【讨论】: