require.js_javascript 스킬 사용법에 대한 자세한 설명

WBOY
풀어 주다: 2016-05-16 15:35:59
원래의
1989명이 탐색했습니다.

1. require.js를 사용하는 이유는 무엇인가요?

초창기에는 모든 자바스크립트 코드가 하나의 파일에 작성되어 있었는데, 이 파일 하나만 로드하면 충분했습니다. 나중에는 코드가 점점 많아져서 하나의 파일로는 더 이상 부족해 여러 파일로 나누어 순차적으로 로드해야 했습니다. 많은 분들이 아래 웹페이지 코드를 보셨으리라 믿습니다.

 <script src="1.js"></script>
  <script src="2.js"></script>
  <script src="3.js"></script>
  <script src="4.js"></script>
  <script src="5.js"></script>
  <script src="6.js"></script>
로그인 후 복사

이 코드는 여러 js 파일을 순서대로 로드합니다.

이런 글쓰기 방식에는 큰 단점이 있습니다. 우선, 로드할 때 브라우저는 웹 페이지 렌더링을 중지합니다. 더 많은 파일이 로드될수록 웹 페이지의 응답이 길어집니다. 둘째, js 파일 간의 종속성으로 인해 로드 순서가 엄격하게 보장되어야 합니다. 위의 예처럼) 1.js가 2.js 앞에 와야 하며, 의존성이 가장 큰 모듈을 마지막에 로드해야 합니다. 의존성이 복잡하면 코드 작성 및 유지 관리가 어려워집니다.

require.js는 이 두 가지 문제를 해결하기 위해 탄생했습니다.

 

(1) 웹페이지의 응답 손실을 방지하기 위해 js 파일의 비동기 로딩을 구현합니다.

(2) 모듈 간의 종속성을 관리하여 코드 작성 및 유지 관리를 용이하게 합니다.

2. require.js 로딩

require.js를 사용하기 위한 첫 번째 단계는 공식 웹사이트에서 최신 버전을 다운로드하는 것입니다.

다운로드 후 js 하위 디렉토리에 위치하여 로딩이 가능한 것으로 가정합니다.

<script src="js/require.js"></script>
로그인 후 복사

어떤 사람들은 이 파일을 로드하면 웹페이지가 응답하지 않을 수도 있다고 생각할 수도 있습니다. 두 가지 해결 방법이 있습니다. 하나는 웹 페이지 하단에 로드하는 것이고, 다른 하나는 다음과 같이 작성하는 것입니다.

<script src="js/require.js" defer async="true" ></script>
로그인 후 복사

비동기 속성은 웹페이지가 응답하지 않는 것을 방지하기 위해 이 파일을 비동기식으로 로드해야 함을 나타냅니다. IE는 이 속성을 지원하지 않고 defer만 지원하므로 defer도 작성합니다.

require.js를 로드한 후 다음 단계는 자체 코드를 로드하는 것입니다. 우리 자신의 코드 파일이 main.js이고 js 디렉터리에도 있다고 가정합니다. 그럼 다음과 같이 작성해 보세요.

 <script src="js/require.js" data-main="js/main"></script>
로그인 후 복사

data-main 속성은 웹 프로그램의 메인 모듈을 지정하는 데 사용됩니다. 위의 예에서는 js 디렉터리 아래의 main.js입니다. 이 파일은 require.js에 의해 먼저 로드됩니다. require.js의 기본 파일 확장자는 js이므로 main.js를 main으로 축약할 수 있습니다.

3. 메인 모듈 작성 방법

이전 섹션의 main.js를 "메인 모듈"이라고 부르는데, 이는 전체 웹 페이지의 항목 코드를 의미합니다. C 언어의 main() 함수와 약간 비슷하며 모든 코드가 여기에서 실행되기 시작합니다.

main.js를 작성하는 방법을 살펴보겠습니다.

우리 코드가 다른 모듈에 의존하지 않는다면 자바스크립트 코드를 직접 작성할 수 있습니다.

//main.js
Alert("로드 성공!");

그러나 이 경우 require.js를 사용할 필요가 없습니다. 매우 일반적인 상황은 메인 모듈이 다른 모듈에 의존하는 경우이며, 이 경우 AMD 사양에 정의된 require() 함수를 사용해야 합니다.

// main.js
  require(['moduleA', 'moduleB', 'moduleC'], function (moduleA, moduleB, moduleC){
    // some code here
  });
로그인 후 복사

require() 함수는 두 개의 매개변수를 허용합니다. 첫 번째 매개변수는 의존하는 모듈을 나타내는 배열입니다. 위의 예는 ['moduleA', 'moduleB', 'moduleC']입니다. 즉, 주 모듈은 이 세 가지 모듈에 의존합니다. 두 번째 매개변수는 콜백입니다. 현재는 위에 지정된 모든 모듈이 성공적으로 로드된 후에 호출됩니다. 로드된 모듈은 이 함수에 매개변수로 전달되므로 이러한 모듈은 콜백 함수 내에서 사용할 수 있습니다.

require()는 moduleA, moduleB 및 moduleC를 비동기식으로 로드하며 브라우저는 응답을 잃지 않습니다. 지정된 콜백 함수는 이전 모듈이 성공적으로 로드된 후에만 실행되어 종속성 문제를 해결합니다.

아래에서 실제 사례를 살펴보겠습니다.

