Javascript CommonJS vs ES模块

Javascript CommonJS vs ES模块,javascript,commonjs,es6-modules,Javascript,Commonjs,Es6 Modules,有人能解释为什么CommonJS是动态的,而ES是静态的吗?在这种情况下,动态和静态意味着什么?我也对解析时间和运行时间之间的区别感到困惑,希望有人能解释一下。谢谢 说“解析时间”很迂腐,因为这是指运行应用程序之前的时间,通常称为编译时间。模块允许在“解析时”运行某些代码之前,根据每个模块的文件位置、导入和导出检查和映射这些代码。在运行单个函数之前,每个函数都会被解析,这意味着它的名称和其他属性会被组装起来,以便其他模块可以导入它们。函数调用的结果和此时变量的值未知,但函数本身是已知的 使用ES

有人能解释为什么CommonJS是动态的,而ES是静态的吗?在这种情况下,动态和静态意味着什么?我也对解析时间和运行时间之间的区别感到困惑,希望有人能解释一下。谢谢

说“解析时间”很迂腐,因为这是指运行应用程序之前的时间,通常称为编译时间。模块允许在“解析时”运行某些代码之前,根据每个模块的文件位置、导入和导出检查和映射这些代码。在运行单个函数之前,每个函数都会被解析,这意味着它的名称和其他属性会被组装起来,以便其他模块可以导入它们。函数调用的结果和此时变量的值未知,但函数本身是已知的

使用ES导入时,导入的变量、函数等通常不是动态组装的(有一个部分实现的方案记录),这发生在运行时。使用ES,程序会显式地声明依赖项,而不考虑任何程序差异。以不同的顺序导入并不重要。无论导入的代码是否正确,结果都是相同的,即静态的,在将任何代码计算为任何值之前,导入语句是正确的或不正确的

因为CommonJS一次对代码的求值比ES多,所以如果按顺序执行,就会知道更多。其中一个含义是require语句字符串中的代码可以有变量,使语句成为动态的,但ES不能。ES导出将被解析,但在计算import语句时,导入它的其他模块无法使用整个模块


有一种解释更为透彻。

“以不同的顺序导入并不重要。”-这不完全正确。初始化顺序很重要。@Bergi,你是说文件的初始化顺序很重要,还是说文件中导入的初始化顺序很重要,还是两者都重要?两者都有。代码的执行顺序很重要,这意味着导入语句的顺序也很重要,因为前者取决于后者。@Bergi您能举一个例子说明顺序对ES模块导入语句的影响吗?我知道循环依赖关系破坏了正常的ES模块导入。您还考虑过其他事情吗?循环依赖是一回事,但一般来说,如果模块代码执行有副作用,您可能会关心多个模块的执行顺序。在任何情况下,它与commonjs(TDZ除外)都没有什么不同。“静态”指的是在不执行代码的情况下确定模块具有哪些依赖关系。