JS的异步加载
异步加载
先看一张整体的异步加载对渲染的阻塞情况图,图片如下:

从这张图里我们可以看到如下4点:
- 默认情况HTML解析,然后加载JS,此时HTML解析中断,然后执行JS,最后JS执行完成恢复HTML解析
- defer情况下HTML和JS并驾齐驱,最后才执行JS
- async情况则HTML和JS并驾齐驱,JS的执行可能在HTML解析之前就已经完成了
- 最后module情况和defer的情况类似,只不过会在提取的过程中加载多个JS文件罢了
然后我们再来看一下这几种加载JS的情形与DOM事件、onload事件的关系:

从上面的图片我们可以看到如下几点:
- async 会在加载完JS后立即执行,最迟也会在load事件前执行完。
- defer会在HTML解析完成后执行,最迟也会在DOMContentLoaded事件前执行完。
从上面我们可以看出,如果你的脚本依赖于DOM构建完成是否完成,则可以使用defer;如果无需DOM的构建,那就可以放心的使用async了。
defer
也就是说defer的优先级没有async高,我们看一下规范是怎么处理这种情况的。
规范只是说明了在不支持async的情况下浏览器将会回退支持defer,但并没有明确指明两种都支持的这种情况,也就是说这一种情况浏览器自行处理,经过测试,各个浏览器表现行为:
- Chrome浏览器表现为解析为async特性
- Safari浏览器表现为async特性
- Opera浏览器表现为async特性
- Firefox浏览器表现为async特性
IE暂时没有安装,看来各大浏览器表现一致,总之async的优先级是最高的。
defer兼容性

asyc
和defer一样,也仅仅适用于外部脚本,也就是仅当存在src属性时才会生效。
async兼容性
async的兼容性在移动端也是一片大绿,IE仅支持IE10+。

module
在现代浏览器中,我们可以声明acript标签type=’module’属性从而拥抱es6的模块导入导出语法,就像这样:
1 <script type="module">
2 import { Max } from "./math.js";
3 console.log(Max(1, 2, 7, 2, 0)); //7
4 </script>
看起来是不是令人很激动,似乎对于开发者十分友好,但是这里也有几个与传统脚本不一样的地方:
- module默认使用了”use strict”模式,这也意味着不能使用诸如arguments.callee这一类的语法。
- 模块只会加载一次,无论前后你写了多少次
- 不支持<!–const a = 1–>注释。
- module有自己的词法作用域,比如定义一个 var a = 1,并不会创建一个全局变量,因此你并不能通过window.a 访问到它的值
模块的导入方式目前仅支持以下几种模式:
1 支持
2 import {math} from './math.mjs';
3 import {math} from '../math.mjs';
4 import {math} from '/modules/math.mjs';
5 import {math} from 'https://simple.example/modules/math.mjs';
6 //不支持
7 import {math} from 'jquery';
当然,浏览器厂商也在考虑支持 import {math} from ‘jquery’ 这种格式,不过,还是需要一段很长的路要走。
module的默认情况就是defer的,因此不必再module上面又添加一个defer熟悉,并且本身就不支持这种写法,但是支持async属性,其加载渲染方式和async差不多,这里不再赘述。
module兼容性
在移动端的兼容性还算可以,但是IE貌似都败下阵来,只要edge16+以上还算支持,对于不支持module的浏览器可以使用nomodule属性作为版本回退的方案解决。

