js中延迟加载和预加载的具体使用


Posted in Javascript onJanuary 14, 2021

延迟加载(懒加载)和预加载是常用的 web 优化的手段。。

一、延迟加载(懒加载)

原理: 当在真正需要数据的时候,才真正执行数据加载操作。
目的: 延迟加载机制是为了避免一些无谓的性能开销而提出来的

实现延迟加载的几种方法

1. 让 js 最后加载

使用方法: 把 js 外部引入的文件放到页面底部
用途: 让 js 最后引入,从而加快页面加载速度
说明:
流览器之所以会采用同步模式,通常加载 js 文件或者放<script>标签都在结构最后面,也是因为它会阻止浏览器后续操作的原因,所以放在后面,当页面结构和样式全部渲染完成再执行 js,提升用户体验

2. defer 属性

使用方法: 为 <script>标签定义了 defer属性。
用途: 让脚本在执行时不会影响页面的构造。也就是说,脚本会被延迟到整个页面都解析完毕之后再执行

<!DOCTYPE html>
<html>
<head>
  <script src="test1.js" defer="defer"></script>
  <script src="test2.js" defer="defer"></script>
</head>
<body>
<!-- 这里放内容 -->
</body>
</html>

说明:

  • 虽然<script>元素放在了<head>元素中,但包含的脚本将延迟浏览器遇到</html>标签后再执行。
  • 当浏览器解析到 script 脚本,有 defer 时,浏览器会并行下载有 defer 属性的 script,而不会阻塞页面后续处理。
  • 所有的 defer 脚本保证是按顺序依次执行的。(但实际上延迟脚本并不一定会按照顺序执行,因此最好只包含一个延迟脚本)
  • defer 属性只适用于外部脚本文件。

3. async 属性

使用方法: 为 <script>标签定义了 async属性。
用途: 不让页面等待脚本下载和执行,从而异步加载页面其他内容。

<!DOCTYPE html>
<html>
<head>
  <script src="test1.js" async></script>
  <script src="test2.js" async></script>
</head>
<body>
<!-- 这里放内容 -->
</body>
</html>

浏览器会立即下载脚本,但不妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本。加载和渲染后续文档元素的过程和 main.js 的加载与执行并行进行,这个过程是异步的。它们将在 onload 事件之前完成。

说明:

  • 浏览器会立即下载脚本,但不妨碍页面中的其他操作,加载和渲染后续文档元素的过程和脚本的加载与执行并行进行。
  • 这个过程是异步的,它们将在 onload 事件之前完成。
  • 所有的 defer 脚本不能控制加载的顺序。。
  • asyncr 属性只适用于外部脚本文件。

4. 动态创建 DOM 方式

//这些代码应被放置在</body>标签前(接近HTML文件底部)
<script type="text/javascript">
  function downloadJSAtOnload() {
    varelement = document.createElement("script");
    element.src = "defer.js";
    document.body.appendChild(element);
  }
  if (window.addEventListener)
   window.addEventListener("load",downloadJSAtOnload, false);
  else if (window.attachEvent)
   window.attachEvent("onload",downloadJSAtOnload);
  else
   window.onload =downloadJSAtOnload;
</script>

5. 使用 jquery 的 getScript 方法

使用方法:

Query.getScript(url,success(response,status))
  • url(必写):将要请求的 URL 字符串
  • success(response,status)(可选):规定请求成功后执行的回调函数。

其中的参数
response - 包含来自请求的结果数据
status - 包含请求的状态("success", "notmodified", "error", "timeout" 或 "parsererror")

用途: 通过 HTTP GET 请求载入并执行 JavaScript 文件。

//加载并执行 test.js:
$.getScript("test.js");
//加载并执行 test.js ,成功后显示信息
$.getScript("test.js", function(){
 alert("Script loaded and executed.");
});

6.使用 setTimeout 延迟方法的加载时间

用途: 延迟加载 js 代码,给网页加载留出时间

