js异步加载

问题分析

在开发网站页面的时候经常会加载js文件,但是我们在加载js的时候会遇到js非常大或者执行事件长的情况下会出现页面短时间内白屏的现象。
这是因为web页面是按照顺序执行的然后代码一边下载浏览器一边处理,当遇到标签浏览器会先停下来去加载相应的css文件,然后加载出来,遇到<script></script>标签会看有没有src属性,如果有就下载相应的js文件然后执行js,等js执行完毕后在继续向下执行。在这种顺序执行的情况下就会出现第一段话我们说的问题。

解决方案:

  1. 我们可以把script引入的外部资源统一放到</body>标签的前边,也就是放到所有dom节点的后边。
  2. 通过给script标签增加异步加载属性
    异步加载可以使用async\defer两个属性
  3. 在前边写一个加载外部js的方法
<script>
    var script = document.createElement('script');
    script.src = 'a.js';
    document.querySelector('head').append(script);
</script>

区别

  1. <script>标签放到底部的方法是按照代码的顺序执行。
    这里主要讨论的是defer和async的区别
    defer:是浏览器遇到带有该属性的js文件后台去加载并且代码继续向下执行,然后等到页面的所有dom元素都加载完毕后在执行。
    async:是浏览器遇到带有该属性的js文件会取后台进行加载并且代码继续执行,等到js下载完毕后立即执行js并且暂停正在执行的代码,等到js执行完毕,在继续接着执行刚才暂停的代码。

暂时无法在文档外展示此内容

通过上图可以看出,如果script标签是async属性的话是js加载和html执行是同步的,但是到加载完后html停止执行,然后执行js中间会有暂停情况
而defer却是html和js的加载同时进行,然后等html加载完毕后才开始渲染执行js文件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值