프런트엔드 최적화: RequireJS Optimizer 사용 및 구성 방법

RequireJS Optimizer는 RequireJS가 자체로 가지고 있는 전단 최적화 도구로 RequireJS 프로젝트의 자바스크립트와 CSS 코드를 UglifyJS나 Closure Compiler로 압축 통합할 수 있다.이 글은 RequireJS Optimizer의 사용과 설정 방법을 소개하여 사용 과정에서 겪는 문제를 해결하는 데 도움을 준다.
RequireJS Optimizer의 스크립트 최적화는 현재 유행하는 UglifyJS와 Closure Compiler 두 가지 압축 방식을 지원하는데 UglifyJS는 NodeJS 환경 지원이 필요하고 Closure Compiler는 자바 환경이 필요하다.이 글은 NodeJS에서 실행되는 UglifyJS로 최적화되었습니다. 이것은 RequireJS Optimizer의 기본적인 압축 방법입니다.
먼저 Node 0.4.0을 설치한 다음에 r.js를 다운로드해야 합니다. 다운로드를 한 후에 명령줄에서 전단 코드를 최적화할 수 있습니다.r.js의 매개 변수 전달 사용 방법
node r.js -o baseUrl=. paths.jquery=some/other/jquery name=main out=main-built.js

둘째는 새로운build입니다.js(이런 방식을 추천합니다) 이렇게 설정하면 다음과 같이 더욱 편리합니다.
node r.js -o build.js

build.js의 구성 코드는 다음과 같습니다.
{
    baseUrl: "../js",
    dir: "../dist",
    optimize: "uglify",
    optimizeCss: "standard.keepLines",
    mainConfigFile: "../js/main.js",
    removeCombined: true,
    fileExclusionRegExp: /^\./,
    modules: [
        {
            name: "app/dispatcher",
        },
        {
            name: "app/in-storage",
            exclude: [
                "jquery",
                "app/common",
                "pkg/DatePicker/app"
            ]
        }
    ]
}

기본 매개 변수 소개
  • appDir 어플리케이션의 최상위 디렉토리입니다.선택할 수 있습니다. 설정하면 r.js는 스크립트가 이 경로의 하위 디렉터리에 있고 프로그램의 파일이 출력 디렉터리로 복사된다고 생각할 것입니다. (dir가 정의한 경로)설정하지 않으면 아래의 baseUrl 경로를 사용합니다.
  • baseUrl

  • 기본적으로 모든 모듈은 이 경로에 상대적입니다.설정이 없으면, 모듈의 불러오는 것은build 파일이 있는 디렉터리와 같습니다.또한 appDir를 설정하면 베이스Url은 appDir에 대한 경로로 정의해야 한다.
  • dir 출력 디렉터리의 경로입니다.설정하지 않으면, 기본값은build 파일과 같은 등급의build 디렉터리입니다.
  • optimize JavaScript 코드 최적화 방법.설정 가능한 값:
    -   "uglify:   UglifyJS     ,   ;
    -   "uglify2":   2.1.2+       ;
    -   "closure":    Google's Closure Compiler       ,   Java   ;
    -   "closure.keepLines":   Closure Compiler            ;
    -   "none":      ;
    
  • optimizeCss CSS 코드 최적화 방식, 선택할 수 있는 값은
    -   "standard":       ;
    -   "standard.keepLines":    ;
    -   "standard.keepComments":    ;
    -   "standard.keepComments.keepLines":    ;
    -   "none":   ;
    
  • mainConfigFile 중복 정의를 원하지 않으면 이 파라미터를 사용하여 RequireJS의 프로필 경로를 설정할 수 있습니다.
  • removeCombined는 이전에 압축하여 합친 파일을 삭제합니다. 기본값false입니다.
  • fileExclusionRegExp에서 제외할 파일의 정규 일치 표현식입니다.
  • modules는 최적화될 모듈 그룹을 정의합니다.각 항목은 모듈 최적화 설정으로 자주 사용하는 몇 가지 파라미터는 다음과 같다:
    - `name:`   ;
    
    - `include:`       ,`create:`     ,    。  `false`;
    
    - `exclude:`      。            ,              ,       。   exclude                         ,          。
    
  • 기타 사항
    RequireJS 구성은 다음과 같은 RequireJS Optimizer 구성 파일에 배치될 수도 있습니다.
    {
        baseUrl: "../js",
        dir: "../dist",
        optimize: "uglify",
        optimizeCss: "standard.keepLines",
        removeCombined: true,
        fileExclusionRegExp: /^\./,
        modules: [
            {
                name: "app/dispatcher",
            },
            {
                name: "app/in-storage",
                exclude: [
                    "jquery",
                    "app/common",
                    "pkg/DatePicker/app"
                ]
            }
        ],
        paths: {
            jquery: 'lib/jquery',
            underscore: 'lib/underscore',
            backbone: 'lib/backbone/backbone',
            backboneLocalstorage: 'lib/backbone/backbone.localStorage',
            text: 'lib/require/text'
        },
        shim: {
            underscore: {
                exports: '_'
            },
            backbone: {
                deps: [
                    'underscore',
                    'jquery'
                ],
                exports: 'Backbone'
            },
            backboneLocalstorage: {
                deps: ['backbone'],
                exports: 'Store'
            }
        }
    }
    

    RequireJS Optimizer의 구성 매개변수는 아직 많이 있습니다. 전체 매개변수 설명은 다음과 같습니다.
    example.build.js
    간편하게 실행할 수 있도록 배치 파일을 새로 만들 수 있습니다.
    @echo off 
    
    echo build...
    e:
    cd E:\SCM\SRC\scm-html
    ew-scm-html\tools node r.js -o build.js echo Press any key to exit! echo. & pause

    참고: RequireJS Optimizer는 Require와 define 구문으로 정의된 모듈만 지원하므로 다음과 같은 변수 정의 방식은 지원되지 않습니다.
    var mods = someCondition ? ['a', 'b'] : ['c', 'd'];
    require(mods);
    

    이렇게 정의한 경우 다음을 수행할 수 있습니다.
    require(['a', 'b']);
    

    또는
    define(['a', 'b'], function (a, b) {});
    

    한층 더 최적화하다
    r.js 최적화된 코드를 사용하면almond를 사용하여 불러올 수 있습니다.almond는 가벼운 AMD 캐리어로 가장 기초적인 AMD API 구현과 모듈 탑재 기능을 제공합니다.almond는 400줄 미만의 코드만 있고 RequireJS보다 훨씬 작다.r.js를 사용하여 almond를 다음과 같이 업무 코드 앞에 통합할 수 있습니다.
    (function () {
        //almond will be here
        //main and its nested dependencies will be here
    }());
    

    almond는 AMD 웹 사이트나 애플리케이션에 특히 적합하지만 몇 가지 제한이 있습니다.
  • 모든 모듈은 하나의 파일로 컴파일되어 동적 불러오지 않습니다.
  • 모든 모듈은 define()에서 ID와 의존을 정의해야 하며 이 RequireJSOptimizer가 처리할 것입니다.
  • requirejs가 하나만 있을 수 있습니다.config () 또는 Require.config () 호출;
  • Require JS 멀티 버전 기능을 사용할 수 없습니다.
  • require를 사용할 수 없습니다.toUrl () 또는 Require.nameToUrl();
  • packages/packagePaths 구성은 사용할 수 없습니다.

  • 만약 프로젝트에 이런 문제가 없다면, 알몬드를 사용해서 불러올 수 있습니다.
     
    꿈꾸다

    좋은 웹페이지 즐겨찾기