<script type="text/javascript">
 function A(){
  $.post("/lord/login",{name:username,pwd:password},function(){
   alert("Hello World!");
  })
 }
 $(function (){
  setTimeout("A()",1000); //延迟1秒
 })
</script>

常用实例 - 图片懒加载

原理: 一张图片就是一个<img>标签,浏览器是否发起请求图片是根据<img>的 src 属性,所以实现懒加载的关键就是,在图片没有进入可视区域时,先不给<img>的 src 赋值,这样浏览器就不会发送请求了,等到图片进入可视区域再给 src 赋值。

<img class="lazy" src="img/loading.gif" lazy-src="img/pic1.jpg" >
<img class="lazy" src="img/loading.gif" lazy-src="img/pic2.jpg" >
function lazyload(){
 var visible;
 $('img').each(function () {
 if( typeof($(this).attr("lazy-src"))!="undefined" ){ // 判断图片是否需要懒加载
  visible = $(this).offset().top - $(window).scrollTop(); //图片距离顶部的距离
  if ((visible > 0) && (visible < $(window).height())) {// 判断图片是否在可视区域
    visible = true;// 图片在可视区域
  } else {
    visible = false;// 图片不在可视区域
  }
  if (visible) {
    $(this).attr('src', $(this).attr('lazy-src'));
  }
 }
 });
}
 // 打开页面触发函数
 lazyload();
 // 滚屏时触发函数
 window.onscroll =function(){
 lazyload(imgs);
 }

二、 预加载

原理: 提前加载图片,当用户需要查看时可直接从本地缓存中渲染
目的: 牺牲前端性能,换取用户体验,使用户的操作得到最快的反映。

实现预加载的几种方法

1. css 实现

原理: 可通过 CSS 的background 属性 将图片预加载到屏幕外的背景上。只要这些图片的路径保持不变 ,当它们在 Web 页面的其他地方被调用时,浏览器就会在渲染过程中使用预加载(缓存)的图片。简单、高效,不需要任何 JavaScript。

#preload-01 { background: url(http://domain.tld/image-01.png) no-repeat -9999px -9999px; }

#preload-02 { background: url(http://domain.tld/image-02.png) no-repeat -9999px -9999px; }

#preload-03 { background: url(http://domain.tld/image-03.png) no-repeat -9999px -9999px; }

2. js 预加载图片

原理: 通过写函数进行预加载。将该脚本封装入一个函数中,并使用 addLoadEvent(),延迟预加载时间,直到页面加载完毕。

function preloader() {
  if (document.images) {
    var img1 = new Image();
    var img2 = new Image();
    var img3 = new Image();
    img1.src = "http://domain.tld/path/to/image-001.gif";
    img2.src = "http://domain.tld/path/to/image-002.gif";
    img3.src = "http://domain.tld/path/to/image-003.gif";
  }
}
function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}
addLoadEvent(preloader);

3. 使用 ajax 实现预加载

原理: 使用 Ajax 实现图片预加载的方法,利用 DOM,不仅仅预加载图片,还会预加载 CSS、JavaScript 等相关的东西

window.onload = function() {
  setTimeout(function() {
    // XHR to request a JS and a CSS
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://domain.tld/preload.js');
    xhr.send('');
    xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://domain.tld/preload.css');
    xhr.send('');
    // preload image
    new Image().src = "http://domain.tld/preload.png";
  }, 1000);
};

上面代码预加载了“preload.js”、“preload.css”和“preload.png”。1000 毫秒的超时是为了防止脚本挂起,而导致正常页面出现功能问题。

三、 懒加载与预加载的对比

1、概念

延迟加载也叫懒加载: 当在真正需要数据的时候,才真正执行数据加载操作。
预加载:提前加载,当用户需要查看时可直接从本地缓存中渲染

2、区别

  • 两种技术的本质:两者的行为相反,一个是提前加载,一个是迟缓甚至不加载。
  • 懒加载会对前端有一定的缓解压力作用,预加载则会增加前端的压力。

