ES6-Module的加载

113 阅读1分钟

浏览器加载

script加载

一般浏览器通过script标签js脚本,大多数浏览器的type属性默认是:'application/javascript',

在之前的文章中提过defer,与async的区别,在这不做过多描述,

一句话就是:

defer要等到整个页面在内存中正常渲染结束(DOM结构完全生成,以及其他脚本执行完)才会执行,

async一旦下载完成渲染引擎就会中断渲染,执行完这个脚本再继续渲染

关于加载顺序,在之前的文章讲过,不做过多描述

加载规则

浏览器中,加载模块时,需要将type属性设置为module

(即<script type='module'\ src='./fun.js'></script>)

Tips:对于多部的脚本模块,有几点需要注意
	1:代码是在模块作用域中运行,而不是全局作用域运行,
    2:模块内部的顶层变量,外部不可见
    3:模块脚本自动采用严格模式
    4:模块之中,可以使用import命令加载其他模块,也可以使用export输出模块
    5:模块之中,顶层中的this关键字返回undefined
    6:同一个模块如果加载多次,只执行一次
    

当设置type=module时,script默认开启defer,如果想要开启async,

则需要在script标签中社子和async属性

ES6模块也可以内嵌在网页中,语法行为和加载外部脚本完全一致。

<script type="module">
  import utils from "./utils.js";

  // other code
</script>

ES6模块与CommonJS模块的差异

ES6模块和CommonJS有两个重大的差异

1:CommonJS加载的是一个值的拷贝,ES6模块输出的是值的引用。

2:CommonJS模块是运行时加载,ES6模块是编译时输出