在引入Esmodule规范之前,我们首先可以了解AMD和CMD的两个规格。
AMD规范
CMD规范
AMD和CMD的最大问题是,语法升级无法解决模块化问题。它们定义模块化或调用JS方法来生成模块。如果项目模块达到数百万,则不能将此方法应用于大型应用程序。如果模块的规模需要标准的语法规范,则既不实现AMD和CMD。
eSmodule规范
让我们在下面详细介绍Esmodule。
通过导出导出的所有属性都可以在导入方法中解构。
出口出口
导入
进口
有两种导入方法。第一个是:
第二类:
MES对象如下。您可以看到所有导出的属性都会收敛为对象,其中导出默认值的关键导出值为。
Esmodule的设计概念是确定编译时的模块依赖关系关系,即输入和输出,如何确定编译时的依赖关系?
在编译语言的过程中,该程序中的源代码需要在执行之前“编译”。对于解释的语言(例如JavaScript),它也需要编译,但是编译过程在几秒钟内发生(甚至更短)(甚至更短)在执行代码之前。
如果要确定汇编阶段的依赖性,则必须改进类似于变量的变量。LET查看JavaScript中的变量。
在编译阶段,改进了变量。预先填充后,执行命令成为这样:
因此,打印结果是:
实际上,在编译阶段发现了JavaScript代码,它将像验证这一点一样改进,请查看以下演示。
main.js
A.JS
B.JS
执行订单如下:
执行时,您可以首先看到“ B模块加载”,但是第一行代码是,但未执行。这是因为该导入已在编译阶段促进,并且类似于VAR的变量将首先执行。
也就是说,在编译阶段加载模块,然后在执行阶段执行文件,该文件与VAR变量的执行顺序相同,也就是说,它将首先改进,然后在该变量中分配一个值执行阶段。
由于具有静态语法,因此不能将其放置在块级别的域或条件语句中。
在编译过程中,确定导入和导出之间的关系,因此找到依赖性和更方便(摇树)更方便,这就是为什么Esmodule支持操作。在同一时间,您也可以使用各种各样的棉绒工具检查模块,例如:ESLINT。
执行后,将报告错误:typerror:分配到常数变量。通过导入导入的值可以看作是无法修改的const常数。
common.js是该值的副本,eSmodule是参考传递。
common.js
当第一个打印中导入的变量的值是1时,然后执行加号,并且打印发现的值仍然是1。找到值是2。因此,在commonjs规范下,导入的变量只是该值的副本。有关具体详细信息,请参阅上一篇文章#commonjs规范的详细说明。
eSmodule
当第一个打印中导入的变量的值是1时,则执行加号,并且发现的值再次为2。也就是说,使用导入的变量导入的变量是与原始变量的参考关系,而不是一个复制。
import()返回承诺对象,然后成功返回返回的承诺以获取模块的加载信息。let简要介绍如何使用导入()。
打印结果如下:
通过上面的简介,我们将总结concomjs和Esmodule之间的差异:
像此代码一样,很难分析哪些模块仅在仅分析时才依赖于依赖性。
同样,执行模块时无法识别commonj:
但是,在eSmodule中,进出口清楚地表明,自然很容易区分和继续进口的部分。
简而言之,可以通过有限的语法确定的依赖性,可以在AST阶段确定。
原来的;https://juejin.cn/post/7098537945103073316