1 import { Modal } from './util.js';
2 Modal({
3 title: 'hello'
4 })
JS的异步加载的更多相关文章
- js的异步加载你真的懂吗
面试高频之js的异步加载 讲这个问题之前, 我们从另一个面试高频问题来切入, 我们的web页面从开始解析到页面渲染完成都经历了什么 ? 1 , 创建document对象, 开始解析页面, ...
- Vue中结合Flask与Node.JS的异步加载功能实现文章的分页效果
你好!欢迎阅读我的博文,你可以跳转到我的个人博客网站,会有更好的排版效果和功能. 此外,本篇博文为本人Pushy原创,如需转载请注明出处:http://blog.pushy.site/posts/15 ...
- js滚动异步加载数据的思路
<body> <div style="width:200px; height:1000px; border:1px solid red;" id="to ...
- JS异步加载的三种方案
js加载的缺点:加载工具方法没必要阻塞文档,个别js加载会影响页面效率,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作. 有些工具方法需要按需加载,用到再加载,不用不加载. 一.def ...
- 异步加载的JS如何在chrome浏览器断点调试?
我们常常利用chrome强大的控制台Sources下面进行代码断点调试,但是通过$.getScript等异步加载JS的方式在Sources里面就是找不到,那如何进行debug断点调试呢? 方案一: 在 ...
- 不得不说的JavaScript异步加载
同步加载的问题 默认的js是同步加载的,这里的“加载”可以理解成是解析.执行,而不是“下载”,在最新版本的浏览器中,浏览器对于代码请求的资源都是瀑布式的加载,而不是阻塞式的,但是js的执行总是阻塞的. ...
- javascript 同步加载与异步加载
HTML 4.01 的script属性 charset: 可选.指定src引入代码的字符集,大多数浏览器忽略该值. defer: boolean, 可选.延迟脚本执行,相当于将script标签放入页面 ...
- Highcharts 异步加载数据曲线图表
导入 data.js 文件 异步加载数据需要引入以下js 文件: <script src="http://code.highcharts.com/modules/data.js&quo ...
- Javascript 文件的同步加载与异步加载
HTML 4.01 的script属性 charset: 可选.指定src引入代码的字符集,大多数浏览器忽略该值.defer: boolean, 可选.延迟脚本执行,相当于将script标签放入页面b ...
- Highcharts 基本曲线图;Highcharts 带有数据标签曲线图表;Highcharts 异步加载数据曲线图表
Highcharts 基本曲线图 实例 文件名:highcharts_line_basic.htm <html> <head> <meta charset="U ...
随机推荐
- archlinux xfce 设置窗口背景颜色,QT背景颜色
1.使用xfce主题 2.有QT背景不覆盖,使用配置 sudo pacman -S qt5-ct 3.在/etc/environment添加环境变量 QT_QPA_PLATFORMTHEME=qt5c ...
- 循环队列(LoopQueue)
循环队列相比普通的队列,元素出队时无需移动大量元素. 代码 ArrayQueue.h 点它 代码清单 #ifndef C___LOOPQUEUE_H #define C___LOOPQUEUE_H # ...
- 05 Ajax请求(扩展,延伸)
05 Ajax请求(扩展,延伸) 首先, 我们用Flask创建一个后台服务器(自己做网站了哈) 目录结构: 服务端: from flask import Flask, render_template, ...
- #期望dp#CF1810G The Maximum Prefix
洛谷题面 CF1810G 分析 考虑最大前缀和满足两个条件,就是所有前缀和都不超过,以及一定有一个等于. 那么就要保证它能达到最大值且一直不能高于它 设 \(dp[i][j][0/1]\) 表示前 \ ...
- #Pollard-Rho,高精度#洛谷 3499 [POI2010]NAJ-Divine Divisor
题目 给定\(m\)个数\(a_i\),令\(n=\prod_{i=1}^m a_i\), 问有多少个大于1的正整数\(d\)满足\(d^{\max k}|n\) 并输出\(\max k\),\(m\ ...
- SpringBoot常用注解整理
@SpringBootApplication 定义在main方法入口类处,用于启动sping boot应用项目 @Target(ElementType.TYPE) @Retention(Retenti ...
- 【直播预告】HarmonyOS极客松赋能直播第二期:数据库与网络连接开发
- 外屏和宽屏浪费了?HarmonyOS折叠屏设计规范教你用起来
原文:https://mp.weixin.qq.com/s/7_mdRom7sCA3Z65ih6W3xw,点击链接查看更多技术内容. 这几年折叠屏手机很火,我们针对使用HarmonyOS的折叠屏手机提 ...
- allure常用
overview:概述页面:categories:分类目录:suites:按套件和类分组的已执行测试的标准结构:graphs:图表:timeline:时间线:behaviors:可根据epic.fea ...
- Webpack中Loader和Plugin的区别?编写Loader,Plugin的思路?
一.区别 前面两节我们有提到Loader与Plugin对应的概念,先来回顾下 loader 是文件加载器,能够加载资源文件,并对这些文件进行一些处理,诸如编译.压缩等,最终一起打包到指定的文件中 pl ...