浅析我对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 相关文章推荐
JS中不为人知的五种声明Number的方式简要概述
Feb 22 Javascript
JS实现可展开折叠层的鼠标拖曳效果
Oct 09 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
May 21 Javascript
AngularJs bootstrap详解及示例代码
Sep 01 Javascript
AngularJS实现表单验证功能
Jan 09 Javascript
详解vue2.0组件通信各种情况总结与实例分析
Mar 22 Javascript
Angular 4.0学习教程之架构详解
Sep 12 Javascript
Angular2使用vscode断点调试ts文件的方法
Dec 13 Javascript
Vue.js中provide/inject实现响应式数据更新的方法示例
Oct 16 Javascript
js实现移动端吸顶效果
Jan 08 Javascript
JS关闭子窗口并且刷新上一个窗口的实现示例
Mar 10 Javascript
在js中修改html body的样式
Nov 11 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的一个基础知识 表单提交
2011/07/04 PHP
php代码架构的八点注意事项
2016/01/25 PHP
thinkPHP5.0框架API优化后的友好性分析
2017/03/17 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
javascript 面向对象编程 function也是类
2009/09/17 Javascript
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
jquery 触发a链接点击事件解决方案
2013/05/02 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
jQuery动态生成Bootstrap表格
2016/11/01 Javascript
JS实现的tab切换选项卡效果示例
2017/02/28 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(下)
2017/04/21 Javascript
关于vue里页面的缓存详解
2019/11/04 Javascript
记录一次websocket封装的过程
2020/11/23 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
wxPython中listbox用法实例详解
2015/06/01 Python
python绘制直线的方法
2018/06/30 Python
python绘制热力图heatmap
2020/03/23 Python
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
Python小进度条显示代码
2019/03/05 Python
对Python的交互模式和直接运行.py文件的区别详解
2019/06/29 Python
Python+Appium实现自动化测试的使用步骤
2020/03/24 Python
python利用xpath爬取网上数据并存储到django模型中
2021/02/26 Python
瑜伽国际:Yoga International
2018/04/18 全球购物
俄罗斯茶和咖啡网上商店:Tea.ru
2021/01/26 全球购物
幼儿园数学教学反思
2014/02/02 职场文书
博士生求职信
2014/07/06 职场文书
机械机修工岗位职责
2014/08/03 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2014年行风建设工作总结
2014/12/01 职场文书
计划生育汇报材料
2014/12/26 职场文书
请客吃饭开场白
2015/06/01 职场文书
十七岁的单车观后感
2015/06/12 职场文书
医务人员医德医风心得体会
2016/01/25 职场文书
《钓鱼的启示》教学反思
2016/02/18 职场文书
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang