2012-11-19 3 views
13

RequireJS와 Modernizr에 문제가 있습니다.RequireJS에 Modernizr을 포함하고 Modernizr을 헤드 태그에 넣습니다.

Modernizr 리소스를 머리에 쓰고 싶습니다. 그리고 시체의 다른 모든 것들. 그 이유는 Modernizr이 DOMContentLoad보다 먼저 할 일이 필요하기 때문입니다. RequireJS를 사용하여 Modernizr 모듈을 다른 모듈에로드 할 수 있기를 원합니다. 어떻게 dev 및 프로덕션 환경에서이를 수행 할 수 있습니까? requirejs를 사용하여 모든 종속성을 가져오고 모든 리소스를 축소합니다. 그리고 yeoman 빌드는 <script data-main="scripts/main" src="scripts/vendor/require.js"></script>을 축소 버전으로 바꿉니다. body 태그에서

:

<!-- build:js ikl.app.js --> 
<script data-main="scripts/main" src="scripts/vendor/require.js"></script> 
    <!-- endbuild --> 
    <script> 
    requirejs.config({ 

     paths: { 

      'jquery'  : 'vendor/jquery', 
      'handlebars' : 'vendor/handlebars', 
      'ember'   : 'vendor/ember', 
      'ember-data' : 'vendor/ember-data', 
      'modernizr'  : 'vendor/modernizr' // This should be removed 


     }, 

     baseUrl: 'scripts', 


     shim: { 


      'jquery' : { 

       exports : 'jQuery' 

      }, 

      'ember': { 

       deps: ['jquery', 'handlebars'], 
       exports: 'Ember' 

      }, 

      'ember-data': { 

       deps: ['ember'], 
       exports: 'DS' 

      }, 

      'handlebars': { 

       exports: 'Handlebars' 

      }, 

      'modernizr': { 
       exports: 'Modernizr' 
      } 

     } 

    }); 

    require([ 

     'modules/system/controllers/system.controller', 
     'jquery', 
     'ember', 
     'ember-data', 
     'handlebars', 
     'modernizr' 

    ], 
     function(systemController) { 
      systemController.renderView(); 
     } 

    ); 

    </script> 
+4

가 왜 그냥 머리에 스크립트 요소에 동 기적으로 모더 나이저를로드 모더 나이저 모듈 정의? 모든 CSS 클래스 등이 존재하도록 Modernizr이 실행되기를 기다리는 페이지를 원할 것입니다. 그리고 다양한 CSS 클래스가 갑자기 시작될 때보기 흉한 '스타일 점프'를 얻지 마십시오. –

+0

성능 향상이 있습니다. 본문 태그. HTML을 빠르게 렌더링하고 JS 로직을 적용합니다. 나는 가능한 한 적은 JS 로직을 머리에 쓰고 있지 않다. – einstein

+9

flash-of-unstyled-content는 Modernizr 자체가로드되기 전에 HTML을 렌더링하지 않는 convicing 인수이다. 다시 생각 해봐. –

답변

34

당신은 모두를 얻을 수 있어야합니다.

  • 첫째, 모더 나이저에 관한 당신의 경로 구성을 제거, 당신은 머리에
  • 다음로드 모더 나이저이 필요하지 않습니다 -이 window.Modernizr 변수를 생성합니다. 당신의 부트 스트랩이 필요하기 전에
  • 마지막으로,

    define('modernizr', [], Modernizr); 
    require(['foo', 'bar', 'modernizr'], function(foo, bar, modernizr) { 
        //..profit 
    } 
    
+0

스크립트를 최적화하는 경우 최적화 된 번들에 패키징 할 필요가 없으므로 'modernizr'을 제외해야합니다. –

+0

자세히 설명해 주시겠습니까? – pilau

+6

필수 최적화 프로그램은 파일에서 시작하여 모든 것을 하나의 최적화 된 (그리고 선택적으로 축소 된) 파일로 묶는 종속성 트리를 안내합니다. 이는 요청량과 크기를 최소화하기 위해 배포를하기 전에 권장되는 빌드 단계입니다. 최적화 프로그램이''modernizr ''을 볼 때 이것이 외부 적으로 페이지에서 제공된다는 것을 알 수있는 방법이 없다면, 다른 모든 파일과 파일에서이 파일을 찾을 수 없을 때 오류라고 가정합니다 (이것이 정확하고 원하는 것입니다) . 해결책은''modernizr''에 대해 걱정하지 말 것을 당신의 최적화 프로그램 설정에서''exclude '' 속성을 사용하는 것입니다. –