浏览器加载
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模块是编译时输出