预加载,同步加载,延迟加载和异步加载

概述

加载技术很重要,我看见很多别人的博客园都用到了不同的加载技术,所以我想好好总结一下。

本文是我查阅网上资料总结的我认为重要的几点,供以后开发时参考,相信对其他人也有用。

预加载

代码示例

代码放在head头里面。

  <link rel="preload" href="style.css" as="style">
  <link rel="preload" href="main.js" as="script">

  <link rel="preload" as="script" href="async_script.js"
      onload="var script = document.createElement('script'); script.src = this.href; document.body.appendChild(script);">
字体的预加载
  <link rel="preload" href="fonts/cicle_fina-webfont.eot" as="font" type="application/vnd.ms-fontobject" crossorigin="anonymous">
  <link rel="preload" href="fonts/cicle_fina-webfont.woff2" as="font" type="font/woff2" crossorigin="anonymous">
  <link rel="preload" href="fonts/cicle_fina-webfont.woff" as="font" type="font/woff" crossorigin="anonymous">
加载但不执行

预加载一个脚本,但到需要的时候才执行:

var preloadLink = document.createElement("link");
preloadLink.href = "myscript.js";
preloadLink.rel = "preload";
preloadLink.as = "script";
document.head.appendChild(preloadLink);

加载一个脚本并执行

var preloadedScript = document.createElement("script");
preloadedScript.src = "myscript.js";
document.body.appendChild(preloadedScript);
响应式加载
  <link rel="preload" href="bg-image-narrow.png" as="image" media="(max-width: 600px)">
  <link rel="preload" href="bg-image-wide.png" as="image" media="(min-width: 601px)">
prefetch

preload,资源预加载,预先获取本页面的可能用到的资源。
prefetch,资源预获取,预先获取下一个页面的可能用到的资源。

  <link rel="preload" href="bg-image-narrow.png" as="image" media="(max-width: 600px)">
  <link rel="preload" href="bg-image-wide.png" as="image" media="(min-width: 601px)">
兼容性

IE不兼容,其它兼容。

加载图示

加载方式

同步加载

如图上所示,同步加载在资源的下载和执行阶段都会阻塞html的解析,发生页面阻塞。

注意:一般建议把js放在页面尾部,但是还是会造成页面阻塞

示例如下:

<script src="http://yourdomain.com/script.js"></script>

延迟加载

defer属性

如图上所示,延迟加载在资源的下载不会阻塞html的解析,并在html的解析完成之后才开始执行(即浏览器遇到</html>标签后再执行)。

注意:延迟脚本并不一定会按照顺序执行。

<script src="test2.js" defer="defer"></script>
setTimeout
<script language="JavaScript" src="" id="my"></script> 
<script> 
setTimeout("document.getElementById('my').src='include/common.php'; ",3000);//延时3秒 
</script> 

或者

<script>
function lazyRun(){
    var lazyScript = document.createElement("script");
    lazyScript.src = "myscript.js";
    document.body.appendChild(lazyScript);
}

//也可以不要onload
window.onload=function(){
  setTimeout('lazyRun()',1000)
}
</script>

异步加载

async属性

如图上所示,异步加载在资源的下载不会阻塞html的解析,并在下载完成之后立即执行。

注意:异步脚本并不一定会按照顺序执行。

注意:这种方法会在加载方式执行完之阻止onload事件的触发,如果不想阻止onload事件,请用preload或其它方法。

<script src="test2.js" defer="async"></script>
DOM方法
(function(){;
    var ga = document.createElement('script'); 
    ga.type = 'text/javascript'; 
    ga.async = true; 
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 
    var s = document.getElementsByTagName('script')[0]; 
    s.parentNode.insertBefore(ga, s); 
})();
onload加载
(function(){
    if(window.attachEvent){
        window.attachEvent("load", asyncLoad);
    }else{
        window.addEventListener("load", asyncLoad);
    }
    var asyncLoad = function(){
        var ga = document.createElement('script'); 
        ga.type = 'text/javascript'; 
        ga.async = true; 
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 
        var s = document.getElementsByTagName('script')[0]; 
        s.parentNode.insertBefore(ga, s);
    }
)();
jQuery
$.getScript("outer.js",function(){//回调函数,成功获取文件后执行的函数  
      console.log("脚本加载完成")  
});

转载于:https://www.cnblogs.com/yangzhou33/p/8439923.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值