无阻塞加载脚本分析[全]

时间:2024-04-17 10:25:35 

由于浏览器是单线程的,因此脚本在载的时候会阻塞下载其它资源;虽然在现在浏览器已经有所改善,但仍然有待改进。
很显然,脚本必须按顺序执行,但没有必要按顺序下载,解决方法:
1。内嵌JS
通常由于页面大小和缓存能带来更多好处,因此外部文件引入JS更好一些;
在少数情况下,比如首页、少量JS情况下尚可接受。
2。XHR Eval
通过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);
});
function injectscript(scriptText) {
var s = document.createElement('script');
s.text = scriptText;
document.getElementsByTagName('head')[0].appendChild(s);
}


4。Script in Iframe
将需要的脚本放入到一个页面中,然后通过iframe来加载该页面。
缺点是iframe本身的开销比较大,另外浏览器安全机制不允许iframe中的js访问跨域的父页面,反之亦然。
5。Script DOM Element
JS动态创建script DOM元素并设置其src属性。


var scriptElem = document.createElement('script');
scriptElem.src = 'http://domain.com/test.js';
document.ge('head')[0].appendChild(scriptElem);


6。Script Defer
给script标签添加defer属性。
缺点是只有IE和一些新浏览器支持。


<script defer src='test.js'></script>


7。document.write Script Tag
使用document.write把HTML标签script写入页面。
缺点是只有在IE中是并行加载脚本的。


document.write("<script type='text/javascript' src='test.js'><\/script>");


有一个大家不曾广泛讨论的不同点是对于浏览器忙碌状态的影响,包括浏览器的状态栏、进度条、Tab图标以及鼠标。
当你加载多个彼此间有依赖关系的脚本时,还需要一种能够保证执行顺序的技术。

技术 

 

并行下载 

 

可以跨域 

 

存在Script标签 

 

忙碌指示 

顺序保证 

大小 (bytes)

XHR Eval

IE, FF, Saf, Chr, Op

no

no

Saf, Chr

-

~500

XHR Injection

IE, FF, Saf, Chr, Op

no

yes

Saf, Chr

-

~500

Script in Iframe

IE, FF, Saf, Chr, Op

no

no

IE, FF, Saf, Chr

-

~50

Script DOM Element

IE, FF, Saf, Chr, Op

yes

yes

FF, Saf, Chr

FF, Op

~200

Script Defer

IE, Saf4, Chr2, FF3.1

yes

yes

IE, FF, Saf, Chr, Op

IE, FF, Saf, Chr, Op

~50

document.write Script Tag

IE, Saf4, Chr2, Op

yes

yes

IE, FF, Saf, Chr, Op

IE, FF, Saf, Chr, Op

~100

在大多数情况下,Script DOM Element是一个好的选择。这种方式适用于所有的浏览器,而且没有跨域的限制,实现起来也非常的简单和易于理解。唯一的缺点是不能保证各个脚本的执行顺序。如果需要加载多个有依赖关系的脚本,应该将这些脚本拼成一个来保证其按需要的顺序执行,或者使用别的技术。
目前异步加载时保持执行顺序的方法有下面几种,由于篇幅原因,暂不详细描述。
单个脚本
1、Hardcoded Callback
2、Window Onload
3、Timer
4、Script Onload
5、Degrading Script Tags
多个脚本
1、Managed XHR
2、DOM Element and Doc Write
本文参考《高性能网站建设进阶指南》

标签:无阻塞,加载脚本
0
投稿

猜你喜欢

  • Python处理JSON时的值报错及编码报错的两则解决实录

    2023-11-10 07:12:07
  • 使用Pytorch搭建模型的步骤

    2022-03-05 21:28:38
  • asp MYSQL出现问号乱码的解决方法

    2011-04-15 11:13:00
  • 画pytorch模型图,以及参数计算的方法

    2023-09-25 09:12:58
  • 浅析MySQL内存的使用说明(全局缓存+线程缓存)

    2024-01-26 02:46:20
  • Vue使用Echarts画柱状图详解

    2024-05-29 22:22:29
  • ant-design-vue中的select选择器,对输入值的进行筛选操作

    2024-04-26 17:41:26
  • koa+mongoose实现简单增删改查接口的示例代码

    2024-05-13 10:04:56
  • Python中的exec、eval使用实例

    2022-07-05 21:01:41
  • php 仿Comsenz安装效果代码打包提供下载

    2024-05-11 09:46:37
  • pycharm第三方库安装失败的问题及解决经验分享

    2023-07-11 01:50:45
  • 分享20个数据库设计的最佳实践

    2024-01-24 09:28:53
  • PHP实现基于3DES算法加密解密字符串示例

    2023-08-15 18:48:35
  • sql不常用函数总结以及事务,增加,删除触发器

    2012-07-11 16:03:42
  • Python3 pywin32模块安装的详细步骤

    2023-01-20 06:42:46
  • Python基于keras训练实现微笑识别的示例详解

    2022-06-14 10:02:07
  • js使用栈来实现10进制转8进制与取除数及余数

    2024-04-19 09:52:12
  • 我们需要什么样的压力测试工具?

    2009-09-09 14:18:00
  • 详解MySQL插入和查询数据的相关命令及语句使用

    2024-01-19 00:34:20
  • python的即时标记项目练习笔记

    2022-11-25 05:49:35
  • asp之家 网络编程 m.aspxhome.com