浅析我对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 相关文章推荐
基于jQuery的淡入淡出可自动切换的幻灯插件
Aug 24 Javascript
jquery中this的使用说明
Sep 06 Javascript
jquery+ajax每秒向后台发送请求数据然后返回页面的代码
Jan 17 Javascript
基于jQuery的投票系统显示结果插件
Aug 12 Javascript
jQuery实现用户注册的表单验证示例
Aug 28 Javascript
Javascript中string转date示例代码
Nov 01 Javascript
Node.js的环境安装配置(使用nvm方式)
Oct 11 Javascript
Bootstrap CSS布局之按钮
Dec 17 Javascript
AngularJS实现路由实例
Feb 12 Javascript
angularjs中回车键触发某一事件的方法
Apr 24 Javascript
vue实现百度搜索下拉提示功能实例
Jun 14 Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
Apr 19 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
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
php include,include_once,require,require_once
2008/09/05 PHP
html+js实现动态显示本地时间
2013/09/21 Javascript
jquery实现邮箱自动补全功能示例分享
2014/02/17 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
网页从弹窗页面单选框传值至父页面代码分享
2015/09/29 Javascript
使用jQuery实现Web页面换肤功能的要点解析
2016/05/12 Javascript
jquery+ajax+text文本框实现智能提示完整实例
2016/07/09 Javascript
JS常用函数和常用技巧小结
2016/10/15 Javascript
微信小程序 获取相册照片实例详解
2016/11/16 Javascript
BootStrap表单验证实例代码
2017/01/13 Javascript
assert()函数用法总结(推荐)
2017/01/25 Javascript
超全面的vue.js使用总结
2017/02/12 Javascript
微信小程序实现的日期午别医生排班表功能示例
2019/01/09 Javascript
js中对象和面向对象与Json介绍
2019/01/21 Javascript
微信小程序 setData 对 data数据影响问题
2019/04/18 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
2020/04/03 Javascript
antd design table更改某行数据的样式操作
2020/10/31 Javascript
Python封装原理与实现方法详解
2018/08/28 Python
python求解数组中两个字符串的最小距离
2018/09/27 Python
Python正则表达式匹配数字和小数的方法
2019/07/03 Python
Python PyCharm如何进行断点调试
2019/07/05 Python
Python坐标线性插值应用实现
2019/11/13 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
2020/04/01 Python
django 模型中的计算字段实例
2020/05/19 Python
全球最大的跑步用品商店:Road Runner Sports
2016/09/11 全球购物
Beauty Expert美国/加拿大:购买奢侈美容产品
2018/12/05 全球购物
建筑学推荐信
2013/11/03 职场文书
会议邀请函范文
2014/01/09 职场文书
大学军训感言1500字
2014/03/09 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
党性分析材料格式
2014/12/19 职场文书
中学后勤工作总结2015
2015/07/22 职场文书
离婚协议书格式范本
2016/03/18 职场文书
Navicat for MySQL的使用教程详解
2021/05/27 MySQL