浅析我对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 相关文章推荐
Extjs学习笔记之七 布局
Jan 08 Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
Sep 17 Javascript
谈谈JavaScript中的函数与闭包
Apr 14 Javascript
javascript获取form里的表单元素的示例代码
Feb 14 Javascript
javascript中函数作为参数调用的方法
Feb 09 Javascript
jquery控制表单输入框显示默认值的方法
May 22 Javascript
jQuery+ajax实现局部刷新的两种方法
Jun 08 jQuery
详解基于angular-cli配置代理解决跨域请求问题
Jul 05 Javascript
简单谈谈CommonsChunkPlugin抽取公共模块
Dec 31 Javascript
vue中使用ueditor富文本编辑器
Feb 08 Javascript
其实你可以少写点if else与switch(推荐)
Jan 10 Javascript
Vue的click事件防抖和节流处理详解
Nov 13 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
分页显示Oracle数据库记录的类之一
2006/10/09 PHP
PHP 网页过期时间的控制代码
2009/06/29 PHP
php设置静态内容缓存时间的方法
2014/12/01 PHP
PHP翻页跳转功能实现方法
2020/11/30 PHP
PHP 二级子目录(后台目录)设置二级域名
2017/03/02 PHP
php提交表单时保留多个空格及换行的文本样式的方法
2017/06/20 PHP
laravel中短信发送验证码的实现方法
2018/04/25 PHP
Ubuntu彻底删除PHP7.0的方法
2018/07/27 PHP
laravel实现简单用户权限的示例代码
2019/05/28 PHP
javascript 网页跳转的方法
2008/12/24 Javascript
Javascript事件热键兼容ie|firefox
2010/12/30 Javascript
jquery滚动条插件jScrollPane的使用介绍
2013/11/08 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
js实现Select下拉框具有输入功能的方法
2015/02/06 Javascript
js数组实现权重概率分配
2017/09/12 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
python批量查询、汉字去重处理CSV文件
2018/05/31 Python
pygame游戏之旅 游戏中添加显示文字
2018/11/20 Python
Python爬虫文件下载图文教程
2018/12/23 Python
创建Django项目图文实例详解
2019/06/06 Python
浅谈django 模型类使用save()方法的好处与注意事项
2020/03/28 Python
keras处理欠拟合和过拟合的实例讲解
2020/05/25 Python
解决TensorFlow调用Keras库函数存在的问题
2020/07/06 Python
英国儿童设计师服装和玩具购物网站:Zac & Lulu
2020/10/19 全球购物
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
十八大感想感言
2014/02/10 职场文书
个人批评与自我批评总结
2014/10/17 职场文书
小学六一儿童节活动总结
2015/05/05 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
厉行节约工作总结
2015/08/12 职场文书
pandas中DataFrame重置索引的几种方法
2021/05/24 Python
python处理json数据文件
2022/04/11 Python
mysql实现将字符串字段转为数字排序或比大小
2022/06/14 MySQL