메인 모듈이 jquery, 밑줄 및 백본의 세 가지 모듈에 의존한다고 가정하면 main.js는 다음과 같이 작성할 수 있습니다.

  require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){
    // some code here
  });
로그인 후 복사

require.js는 먼저 jQuery, 밑줄 및 백본을 로드한 다음 콜백 함수를 실행합니다. 콜백 함수에는 메인 모듈의 코드가 작성되어 있습니다.

4. 모듈 로딩

이전 섹션의 마지막 예에서 기본 모듈의 종속 모듈은 ['jquery', 'underscore', 'backbone']입니다. 기본적으로 require.js는 이 세 가지 모듈이 main.js와 동일한 디렉터리에 있다고 가정하고 파일 이름은 각각 jquery.js, underscore.js, backbone.js로 하여 자동으로 로드합니다.

require.config() 메소드를 사용하면 모듈의 로딩 동작을 사용자 정의할 수 있습니다. require.config()는 메인 모듈(main.js)의 선두에 작성됩니다. 매개변수는 객체이고, 이 객체의 paths 속성은 각 모듈의 로딩 경로를 지정합니다.

require.config({
    paths: {
      "jquery": "jquery.min",
      "underscore": "underscore.min",
      "backbone": "backbone.min"
    }
  });
로그인 후 복사

上面的代码给出了三个模块的文件名,路径默认与main.js在同一个目录(js子目录)。如果这些模块在其他目录,比如js/lib目录,则有两种写法。一种是逐一指定路径。

require.config({
    paths: {
      "jquery": "lib/jquery.min",
      "underscore": "lib/underscore.min",
      "backbone": "lib/backbone.min"
    }
  });
로그인 후 복사

另一种则是直接改变基目录(baseUrl)。

require.config({
    baseUrl: "js/lib",
    paths: {
      "jquery": "jquery.min",
      "underscore": "underscore.min",
      "backbone": "backbone.min"
    }
  });
로그인 후 복사

如果某个模块在另一台主机上,也可以直接指定它的网址,比如:

require.config({
    paths: {
      "jquery": "https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min"
    }
  });
로그인 후 복사

require.js要求,每个模块是一个单独的js文件。这样的话,如果加载多个模块,就会发出多次HTTP请求,会影响网页的加载速度。因此,require.js提供了一个优化工具,当模块部署完毕以后,可以用这个工具将多个模块合并在一个文件中,减少HTTP请求数。

五、AMD模块的写法

require.js加载的模块,采用AMD规范。也就是说,模块必须按照AMD的规定来写。

具体来说,就是模块必须采用特定的define()函数来定义。如果一个模块不依赖其他模块,那么可以直接定义在define()函数之中。

假定现在有一个math.js文件,它定义了一个math模块。那么,math.js就要这样写:

// math.js
  define(function (){
    var add = function (x,y){
      return x+y;
    };
    return {
      add: add
    };
  });
로그인 후 복사

加载方法如下:

  // main.js
  require(['math'], function (math){
    alert(math.add(1,1));
  });
로그인 후 복사

如果这个模块还依赖其他模块,那么define()函数的第一个参数,必须是一个数组,指明该模块的依赖性。

define(['myLib'], function(myLib){
    function foo(){
      myLib.doSomething();
    }
    return {
      foo : foo
    };
  });
로그인 후 복사

当require()函数加载上面这个模块的时候,就会先加载myLib.js文件。

六、加载非规范的模块

理论上,require.js加载的模块,必须是按照AMD规范、用define()函数定义的模块。但是实际上,虽然已经有一部分流行的函数库(比如jQuery)符合AMD规范,更多的库并不符合。那么,require.js是否能够加载非规范的模块呢?回答是可以的。这样的模块在用require()加载之前,要先用require.config()方法,定义它们的一些特征。举例来说,underscore和backbone这两个库,都没有采用AMD规范编写。如果要加载它们的话,必须先定义它们的特征。

require.config({
    shim: {
      'underscore':{
        exports: '_'
      },
      'backbone': {
        deps: ['underscore', 'jquery'],
        exports: 'Backbone'
      }
    }
  });
로그인 후 복사

require.config()接受一个配置对象,这个对象除了有前面说过的paths属性之外,还有一个shim属性,专门用来配置不兼容的模块。具体来说,每个模块要定义(1)exports值(输出的变量名),表明这个模块外部调用时的名称;(2)deps数组,表明该模块的依赖性。

比如,jQuery的插件可以这样定义:

 shim: {
    'jquery.scroll': {
      deps: ['jquery'],
      exports: 'jQuery.fn.scroll'
    }
  }
로그인 후 복사
로그인 후 복사

七、require.js插件

require.js还提供一系列插件,实现一些特定的功能。

domready插件,可以让回调函数在页面DOM结构加载完成后再运行。

 shim: {
    'jquery.scroll': {
      deps: ['jquery'],
      exports: 'jQuery.fn.scroll'
    }
  }
로그인 후 복사
로그인 후 복사

text和image插件,则是允许require.js加载文本和图片文件。

define([
    'text!review.txt',
    'image!cat.jpg'
    ],
    function(review,cat){
      console.log(review);
      document.body.appendChild(cat);
    }
  );
로그인 후 복사

类似的插件还有json和mdown,用于加载json文件和markdown文件。

以上就是本文的全部所述,希望本文分享对大家有所帮助。

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!