2016-08-17 6 views
1

RequireJS를 사용하여 JS를 몇 개의 큰 JS 파일로 모듈화하여 필요할 때마다 의존성을로드 할 수 있지만 페이지를로드 할 때 큰 단일 JS 다운로드가 필요하지 않습니다. JS로 파일이 일례로서 다중 모듈에 대한 JS 최적화

:

  • 는 JS/
  • JS /보기/카테고리 1/js1.js
  • JS /보기/카테고리 1/js2.js
  • 을 main.js
  • JS /보기/카테고리 2/js1.js
  • JS /보기/카테고리 2/js2.js

애플리케이션의 일부 (예 : category1의 모든 항목은 특정 유형의 사용자에 의해서만 사용되며 category2와 유사하게 모든 사용자에 대해 모든 항목을로드하는 것은 의미가 없습니다.

각각 js1.js 및 js2.js 파일의 모든 코드가 들어있는 두 개의 동적로드 모듈 (category1.js & category2.js)을 작성하기 위해 r.js의 빌드 구성을 시도하고 있습니다. 컴파일 된 출력을로드 할 때

({ 
appDir: './', 
baseUrl: './js', 
dir: './dist', 
modules: [ 
    { 
     name: 'main', 
     exclude: [ 
      "category1", 
      "category2" 
     ] 
    }, 
    { 
     name: "category1", 
     include: [ 
      "views/category1/js1", 
      "views/category1/js2" 
     ], 
     create: true 
    }, 
    { 
     name: "category2", 
     include: [ 
      "views/category2/js1", 
      "views/category2/js2" 
     ], 
     create: true 
    } 
], 
fileExclusionRegExp: /^(r|build)\.js$/, 
writeBuildTxt: false, 
optimizeCss: 'standard', 
removeCombined: true, 
paths: { 
    jquery: 'lib/jquery', 
    underscore: 'lib/underscore', 
    backbone: 'lib/backbone/backbone' 
}, 
shim: { 
    underscore: { 
     exports: '_' 
    }, 
    backbone: { 
     deps: [ 
      'underscore', 
      'jquery' 
     ], 
     exports: 'Backbone' 
    } 
} 
}) 

그러나, 브라우저는 등보기/카테고리 1/JS1,보기/카테고리 1/JS2 및 찾을 수 없다는 불평.

RequireJS의 여러 개의 작은 JS 파일에서 몇 개의 고급 모듈을 만들 수 있는지 확신하지 못합니다. 이 경험이있는 사람이 있습니까?

편집

main.js :

require.config({ 
    shim: { 
     underscore: { 
      exports: '_' 
     }, 
     backbone: { 
      deps: [ 
       'underscore', 
       'jquery' 
      ], 
      exports: 'Backbone' 
     } 
    }, 
    paths: { 
     jquery: 'lib/jquery', 
     underscore: 'lib/underscore', 
     backbone: 'lib/backbone/backbone' 
    } 
}); 

require([ 
    'views/app', 
    'router' 
], function(AppView, Router) { 
    new Router(); 
    Backbone.history.start(); 
}); 

index.html을 :

<!doctype html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 
    <script data-main="js/main" src="js/lib/require/require.js"></script> 
</head> 
<body></body> 
</html> 

JS1, JS2 등이 파일은 router.js에서 참조되고있다. 당신이 require(['A'], ...)을하거나 당신이 define(['A'], ...이있을 때

답변

2

은 RequireJS 이름 A를 해결하기 위해 구성을 검사하고, 모듈 A을로드하는 데 사용하는 URL을 구축합니다. 이 같은로드 할 수 있습니다

  1. 번들 : AB, Ccategory1라는 이름의 번들에 포함되도록 당신이 당신의 모듈을 최적화하는 경우

    http://localhost/js/A.js 
    

    을 다음과 같은 가능성을 가지고 category1이로드 된 다음 A에 대한 요청이 이루어집니다. category1이로드되었을 때 A이 발견 되었기 때문에 괜찮습니다.

  2. 번들이 아직로드되지 않았지만 A에 대한 요청이 이루어졌습니다. 이는 최적화없이 동일한 방법으로 A을 해결할 것이므로 문제입니다.하지만 모듈을 최적화 한 경우 Acategory1 외부에서 더 이상 사용할 수 없기 때문에 (removeCombinedtrue이므로) 여기에서 문제가 발생했습니다.

해결책은 런타임시 구성에서로드하려는 모듈이 포함되어 있음을 런타임에 요구하는 것입니다. 이 경우 bundles 옵션을 사용합니다. 예를 들어 "당신이 모듈 A, 부하 category1을로드 할 당신이 그것을 찾을 때"

bundles: { 
    category1: ['A', 'B', 'C'] 
} 

이것은 RequireJS를 알려줍니다.

번들에있는 모든 단일 모듈을 나열 할 필요는 없습니다. 예를 들어 X 모듈이 있고 모듈을로드하려는 유일한 모듈이 동일한 번들의 일부인 경우, 모듈로 나열 할 필요가 없습니다 (bundles).