无阻塞加载脚本分析[全]
分析 脚本 加载 阻塞
2023-06-13 09:14:26 时间
由于浏览器是单线程的,因此脚本在载的时候会阻塞下载其它资源;虽然在现在浏览器已经有所改善,但仍然有待改进。
很显然,脚本必须按顺序执行,但没有必要按顺序下载,解决方法:
1。内嵌JS
通常由于页面大小和缓存能带来更多好处,因此外部文件引入JS更好一些;
在少数情况下,比如首页、少量JS情况下尚可接受。
2。XHREval
通过XMLHttpRequest从服务器端获取脚本。
主要缺陷是,通过XHR获取的脚本必须部署在和主页面相同的域中。
复制代码代码如下:
很显然,脚本必须按顺序执行,但没有必要按顺序下载,解决方法:
1。内嵌JS
通常由于页面大小和缓存能带来更多好处,因此外部文件引入JS更好一些;
在少数情况下,比如首页、少量JS情况下尚可接受。
2。XHREval
通过XMLHttpRequest从服务器端获取脚本。
主要缺陷是,通过XHR获取的脚本必须部署在和主页面相同的域中。
Ajax.get("test.js",function(xhr){
eval(xhr.responseText);
});
3。XHR注入
使用XHR获取脚本并创建script标签。
同样,通过XHR获取的脚本必须部署在和主页面相同的域中。
Ajax.get("test.js",function(xhr){
injectscript(xhr.responseText);
});
functioninjectscript(scriptText){
vars=document.createElement("script");
s.text=scriptText;
document.getElementsByTagName("head")[0].appendChild(s);
}
4。ScriptinIframe
将需要的脚本放入到一个页面中,然后通过iframe来加载该页面。
缺点是iframe本身的开销比较大,另外浏览器安全机制不允许iframe中的js访问跨域的父页面,反之亦然。
5。ScriptDOMElement
JS动态创建scriptDOM元素并设置其src属性。
varscriptElem=document.createElement("script");
scriptElem.src="http://domain.com/test.js";
document.ge("head")[0].appendChild(scriptElem);
6。ScriptDefer
给script标签添加defer属性。
缺点是只有IE和一些新浏览器支持。
<scriptdefersrc="test.js"></script>
7。document.writeScriptTag
使用document.write把HTML标签script写入页面。
缺点是只有在IE中是并行加载脚本的。
document.write("<scripttype="text/javascript"src="test.js"><\/script>");
有一个大家不曾广泛讨论的不同点是对于浏览器忙碌状态的影响,包括浏览器的状态栏、进度条、Tab图标以及鼠标。
当你加载多个彼此间有依赖关系的脚本时,还需要一种能够保证执行顺序的技术。
目前异步加载时保持执行顺序的方法有下面几种,由于篇幅原因,暂不详细描述。
单个脚本
1、HardcodedCallback
2、WindowOnload
3、Timer
4、ScriptOnload
5、DegradingScriptTags
多个脚本
1、ManagedXHR
2、DOMElementandDocWrite
本文参考《高性能网站建设进阶指南》
相关文章
- android开机动画多长时间_Android开机动画原理分析
- Android触摸屏事件派发机制详解与源码分析三(Activity篇)
- mysql的`show engine innodb status`分析脚本 分享
- 【Android 高性能音频】hello-oboe 示例解析 ( Oboe 源代码依赖 | CMakeList.txt 构建脚本分析 | Oboe 源代码构建脚本分析 )
- python实战:分析网站的m3u8文件下载ts文件并解密
- 性能分析MySQL 最近一月的性能变化分析(mysql近一月)
- Linux 网卡流量监控脚本实现分析(linux网卡流量脚本)
- 与安全Linux分支及其安全性分析(linux的分支)
- 用Shell脚本分析Nginx日志
- Linux进程日志管理与分析(linux进程日志)
- 25字中文文章标题MySQL禁止远程登录原因分析(mysql 不允许远程)
- 分析破解解决Windows蓝屏使用Redis(使用redis 蓝屏)
- Oracle PDB回收的有效性分析(oracle中pdb回收)
- Oracle不同数据库间对比分析脚本
- mysqld_safe启动脚本源码阅读、分析
- Oracle索引质量介绍和分析脚本分享