js에서 로드 지연과 미리 불러오는 구체적인 사용

지연 로딩 (게으른 로딩) 과 사전 로딩은 자주 사용하는 웹 최적화 수단입니다.

1. 로드 지연 (게으름)


원리: 진정으로 데이터가 필요할 때에야 진정으로 데이터 로드 작업을 실행할 수 있다.
목적: 로드 지연 메커니즘은 일부 무의미한 성능 비용을 피하기 위해 제기된 것이다

로드 지연을 실현하는 몇 가지 방법


1. js를 마지막으로 불러오기


사용 방법: js 외부에 도입된 파일을 페이지 밑에 놓기
용도: js를 마지막으로 도입하여 페이지 불러오는 속도를 가속화합니다
설명:
유람기가 동기화 모드를 사용하는 이유는 일반적으로 js 파일을 불러오거나 탭을 놓는 것이 구조의 맨 뒤에 있기 때문이다. 또한 브라우저의 후속 작업을 막을 수 있기 때문에 뒤에 놓고 페이지 구조와 스타일이 모두 렌더링된 후에 js를 실행하여 사용자 체험을 향상시킨다.

2. defer 属性


사용 방법: 탭에 defer 속성을 정의합니다.
용도: 스크립트가 실행될 때 페이지의 구조에 영향을 주지 않도록 합니다.즉, 스크립트는 전체 페이지로 지연되어 해석이 끝난 후에 실행된다는 것이다

<!DOCTYPE html>
<html>
<head>
  <script src="test1.js" defer="defer"></script>
  <script src="test2.js" defer="defer"></script>
</head>
<body>
<!-- 这里放内容 -->
</body>
</html>
설명:
  • 요소는 요소에 놓여 있지만 포함된 스크립트는 지연 브라우저가 탭을 만났을 때 실행합니다.
  • 브라우저가 script 스크립트에 해석되고 defer가 있을 때 브라우저는 defer 속성이 있는 script를 병행하여 다운로드하며 페이지의 후속 처리를 막지 않습니다.
  • 모든 defer 스크립트는 순서대로 실행됩니다.(그러나 실제 지연 스크립트는 반드시 순서대로 실행되는 것은 아니므로 지연 스크립트는 하나만 포함하는 것이 좋다.)
  • defer 속성은 외부 스크립트 파일에만 적용됩니다.
  • 3. async 属性


    사용 방법: 라벨에 async 속성을 정의합니다.
    용도: 스크립트가 다운로드되고 실행될 때까지 페이지를 기다리지 못하게 하고 다른 내용을 비동기적으로 불러옵니다.
    
    <!DOCTYPE html>
    <html>
    <head>
      <script src="test1.js" async></script>
      <script src="test2.js" async></script>
    </head>
    <body>
    <!-- 这里放内容 -->
    </body>
    </html>
    
    브라우저는 바로 스크립트를 다운로드하지만, 다른 자원을 다운로드하거나 다른 스크립트를 불러오기를 기다리는 등 페이지의 다른 작업에 방해가 되지 않습니다.후속 문서 요소를 불러오고 렌더링하는 과정과main.js의 불러오기와 실행을 병행합니다. 이 과정은 비동기적입니다.그것들은 온로드 이벤트 전에 완성될 것입니다.
    설명:
  • 브라우저는 바로 스크립트를 다운로드하지만 페이지의 다른 작업에 방해가 되지 않고 후속 문서 요소를 불러오고 렌더링하는 과정과 스크립트의 불러오기와 실행을 병행합니다.
  • 이 과정은 비동기적이며 온로드 이벤트 이전에 완성될 것이다.
  • 모든 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>
    

    常用实例 - 图片懒加载


    원리: 한 장의 그림은 라벨입니다. 브라우저가 요청한 그림이 의 src 속성에 따라 불러오는 것을 게을리하는 관건은 그림이 가시 구역에 들어가지 않았을 때 의 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 속성을 통해 그림을 화면 밖의 배경에 미리 불러올 수 있습니다.이 그림들의 경로가 변하지 않으면, 웹 페이지의 다른 곳에서 호출될 때, 브라우저는 렌더링 과정에서 미리 불러오는 (캐시) 그림을 사용합니다.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://www.jb51.net/article/154930.htm
    【2】 https://www.jb51.net/article/57579.htm
    이 js에서 불러오기 지연과 불러오기에 대한 구체적인 사용에 관한 글은 여기까지 소개합니다. 더 많은 js에서 불러오기 지연과 불러오기 내용에 대해서는 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기