浅析我对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 CSS菜单功能 改进版
Dec 20 Javascript
jQuery Select(单选) 模拟插件 V1.3.62 改进版
Jul 17 Javascript
一个仿糯米弹框效果demo
Jul 22 Javascript
JavaScript函数定义的常见注意事项小结
Sep 16 Javascript
JQuery zClip插件实现复制页面内容到剪贴板
Nov 02 Javascript
JavaScript前端开发之实现二进制读写操作
Nov 04 Javascript
简单的JS时钟实例讲解
Jan 13 Javascript
Node.js返回JSONP详解
May 18 Javascript
JS与Ajax Get和Post在使用上的区别实例详解
Jun 08 Javascript
vue 解决setTimeOut和setInterval函数无效报错的问题
Jul 30 Javascript
基于openlayers实现角度测量功能
Sep 28 Javascript
Vue ECharts实现机舱座位选择展示功能
May 15 Vue.js
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中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
Prototype Array对象 学习
2009/07/19 Javascript
JScript分割字符串示例代码
2013/09/04 Javascript
jQuery中scrollLeft()方法用法实例
2015/01/16 Javascript
javascript获取select值的方法分析
2015/07/02 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
用AngularJS来实现监察表单按钮的禁用效果
2016/11/02 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
BootStrap中Table隐藏后显示问题的实现代码
2017/08/31 Javascript
JavaScript两种计时器的实例讲解
2019/01/31 Javascript
JS简单数组排序操作示例【sort方法】
2019/05/17 Javascript
小程序采集录音并上传到后台
2019/11/22 Javascript
在pycharm中开发vue的方法步骤
2020/03/04 Javascript
重命名批处理python脚本
2013/04/05 Python
Django实战之用户认证(初始配置)
2018/07/16 Python
python在新的图片窗口显示图片(图像)的方法
2019/07/11 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
2020/03/10 Python
机械电子工程毕业生自荐信
2013/11/23 职场文书
英语自荐信常用语句
2013/12/13 职场文书
自荐信需注意事项
2014/01/25 职场文书
浙大毕业生自荐信
2014/01/26 职场文书
经销商订货会主持词
2014/03/27 职场文书
《路旁的橡树》教学反思
2014/04/07 职场文书
《赶海》教学反思
2014/04/20 职场文书
《夹竹桃》教学反思
2014/04/20 职场文书
社会实践评语
2014/04/28 职场文书
销售行政专员岗位职责
2014/06/10 职场文书
学校爱国卫生月活动总结
2014/06/25 职场文书
统计工作个人总结
2015/03/03 职场文书
小学体育组工作总结2015
2015/07/21 职场文书
广告策划的实习心得体会总结!
2019/07/22 职场文书
导游词之襄阳古城
2019/09/27 职场文书
react antd实现动态增减表单
2021/06/03 Javascript