ES6篇(22)--Module的加载实现

26 篇文章 0 订阅


(1)浏览器加载
①传统方法:HTML网页中,浏览器通过<script>标签加载了JavaScript脚本。
默认情况下,浏览器是同步加载JavaScript脚本,即渲染引起遇到<script>标签就会停下来,等到执行完脚本,
再继续向下渲染,如果是外部脚本,还必须加入脚本的下载时间。如果脚本体积很大,下载和执行的时间就会
很长,会造成浏览器堵塞,用户会感觉浏览器卡死,所以浏览器允许脚本异步加载。
②两种异步加载方法:defer和async
渲染引擎遇到带defer和async的外部脚本,会开始下载外部脚本,但不会等它下载和执行,而是直接执行后面的命令
defer和async的区别:
defer要等到整个页面在内存中正常渲染结束(DOM 结构完全生成,以及其他脚本执行完成),才会执行;
async一旦下载完,渲染引擎就会中断渲染,执行这个脚本以后,再继续渲染。一句话,
defer是“渲染完再执行”,async是“下载完就执行”。
另外,如果有多个defer脚本,会按照它们在页面出现的顺序加载,而多个async脚本是不能保证加载顺序的。

③加载规则
浏览器加载 ES6 模块,也使用<script>标签,但是要加入type="module"属性。
<script type="module" src="./foo.js"></script>
浏览器对于带有type="module"的<script>,都是异步加载,不会造成堵塞浏览器,即等到整个页面渲染完,
再执行模块脚本,等同于打开了<script>标签的defer属性。
<script>标签的async属性也可以打开,这是只要加载完成,渲染引擎就会中断立即执行,执行完后再回复渲染。
也不会按照模块在页面出现的顺序执行,而是模块加载完,就立即执行该模块。
ES6模块也允许内嵌在网页中,语法行为与加载外部脚本完全一致。

对于外部的模块脚本,需要注意几点:
代码是在模块作用域之中运行,而不是在全局作用域运行。模块内部的顶层变量,外部不可见。
模块脚本自动采用严格模式,不管有没有声明use strict。
模块之中,可以使用import命令加载其他模块(.js后缀不可省略,需要提供绝对 URL 或相对 URL),也可以使用export命令输出对外接口。
模块之中,顶层的this关键字返回undefined,而不是指向window。也就是说,在模块顶层使用this关键字,是无意义的。
同一个模块如果加载多次,将只执行一次。


(2)ES6模块与CommonJS模块的差异
它们有两个重大差异:
CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。
CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。

(3)Node加载
参见源文件吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值