> 웹 프론트엔드 > JS 튜토리얼 > js 비동기 파일 로더에 대한 자세한 설명

js 비동기 파일 로더에 대한 자세한 설명

高洛峰
풀어 주다: 2016-12-28 13:45:52
원래의
1227명이 탐색했습니다.

이 시나리오는 종종 발생합니다. 일부 페이지는 타사 플러그인에 의존하며 이러한 플러그인은 상대적으로 크기가 크며 페이지의 기본 js에 패키징하는 데 적합하지 않습니다(cmd, js를 사용한다고 가정). 파일로 패키징됨) 이때 일반적으로 이러한 플러그인 파일을 비동기식으로 가져오고 다운로드가 완료된 후 초기화 로직을 완료합니다.

이미지 업로드를 예로 들면, plupload.js 플러그인을 사용한 후 다음과 같이 작성합니다:

!window.plupload ?
    $.getScript( "/assets/plupload/plupload.full.min.js", function() {
      self._initUploader();
    }) :
    self._initUploader();
로그인 후 복사

그러나 페이지는 일반적으로 여러 개의 독립 모듈로 구성됩니다( 구성 요소), 페이지의 모듈 A와 B가 모두 plupload.js에 의존하는 경우 두 위치 모두에 위 코드를 작성해야 합니까? 이렇게 하면 plupload.js가 다운로드되기 전에 두 개의 요청이 시작될 수 있습니다. 병렬로 다운로드되므로 js 파일을 처음 다운로드하고 두 번째로 캐시된 콘텐츠를 가져오는 대신 반복적으로 다운로드될 수 있습니다.

아래 그림은 페이지의 여러 구성요소가 vue.js에 의존하는 상황을 보여줍니다(jquery와 vue가 혼합된 시나리오).

js 비동기 파일 로더에 대한 자세한 설명

그래서, 실제 사용 시 필요합니다. 잠금은 스크립트를 로드할 때 스크립트를 반복적으로 요청해서는 안 된다는 의미입니다. 로드가 완료된 후 후속 로직이 순서대로 실행됩니다. 약속의 좋은 도구를 사용하면 매우 간단합니다. 구현하다.

// vue加载器
var promiseStack = [];
function loadvue() {
  var promise = $.Deferred();
  if (loadvue.lock) {
    promiseStack.push(promise);
     
  } else {
    loadvue.lock = true;
    window.Vue ? 
       promise.resolve() : // 这里写错了,window.Vue为true的时候lock要置为false,我在后面改过来了
       $.getScript( "/assets/vue/vue.min.js", function() {
        loadvue.lock = false;
        promise.resolve();
        promiseStack.forEach(function(prom) {
          prom.resolve();
        });
      });
     
  }
  return promise;
}
window.loadvue = loadvue;
로그인 후 복사

그런 다음 vue.js를 사용합니다.

loadvue().then(function() { // do something });
로그인 후 복사

요청을 다시 살펴보세요.

js 비동기 파일 로더에 대한 자세한 설명

자, 여기 있습니다. go 여기서 문제가 해결된 것 같지만 내 페이지에 plupload.js와 vue.js를 모두 의존하는 등 여러 플러그인 종속성이 있는 경우 위 코드를 다시 작성해야 합니까(왜 기분이 좋을까요?) 내가 이렇게 말했지)? 이것은 중복되지 않습니까? 따라서 여러 비동기 로더를 생성하는 데 도움이 되는 비동기 로더 생성기가 필요합니다.

/**
 * @des: js异步加载器生产器
 * @param {string} name  加载器名称
 * @param {string} global 全局变量
 * @param {string} url  加载地址
 **/
 
var promiseStack = {};
 
exports.generate = function(name, global, url) {
  var foo = function() {
    if (!promiseStack[name]) {
      promiseStack[name] = [];
    }
    var promise = $.Deferred();
    if (foo.lock) {
      promiseStack[name].push(promise);
       
    } else {
      foo.lock = true;
      if (window[global]) {
        foo.lock = false;
        promise.resolve();
      } else {
        $.getScript(url, function() {
          foo.lock = false;
          promise.resolve();
          promiseStack[name].forEach(function(prom) {
            prom.resolve();
          });
        });
      }
       
    }
    return promise;
  };
   
  return foo;
};
로그인 후 복사

그런 다음 비동기 로더를 생성하여 창에 할당할 수 있습니다

// 全局加载器
window.loadvue = loader.generate(
'vue', 
'Vue', 
'/assets/vue/vue.min.js');
window.loadPlupload = loader.generate(
'plupload', 
'plupload', 
'/assets/plupload/plupload.full.min.js');
로그인 후 복사

위와 동일한 방법을 사용하면 기본적으로 문제가 해결됩니다.

이상은 js 비동기 파일 로더에 대한 내용입니다. 모든 분들의 학습에 도움이 되었으면 좋겠습니다.

js 비동기 파일 로더에 대한 더 자세한 글은 PHP 중국어 홈페이지를 참고해주세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