讲解esm的运行逻辑。
esm是一种模块化解决方案。其余方案还有:commonjs(本文简写为cjs)/amd/umd。模块化是工程化的组成部分。
后端早就把工程化作的很好了。前端的代码仍是一地鸡毛。使用拙劣的<script>
。es6为前端带来了模块化。前端
<script>
引入顺序。分如下4个部分运行。node
在浏览器中使用<script src="main.js" type="module">
指定使用的脚本。浏览器会根据url下载脚本。type="module"
会让浏览器把该文件当作module处理。该文件中可使用import
。
浏览器会一层一层地根据依赖关系依次加载依赖。此过程须要较长时间。而后模块地图es6
根据模块地图生成模块记录。而后模块记录代替模块地图。
模块记录包括:代码/状态。
代码是该模块的运行逻辑,
状态是该模块变量的实际值。
模块的url与模块一一对应。
后会生成一个入口对应若干模块记录。后端
js引擎建立模块环境记录。里面保存了该模块的全部变量。在评估前不能被访问。
使用一块内存专门保存该模块的实例。该模块对外输出就是使用此内存。即便已经输出对象,再在该模块内修改值,也会做用于已经输出的对象。由于对象对应的内存没变。浏览器
执行实例化结果。模块化
cjs的运行逻辑与esm的运行逻辑的不一样。
若cjs中使用esm。则须要把文件扩展名设置为.mjs
。
cjs在实例化时会返回该模块的输出的对象。若已经输出对象,再在该模块内修改值,则不会影响已经输出的对象。
cjs已经作了一些兼容esm的功能。url
esm/cjs正在统一。code