3、意义

懒加载的主要目的是优化前端性能,减少请求数或延迟请求数。
预加载是牺牲前端性能,换取用户体验,使用户的操作得到最快的反映。

四、 参考资料

【1】https://3water.com/article/154930.htm
【2】https://3water.com/article/57579.htm

到此这篇关于js中延迟加载和预加载的具体使用的文章就介绍到这了,更多相关js中延迟加载和预加载内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
Mar 10 Javascript
ajaxControlToolkit AutoCompleteExtender的用法
Oct 30 Javascript
一个简单的js渐显(fadeIn)渐隐(fadeOut)类
Jun 19 Javascript
jquery 跨域访问问题解决方法(笔记)
Jun 08 Javascript
jQuery LigerUI 使用教程表格篇(1)
Jan 18 Javascript
js出生日期 年月日级联菜单示例代码
Jan 10 Javascript
JavaScript中for-in遍历方式示例介绍
Feb 11 Javascript
javascript白色简洁计算器
May 04 Javascript
jQuery Validate验证框架详解(推荐)
Dec 17 Javascript
关于Angular2 + node接口调试的解决方案
May 28 Javascript
微信小程序获取微信运动步数的实例代码
Jul 20 Javascript
Vue组件库发布到npm详解
Feb 17 Javascript
JS中箭头函数与this的写法和理解
Jan 14 #Javascript
JavaScript this关键字的深入详解
Jan 14 #Javascript
Vue实现多页签组件
Jan 14 #Vue.js
如何在vue中使用HTML 5 拖放API
Jan 14 #Vue.js
Vue中引入svg图标的两种方式
Jan 14 #Vue.js
vue+element table表格实现动态列筛选的示例代码
Jan 14 #Vue.js
vue 递归组件的简单使用示例
Jan 14 #Vue.js
You might like
php操作xml
2013/10/27 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
JS中简单的实现像C#中using功能(有源码下载)
2007/01/09 Javascript
可选择和输入的下拉列表框示例
2013/11/05 Javascript
javascript实现动态标签云
2015/10/16 Javascript
jQuery的实例及必知重要的jQuery选择器详解
2016/05/20 Javascript
微信小程序 Template详解及简单实例
2017/01/05 Javascript
微信小程序实战之自定义抽屉菜单(7)
2017/04/18 Javascript
关于HTTP传输中gzip压缩的秘密探索分析
2018/01/12 Javascript
解决vue-cli创建项目的loader问题
2018/03/13 Javascript
如何使用pm2快速将项目部署到远程服务器
2019/03/12 Javascript
jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例
2020/06/02 jQuery
jquery实现有过渡效果的tab切换
2020/07/17 jQuery
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
[05:46]2018完美盛典-《同梦共竞》
2018/12/17 DOTA
[01:01:14]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第一场 11.21
2020/11/23 DOTA
Python的Flask框架应用调用Redis队列数据的方法
2016/06/06 Python
python 读写、创建 文件的方法(必看)
2016/09/12 Python
python爬虫正则表达式之处理换行符
2018/06/08 Python
python 实现A*算法的示例代码
2018/08/13 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
python实现将range()函数生成的数字存储在一个列表中
2020/04/02 Python
浅析Python中字符串的intern机制
2020/10/03 Python
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
英国时尚配饰、珠宝和服装网站:KJ Beckett
2020/01/23 全球购物
会计实习自我鉴定
2013/12/04 职场文书
社会实践感言
2014/01/25 职场文书
火车的故事教学反思
2014/02/11 职场文书
政府信息公开实施方案
2014/05/09 职场文书
2015年七一建党节演讲稿
2015/03/19 职场文书
大学生社会服务心得体会
2016/01/22 职场文书
python正则表达式re.search()的基本使用教程
2021/05/21 Python
Python+tkinter实现高清图片保存
2022/03/13 Python