간단하든 복잡하든 웹 애플리케이션은 HTML, JavaScript, CSS 파일로 구성됩니다. 일반적으로 개발자는 개발 속도를 높이기 위해 JQuery, Knockout, Underscore 등과 같은 타사 JavaScript 프레임워크를 사용합니다. 이러한 JavaScript 프레임워크는 특정 목적을 위해 개발되었으며 "입증"되었으므로 필요한 기능을 처음부터 구현하는 것보다 직접 사용하는 것이 더 적절합니다. 그러나 애플리케이션의 복잡성이 계속 증가함에 따라 깨끗하고 결합이 적으며 유지 관리가 가능한 코드를 작성하는 것이 점점 더 중요해지고 있습니다. 이 기사에서는 RequireJS 프레임워크가 애플리케이션 개발자가 더 많은 모듈식 코드를 작성하는 데 어떻게 도움이 되는지, JavaScript 파일을 느리게 로드하여 애플리케이션 성능을 향상시키는 방법에 대해 설명합니다.
RequireJS 프레임워크 없이 시작한 후 다음 장에서는 RequireJS를 사용하여 리팩터링할 것입니다.
다음 HTML 페이지에는 ID가 "message"인
요소가 포함되어 있습니다. 사용자가 이 페이지를 방문하면 주문 ID와 고객 이름 정보가 표시됩니다.
Common.JS 파일에는 Order와 Customer라는 두 모듈의 정의가 포함되어 있습니다. showData 함수는 페이지 본문과 결합되어 write 함수를 호출하여 페이지에 출력할 정보를 넣습니다. 예를 들어, showData 함수에서 ID를 1로, 고객 이름을 Prasad로 하드코딩했습니다.
<!DOCTYPE html> <html> <head> <title>JavaScript NonRequireJS</title> <script src="common.js" type="text/javascript"></script> </head> <body> <strong>Display data without RequireJS</strong> <p id="message" /> <script type="text/javascript"> showData(); </script> </body> </html> Common.JS
function write(message) { document.getElementById('message').innerHTML += message + '</br>'; } function showData() { var o = new Order(1, "Prasad"); write("Order Id : " + o.id + " Customer Name : " + o.customer.name); } function Customer(name) { this.name = name; return this; } function Order(id, customerName) { this.id = id; this.customer = new Customer(customerName); return this; }
위 코드는 출력을 표시할 수 있지만 여전히 몇 가지 문제가 있습니다.
Common.JS 파일에는 정의해야 하는 모든 기능(write, showData)이 포함되어 있으며 모듈(주문, 고객)은 유지 관리 및 재사용이 어렵습니다. 다른 페이지에서 쓰기 기능을 재사용하고 위 JavaScript 파일을 참조하려면 이 페이지에 필요하지 않을 수 있는 다른 기능과 모듈도 가져왔습니다.
이제 리팩토링된 코드를 살펴보겠습니다. 아래 HTML 코드는 Require.JS 파일을 참조합니다. data-main 속성은 이 페이지의 유일한 진입점을 정의합니다. 아래 시나리오에서는 RequireJS가 시작 시 Main.js를 로드하도록 지시합니다.
<!DOCTYPE html> <html> <head> <title>JavaScript RequireJS</title> <script src="Require.Js" type="text/javascript" data-main="Main.js"></script> </head> <body> <strong>Display data using RequireJS</strong> <p id="message" /> </body> </html>
이 파일은 data-main 속성을 통해 지정되었으므로 RequireJS는 최대한 빨리 해당 파일을 로드합니다. 이 파일은 RequireJS 프레임워크의 기능을 사용하여 다른 JavaScript 파일에 대한 종속성을 결정하고 정의합니다. 아래 코드 조각에서 첫 번째 매개 변수는 종속성을 나타내며(Order.JS 파일에 따라 다름) 두 번째 매개 변수는 콜백 함수입니다. RequireJS는 모든 종속성을 분석하고 로드한 후 이 콜백 함수를 실행합니다. 첫 번째 매개변수(Order)의 값은 파일 이름(Order.JS)과 일치해야 합니다.
require(["Order"], function (Order) { var o = new Order(1, "Prasad"); write(o.id + o.customer.name); });
RequireJS 프레임워크는 JavaScript 파일 간의 종속성을 정의하고 유지 관리하는 쉬운 방법을 제공합니다. 아래 코드의 정의 함수는 Order 콜백 함수를 처리하기 전에 Customer.JS를 로드해야 함을 선언합니다.
define(["Customer"], function (Customer) { function Order(id, custName) { this.id = id; this.customer = new Customer(custName); } return Order; } );
이 파일은 다른 JavaScript 파일에 의존하지 않으므로 정의 함수의 첫 번째 매개변수 값이 빈 배열입니다.
이제 브라우저에서 이 애플리케이션을 열면 다음과 같은 출력이 표시됩니다. RequireJS는 필수 JavaScript 파일만 로드합니다.
요약
이 기사에서는 RequireJS 프레임워크가 JavaScript 파일 간의 종속성을 처리하고 필요에 따라 로드하는 방법을 분석합니다. 이는 개발자가 보다 느슨하게 결합되고, 모듈식이며, 유지 관리 가능한 코드를 작성하는 데 도움이 됩니다.
감사합니다
소스 코드 다운로드: RequireJS를 사용한 지연 로딩(Prasad Honrao, Codetails)