Es-Module的加载实现

浏览器加载

传统方法

//页面内嵌的脚本
<script>
//module code
</script>

//外部脚本
<script src="./module.js></script>

默认情况下,浏览器同步加载javaScript脚本,即渲染引擎遇到

如果脚本的体积很大,下载和执行时间就会很长,因此造成浏览器堵塞,用户会感觉到到浏览器“卡死了”,没有任何响应。这显然是不好的体验,所以浏览器允许脚本异步加载,下面就是两种异步加载的语法。

<script src="module.js" defer></script>
<script src="module.js" async></script>

上面的代码中,

defer和async的区别是,前者要等到整个页面正常渲染结束才会执行,而后者一旦下载完成,渲染引擎就会中断渲染,执行这个脚本以后在渲染。另外,如果有多个defer脚本,则会按照他们子页面出现的顺序加载,而多个async脚本不能保证加载顺序的。
加载规则
浏览器加载ES6模块时也使用

<script type="module" src="foo.js><script>

这里script标签带有type="module"属性,所以浏览器知道这是一个ES6
模块。对于带有type="module"的属性

Es6模块也允许内嵌在网页中,语法行为与加载外部脚本完全一致。

<sript type="module>
import utils from "./utils.js"
//other code
</script>

对于外部的模块脚本(foo,js),有几点需要注意。

  • 代码是在模块作用域之中运行,而不是在全局作用域中运行,模块外部的顶层变量外部是不可见的。
  • 模块脚本自动采用严格模式,无论有没有声明use.strict
  • 模块中可以使用import命令加载其他模块(.js后缀不可省略,许哟啊提供绝对URL或相对URL),也可以使用export命令输出对外接口。
  • 在模块中,顶层的this关键字返回undefined,而不是指向window。也就是说,在模块顶层使用this关键字时无意义的。
  • 同一个模块如果加载多次,将只执行一次。
import utils from 'https://example.com/js/utils.js';
const x=1;

console.log(x===window.x)		//false
console.log(this===undefined)  	//true

delete x;  		//句法错误,严格模式下禁止删除变量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值