JS 모듈 관리(Javascript Modules Management)
RequireJS 는 자바스크립트 파일/모듈 로더입니다.
브라우저 환경에서 최적화되어 있으나 Node 와 같은 다른 자바스크립트 환경에서도 사용될 수 있습니다.
그렇다면 모듈 로더는 무엇인가?!
JAVA 나 그 밖의 다른 서버사이드 언어는 파일을 include 하여 사용할 수 있으나 자바스크립트 자체로는 file01.js 파일로부터 다른 file02.js 파일을 include 할 수 있는 방법이 없습니다. 하지만 이를 해결할 수 있는 여러가지 방법이 존재하고 있으며 이러한 방법을 통해 자바스크립트 파일들 서로 간에 의존성/종속성 관리를 할 수 있습니다.
여러가지 방법 중의 하나인 RequireJS 와 같은 모듈 방식의 스크립트 로더를 사용한다면 웹 어플리케이션의 품질과 속도, 최적화를 향상 시킬 수 있습니다.
이 포스팅에서는 Javascript 관리와 성능을 향상시키기 위한 모듈 관리방법중에 RequrieJS 에 대해 알아보고자 합니다.
그리고 이 글을 읽기에 앞서 Client/Sever Side Javascript 표준화를 위한 CommonJS, AMD 에 대해 알아볼 것을 추천드립니다.
다음의 코드를 간단히 살펴보도록 하겠습니다.
http://requirejs.org/docs/download.html 에서 require.js 를 다운받아 import 를 해주고 require 함수를 사용하여 무엇(여기선 jQuery)인가를 로드하면 로드를 하기 전에 또 거기에 의존성이 있는 파일, 즉 require 로 로드할 의존성 모듈들을 먼저 가져온 후에 콜백함수가 실행되는 방식입니다
물론 RequireJS 를 위와 같이 작성하지는 않습니다.
위와 같은 방식을 사용하게 되면 jQuery 가 실행될 때 전역 네임스페이스가 $ 변수로 오염되기 때문입니다. 이는 다른 라이브러리와의 충돌이나 두 개의 다른 버전의 제이쿼리를 사용할 수 없을 것입니다.
이는 모듈 로더인 RequireJS 를 사용하려는 목적에 벗어나는 일이니까요.
일반적인 자바스크립트 패턴의 사용은 편하기는 하지만 이 편안함에 너무 의존하다보면 돌이킬 수 없는 스파게티 코드나
중복 코드 발생이 빈번해 질 수 있기 때문에 모듈 프로그래밍이 필요합니다.
RequireJS 는 일반적인 스크립트 패턴에서 발생할 수 있는 문제점에 대한 대안이 될 수 있으며, RequrieJS 를 사용함으로써 모듈 생성/호출 등 관리를 통해 좀 더 체계적인 프로그래밍을 가능하게 해 주며 브라우저 지원 또한 IE 6 이상을 지원하고 있습니다.
RequireJS 의 모듈 패턴은 일반적으로 스크립트를 작성하는 패턴과는 달리 전역 네임스페이스의 오염을 피할 수 있는 별도의 컨텍스트인 한정된 범위에서 객체를 선언하여 사용하는 점에서 차이점이 있습니다.
모듈은 해당 모듈의 의존(dependancy) 목록을 명시할 수 있으며 전역객체에 대한 참조없이 의존 모듈 상의 객체를 함수의 인자(args)로 받음으로써 핸들링할 수 있게 해줍니다.
Usage RequireJS (기본적인 사용법)
RequireJS 다운로드 및 설치
RequireJS 홈페이지에서 다운로드를 하거나 아래와 같이 npm 을 이용하여 다운로드 받습니다.
$ npm install requirejs
다음 index.html 파일을 아래와 같이 구성합니다.
index.html 파일
위와 같이 RequrieJS 의 명세서를 따라서 data-main 속성을 설정해 주어 require.js 가 로드된 후 바로 로드(호출)될 스크립트 파일을 지정해 주는 방식입니다.
위의 코드에서는 requrie.js 파일이 로드된 후에 바로 main.js 파일을 호출해서 실행하게 됩니다.
data-main 의 값은 ".js" 가 생략 가능하며, data-main 의 main 은 require 형식의 문법(약속·규약)입니다.
그리고 main.js 파일은 아래와 같이 작성할 수 있습니다.( main.js 는 custom)
main.js 파일
main.js 에서 require.config 를 통해 requireJS 의 환경 설정을 셋팅할 수 있습니다.
위와 같은 설정 이 외에도 다양한 옵션들이 존재하는데, 아래의 requireJS 사이트를 참고하면 해당 옵션들에 대한 자세한 내용을 살펴볼 수 있습니다.
http://requirejs.org/docs/api.html
모듈 호출방법에 대해서 다음 포스팅에서 좀 더 살펴보도록 하겠습니다.