浅析我对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-Mozilla和IE中的一个函数直接量的问题分析
Aug 12 Javascript
SWFObject 2.1以上版本语法介绍
Jul 10 Javascript
checkbox设置复选框的只读效果不让用户勾选
Aug 12 Javascript
javascript通过navigator.userAgent识别各种浏览器
Oct 25 Javascript
javascript教程:关于if简写语句优化的方法
May 17 Javascript
js 加密压缩出现bug解决方案
Nov 25 Javascript
浅析jQuery EasyUI中的tree使用指南
Dec 18 Javascript
PhotoShop给图片自动添加边框及EXIF信息的JS脚本
Feb 15 Javascript
js简单网速测试方法完整实例
Dec 15 Javascript
jQuery动画效果实现图片无缝连续滚动
Jan 12 Javascript
Bootstrap基本组件学习笔记之分页(12)
Dec 08 Javascript
利用Angular2的Observables实现交互控制的方法
Dec 27 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
造势之举?韩国总统候选人发布《星际争霸》地图
2017/04/22 星际争霸
计数器详细设计
2006/10/09 PHP
PHP分页显示制作详细讲解
2008/11/19 PHP
Yii框架获取当前controlle和action对应id的方法
2014/12/03 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
PHP快速排序quicksort实例详解
2016/09/28 PHP
Android AsyncTack 异步任务实例详解
2016/11/02 PHP
PHP多维数组排序array详解
2017/11/21 PHP
php微信公众号开发之答题连闯三关
2018/10/20 PHP
提高Laravel应用性能方法详解
2019/06/24 PHP
实例讲解js验证表单项是否为空的方法
2016/01/09 Javascript
js滚动条平滑移动示例代码
2016/03/29 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
2016/05/24 Javascript
深入理解js函数的作用域与this指向
2016/05/28 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
ionic3 懒加载
2017/08/16 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
js实现Tab选项卡切换效果
2020/07/17 Javascript
利用10行js代码实现上下滚动公告效果
2017/12/08 Javascript
学习LayUI时自研的表单参数校验框架案例分析
2019/07/29 Javascript
VUE中setTimeout和setInterval自动销毁案例
2020/09/07 Javascript
详解Python编程中包的概念与管理
2015/10/16 Python
教你使用python画一朵花送女朋友
2018/03/29 Python
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
如何基于python实现脚本加密
2019/12/28 Python
python打开文件的方式有哪些
2020/06/29 Python
国际领先的学术出版商:Springer
2017/01/11 全球购物
美国在线乐器和设备商店:Musician’s Friend
2018/07/06 全球购物
医院辞职信范文
2014/01/17 职场文书
一岗双责责任书
2014/04/15 职场文书
班级读书活动总结
2014/06/30 职场文书
教师党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
关于拾金不昧的感谢信
2015/01/21 职场文书
2016年校长新年寄语
2015/08/17 职场文书
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