>  기사  >  웹 프론트엔드  >  프론트엔드 js로 require.js를 모듈화하는 방법

프론트엔드 js로 require.js를 모듈화하는 방법

jacklove
jacklove원래의
2018-05-21 10:19:341681검색

requirejs는 JavaScript 파일 및 모듈 로더입니다. requireJS를 사용하면 JavaScript 코드를 파일과 모듈로 분리하는 동시에 각 모듈 간의 종속성을 관리할 수 있습니다.

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는 다음 두 가지 문제를 해결하기 위해 탄생했습니다.

js 파일의 비동기 로딩을 실현하여 웹 페이지의 응답 손실을 방지합니다.

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

2. require.js 로딩

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

다운로드 후 js 하위 디렉토리에 넣어야 로딩이 가능한 것으로 가정합니다.
 
7c439788e166f531c8ad0b30265c71032cacc6d41bbb37262a98f745aa00fbf0

어떤 사람들은 이 파일을 로드하면 웹페이지가 응답하지 않을 수도 있다고 생각할 수도 있습니다. 두 가지 해결 방법이 있습니다.

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

data-main 속성은 웹 프로그램의 메인 모듈을 지정하는 데 사용됩니다.

위의 예에서는 js 디렉토리 아래의 main.js입니다. 이 파일은 require.js에 의해 먼저 로드됩니다. require.js의 기본 파일 확장자는 js이므로 main.js를 main으로 축약할 수 있습니다.

require.js를 로드한 후 다음 단계는 자체 코드를 로드하는 것입니다. 우리 자신의 코드 파일이 main.js이고 js 디렉터리에도 있다고 가정합니다. 그럼 이렇게 쓰면 됩니다:
 

<script src="js/require.js" data-main="js/main"></script>

하나는 웹 페이지 하단에 로드하는 것이고, 다른 하나는 이렇게 작성하는 것입니다:
 

<script src="js/require.js" defer async="true" ></script>

셋.메인 모듈 작성 방법

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

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

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

// main.js
alert("加载成功!");

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

// main.js
require([&#39;moduleA&#39;, &#39;moduleB&#39;, &#39;moduleC&#39;], function (moduleA, moduleB, moduleC){
// some code here
});

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

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

이제 실제 예를 살펴보겠습니다.

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

require([&#39;jquery&#39;, &#39;underscore&#39;, &#39;backbone&#39;], 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({
baseUrl: "js/lib",
paths: {"jquery": "jquery.min", "underscore": "underscore.min", "backbone": "backbone.min"}
});

다른 하나는 기본 디렉터리(baseUrl)를 직접 변경하는 것입니다.

require.config({    baseUrl: "js/lib",
    paths: {        "jquery": "jquery.min",        "underscore": "underscore.min",        "backbone": "backbone.min"
    }
});

모듈이 다른 호스트에 있는 경우 다음과 같이 해당 URL을 직접 지정할 수도 있습니다.
 

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([&#39;math&#39;], function (math){
   alert(math.add(1,1));
 });

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

define([&#39;myLib&#39;], 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: { &#39;underscore&#39;: {              exports: &#39;_&#39;
         },          &#39;backbone&#39;: {
              deps: [&#39;underscore&#39;, &#39;jquery&#39;],              exports: &#39;Backbone&#39;
          }
      }
  });

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

   shim: {
      &#39;jquery.scroll&#39;: {
        deps: [&#39;jquery&#39;],
        exports: &#39;jQuery.fn.scroll&#39;
      }
    }

七、require.js插件

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

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

require([&#39;domready!&#39;], function (doc) {     // called once the DOM is ready
 });

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

define([&#39;text!review.txt&#39;,&#39;image!cat.jpg&#39;],
        function (review, cat) {             console.log(review);             document.body.appendChild(cat);         } );

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

本篇介绍了用前端js模块化编写require.js,想要更多相关学习内容请关注php中文网。

相关推荐:

关于AJAX ASP/PHP 请求实例的相关知识

关于AJAX中 XML 的实例讲解

关于 AJAX 投票的演示

위 내용은 프론트엔드 js로 require.js를 모듈화하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.