2012-11-19 13 views
13

Mam problem z RequireJS i Modernizatorem.Dołącz Modernizator do RequireJS i zmodernizuj go w znacznikach head.

Chcę, aby zasób Modernizatora był na głowie. I wszystko inne w ciele. Powodem jest to, że Modernizr musi zrobić kilka rzeczy przed DOMContentLoad. Chcę móc ładować moduł Modernizr do innych modułów przy użyciu RequireJS. Jak mogę to zrobić zarówno w środowisku programistycznym, jak i produkcyjnym? Używam requirejs, który pobiera wszystkie zależności i minimalizuje wszystkie zasoby. A kompilacja typu "yeoman" zastępuje <script data-main="scripts/main" src="scripts/vendor/require.js"></script> wersją minified.

pod tagiem ciała:

<!-- 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

Dlaczego nie wystarczy załadować modernizr synchronicznie w elemencie skryptu w głowie? Najprawdopodobniej chcesz, aby strona oczekiwała na uruchomienie Modernizr, aby wszystkie klasy CSS itp. Były obecne i nie otrzymasz brzydkich "skoków w stylu", ponieważ nagle niespodziewanie wkradają się różne klasy css. –

+0

Występuje wzrost wydajności posiadania go na znacznik body. Wykazuje HTML szybciej, niż stosuje logikę JS. I tak mało jak to możliwe Logika JS na głowie – einstein

+9

flash-of-unstyled-content to przekonujący argument, aby nie renderować kodu HTML przed załadowaniem samego Modernizr. Pomyśl jeszcze raz. –

Odpowiedz

34

Powinieneś być w stanie dostać zarówno.

  • Po pierwsze, usunąć konfigurację ścieżek, które odnosi się do modernizr, nie będzie to potrzebne
  • Następny Załaduj modernizr w głowie - to stworzy zmienną window.Modernizr.
  • Wreszcie, zanim ładowania wymagają zdefiniowania moduł modernizr

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

Należy również stwierdzić, że jeśli zoptymalizujesz swoje skrypty, upewnij się, że wykluczyłeś "modernizr", ponieważ nie trzeba go pakować w zoptymalizowane pakiety. –

+0

Proszę opracować? – pilau

+6

Wymagany optymalizator rozpoczyna się od pliku i przesuwa drzewo zależności, łącząc wszystko w jeden zoptymalizowany (i opcjonalnie zminimalizowany) plik. Jest to zalecany krok kompilacji przed przejściem do wdrożenia, aby zminimalizować liczbę i rozmiar żądania. Kiedy optymalizator widzi "modernizatora", nie może wiedzieć, że jest on dostarczany zewnętrznie przez stronę, przyjmuje go w pliku jak wszystkie inne i błędy, gdy nie można tego znaleźć (jest to poprawne i to, co chcesz) . Rozwiązaniem jest użycie właściwości ''exclude'' w konfiguracji optymalizatora, aby powiedzieć, żeby nie martwił się' 'modernizr''. –