浅析我对JS延迟异步脚本的思考


Posted in Javascript onOctober 12, 2020

关于对延迟脚本的思考

asyncdefer属性的脚本,相信大家都听说过,但是他的真正执行细节是什么样子的?很少有文章认真研究它,可能不太有人注重细节,但其实真正有技术含量的工作和项目,对于性能要求极高,那么细节就很重要了.需要不断的实验自我尝试

最近几个月,我一直在研究一些技术,例如linux,操作系统,算法等,预计要持续学习到今年年底。红宝书第四版出来后,我也是花了很多时间去看。对于延迟脚本,自己也是做了一个实验,写下了这篇总结

什么是延迟脚本?

script标签,带async和defer属性等,通过document.createElement('script')创建并且没有指定script.async=false的脚本默认为异步延迟脚本(必须为非内联脚本),如下所示:

<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Document</title>
</head>

<body>

</body>
<script src="./async1.js" async></script>
<script src="./async2.js" async></script>
<script src="./defer1.js" defer></script>
<script src="./defer2.js" defer></script>
<script src="./common1.js"></script>
<script src="./common2.js"></script>
<script src="./common3.js"></script>

</html>

以上7个脚本文件,其中common开头为非异步延迟脚本,其余的都指定了延迟脚本的模式,分为async和defer两种

通过document.createElement创建的标签插入默认为async模式

开始实验

浅析我对JS延迟异步脚本的思考

我一共写了2个async和2个defer标签,其它的都是普通标签.其中async1.js里面有4000行代码,其它都是一个console.log而已

第一次实验结果:

浅析我对JS延迟异步脚本的思考

再次刷新页面(注意我已经禁用了浏览器缓存),结果为:

浅析我对JS延迟异步脚本的思考

再次刷新,发现async执行时机和顺序不确定,但是能确定defer肯定在async之后执行。

浅析我对JS延迟异步脚本的思考

原因在于:async是告诉浏览器,可以不必等到它下载解析完后再加载页面,也不用等它执行完后再执行其他脚本,俗称异步执行脚本

看下载执行时机和打印结果的对比

打印结果:

浅析我对JS延迟异步脚本的思考

对应的下载执行时机

浅析我对JS延迟异步脚本的思考

从上面看,下载时机async和普通模式都是同样并行下载,只有defer是最后才下载(http1.1有并发数量限制,可是这里并不是并发限制,当我删除common的引用后,我发现defer永远都是最后下载的)

浅析我对JS延迟异步脚本的思考

asyncdefer两种模式,区别在于:

  • async是告诉浏览器,它不会操作dom,可以不必等到它下载解析完后再加载页面,也不用等它执行完后再执行其他脚本,俗称异步执行脚本, 多个async无法保证他们的执行顺序,例如async1和async2无法按顺序执行
  • defer是在解析到结束到</html>标签后才会执行,俗称推迟执行脚本,多个defer可以按顺序执行,例如defer1和defer2可以按顺序执行(实际上也不保证顺序执行)
  • 解析到script标签后,async是直接下载
  • 解析到script标签后,defer是最后下载

相同点:

  • 多个async或者defer标签实际上都不能保证顺序执行
  • 都不会阻塞解析其他script标签内容的解析和页面渲染
  • 他们都会在浏览器load事件前执行,但是不保证是在DomContentLoad事件前还是后执行

影响多个异步脚本的执行顺序因素

  • 脚本文件大小
  • 网络传输因素

特殊情况

当所有的脚本文件都很小很小的时候,结果会在很大概率稳定在

浅析我对JS延迟异步脚本的思考

使用的注意点

  • 异步推迟脚本的执行顺序并不稳定,所有尽量只有一个
  • 使用异步推迟脚本时,应该考虑什么场景才使用,而不是滥用它

写在最后

到此这篇关于浅析我对JS延迟异步脚本的思考的文章就介绍到这了,更多相关JS 延迟异步脚本内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
解析javascript 数组以及json元素的添加删除
Jun 26 Javascript
Checbox的操作含已选、未选及判断代码
Nov 07 Javascript
jQuery之ajax删除详解
Feb 27 Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
Nov 04 Javascript
javascript Array 数组常用方法
Apr 05 Javascript
浅谈$(document)和$(window)的区别
Jul 15 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
Oct 28 Javascript
JS实现针对给定时间的倒计时功能示例
Apr 11 Javascript
详解AngularJS 路由 resolve用法
Apr 24 Javascript
vue v-model动态生成详解
Jun 30 Javascript
详解Vue中的scoped及穿透方法
Apr 18 Javascript
js实现简单点赞操作
Mar 17 Javascript
Webpack5正式发布,有哪些新特性
Oct 12 #Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
Oct 12 #Javascript
移动端JS实现拖拽两种方法解析
Oct 12 #Javascript
JavaScript读取本地文件常用方法流程解析
Oct 12 #Javascript
vue实现移动端返回顶部
Oct 12 #Javascript
用JavaScript实现贪吃蛇游戏
Oct 23 #Javascript
手机浏览器唤起微信分享(JS)
Oct 11 #Javascript
You might like
PHP排序算法的复习和总结
2012/02/15 PHP
javascript中的继承实例代码
2011/04/27 Javascript
js如何设置在iframe框架中指定div不显示
2013/12/04 Javascript
jquery 字符串切割函数substring的用法说明
2014/02/11 Javascript
jQuery中选择器小问题(新人难免遇到)
2014/03/31 Javascript
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
详解javascript遍历方式
2015/11/11 Javascript
Javascript模仿淘宝信用评价实例(附源码)
2015/11/26 Javascript
学习JavaScript鼠标响应事件
2015/12/25 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
使用do...while的方法输入一个月中所有的周日(实例代码)
2016/07/22 Javascript
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
javascript函数的节流[throttle]与防抖[debounce]
2017/11/15 Javascript
微信小程序使用input组件实现密码框功能【附源码下载】
2017/12/11 Javascript
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
js简单遍历获取对象中的属性值的方法示例
2019/06/19 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
微信小程序自定义tabBar在uni-app的适配详解
2019/09/30 Javascript
jQuery+PHP+Ajax实现动态数字统计展示功能
2019/12/25 jQuery
Node.js设置定时任务之node-schedule模块的使用详解
2020/04/28 Javascript
[57:24]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
解读! Python在人工智能中的作用
2017/11/14 Python
python实现电子书翻页小程序
2019/07/23 Python
Python 通过截图匹配原图中的位置(opencv)实例
2019/08/27 Python
CSS3制作半透明边框(Facebox)类似渐变
2012/12/09 HTML / CSS
CSS3制作苹果风格键盘特效
2015/02/26 HTML / CSS
HTML5移动端手机网站开发流程
2016/04/25 HTML / CSS
中国第一家杂志折扣订阅网:杂志铺
2016/08/30 全球购物
trivago美国:全球最大的酒店价格比较网站
2018/01/18 全球购物
海滩咖啡馆:Beach Cafe
2018/02/02 全球购物
DJI全球:DJI Global
2021/03/15 全球购物
副董事长岗位职责
2014/04/02 职场文书
四年级作文之植物
2019/09/20 职场文书
励志语录:你若不勇敢,谁替你坚强
2019/11/08 职场文书
springboot实现string转json json里面带数组
2022/06/16 Java/Android
插件导致ECharts被全量引入的坑示例解析
2022/09/23 Javascript