2013-05-29 21 views
5

Mój config rozwoju (w "index.html" pliku) dla RequireJS jest:RequireJS ścieżki config

<script src="require-2.1.5.min.js"></script> 
<script> 
    require.config({ 
     baseUrl: 'js', 
     paths: { 
      angular: 'libraries/angular-1.1.5.min', 
      jquery: 'libraries/jquery-2.0.0.min', 
      underscore: 'libraries/underscore-1.4.4.min', 
      ... 
      zeroclipboard: 'plugins/zeroclipboard-1.0.7.min', 
      tablesorter: 'plugins/jquery.tablesorter-2.9.1.min', 
      ... 
     }, 
     shim: { 
      'angular': { 
       exports: 'angular' 
      }, 
      'underscore': { 
       exports: '_' 
      } 
     }, 
     packages: [ 
      { 
       name: 'index', 
       location: 'app/index', 
       main: 'main' 
      } 
     ] 
    }); 

    require(['index']); 
</script> 

Ale na produkcji mam tylko 2 pliki konkatenowanych dla bibliotek i wtyczek:

js/libraries.js // all jQuery, AngularJS, RequireJS, Underscore and other libraries concatenated 
js/plugins.js // all plugins (already an AMD modules, no need for "shim" config) concatenated 

Jak więc teraz napisać moje "ścieżki" konfiguracji? Nie mam żadnych 'bibliotek/kątowych-1.1.5.min.js' i innych ścieżek.

Moje rozwiązanie jest napisać:

paths: { 
     angular: 'libraries', 
     underscore: 'libraries' 
    } 

kojarzy mi angularjs i podkreślnik do pliku 'libraries.js' i wszystko działa idealnie. (Nie ma potrzeby stosowania jQuery i wszystkich wtyczek - są to już moduły AMD).

Ale czy jest to właściwy sposób pisania ścieżek? Moje rozwiązanie wydaje mi się trochę brudnym rozwiązaniem, a nie najlepszym rozwiązaniem.

Moi r.js budować proces:

({ 
baseUrl: 'scripts', 
paths: { 
    jquery: 'jquery-2.0.0.min', 
    ... 
    tablesorter: 'jquery.tablesorter-2.0.5.min', 
    zeroclipboard: 'zeroclipboard-1.0.7.min' 
}, 
name: 'foo/main', 
exclude: [ 
    'angular', 
    'jquery', 
    ... 
    'tablesorter', 
    'zeroclipboard' 
], 
optimize: 'uglify', 
out: 'production/js/foo.js' 
}) 

UPD 1:

Czego chcę:

www.mysite.com/about.html: 

<script src="js/libraries.js"></script><-- jQuery (already AMD), AngularJS (not AMD), RequireJS, Underscore (not AMD) and other libraries already here, only 1 http request needed //--> 
<script src="js/plugins.js"></script><-- all AMD //--> 
<script> 
    require.config({ 
     baseUrl: 'js', 
     paths: { 
      angular: WHAT I NEED TO WRITE HERE?, 
      underscore: WHAT I NEED TO WRITE HERE? 
     }, 
     shim: { 
      'angular': { 
       exports: 'angular' 
      }, 
      'underscore': { 
       exports: '_' 
      } 
     }, 
     packages: [ 
      { 
       name: 'about', 
       location: 'js', 
       main: 'about' 
      } 
     ] 
    }); 

    require(['about']); // will load "js/about.js" 
</script> 

UPD 2:

OK, to jest jasne o "prio rity ", więc nie potrzebuję pierwszych i drugich tagów" script "(ale muszę oddzielić" Require.js "od" libraries.js ") - RequireJS załaduje je automatycznie. Ale co zrobić z bibliotekami innymi niż AMD w pliku "libraries.js"?

AngularJS i UnderscoreJS to moduły inne niż AMD, dlatego muszę używać "shim", prawda? Ale aby wykonać pracę "shim", potrzebuję również użyć "ścieżek", więc "shim" może zlokalizować moduły shimmed, prawda? Ale nadal mam tylko 1 plik - "libraries.js" i nie mogę go zapisać w opcji "ścieżka" ... Naprawdę utknąłem ...

+0

Nie powinieneś dodawać dodatkowych tagów skryptów, require.js, i powinien je załadować.Czy moja odpowiedź poniżej na temat opcji pierwszeństwa jest niejasna? –

+0

To wszystko jest świetne z twoją odpowiedzią, właśnie zrobiłem aktualizację przed przeczytaniem twojej aktualizacji :) – artuska

Odpowiedz

5

Aby mieć wstępnie załadowany wspólny kod biblioteki, należy użyć opcji konfiguracji priorytetu. można umieścić coś takiego w pliku

require.config({ 
    priority: ["libraries", "plugins"] 
}); 

foo/main.js A potem plik build może wyglądać następująco. Plik bibliotek i wtyczek powinien zawierać instrukcję define definiująca wszystkie zależności, które są uważane za ogólne/pobierane jeden raz.

({ 
    baseUrl: 'scripts', 
    paths: { 
     jquery: 'jquery-2.0.0.min', 
     ... 
     tablesorter: 'jquery.tablesorter-2.0.5.min', 
     zeroclipboard: 'zeroclipboard-1.0.7.min' 
    }, 
    modules: [ 
     { 
      name: 'foo/main' 
      excludes: ... 
     }, 
     { 
      name: 'libraries' 
     }, 
     { 
      name: 'plugins' 
     } 
    ], 
    optimize: 'uglify', 
    out: 'production/js/foo.js' 
}) 
+0

"chodzi o to, że cały wymagany kod bootstrap jest ładowany przez 1 plik». Na przykład mam 3 strony na mojej stronie: o, portfolio, kontakty. Tworzę 3 różne pliki z moimi modułami (dużo "zdefiniuj" moduły połączone w jeden plik): "about.js", "portfolio.js", "contacts.js". A czwarty plik to "libraries + plugins.js" - ponieważ chcę, aby przeglądarka buforowała ten plik i nigdy go nie pobierze ponownie. Nie mogę sobie pozwolić na umieszczanie kodu "libraries + plugins.js" w każdym z plików "about.js", "portfolio.js", "contacts.js". – artuska

+0

Ach tak, to ma wiele sensu. Myślę, że powinieneś rzucić okiem na opcje konfiguracyjne 'priority', aby umożliwić wielowarstwowe wyjście. Http://requirejs.org/docs/1.0/docs/faq-optimization.html#priority –

+0

@artuska Edytowałem moje pytanie w aby lepiej odzwierciedlić opcję priorytetową w js –

2

Powinieneś użyć tej samej konfiguracji dla obu środowisk. Ta konfiguracja powinna znajdować się w pliku zewnętrznym. Po zoptymalizowaniu go za pomocą r.j, wszystkie moduły już w tym pojedynczym pliku, więc RequireJS po prostu użyje ich bez ładowania. Wygląda na to, że potrzebujesz dostroić proces budowania.

Zamówienie na mój najnowszy numer blog post.

+0

Dodano mój skrypt kompilacji r.js. Nawet po twoim blogu nie rozumiem, jak można zachować moją konfigurację tak samo dla rozwoju i produkcji (w pliku "index.html"). Jak widzisz, wykluczam niektóre pliki z ostatecznej wersji, aby umieścić je w osobnym pliku (libraries.js), aby pamięć podręczna przeglądarki była przechowywana w pamięci podręcznej i nie pobieraj go ponownie na inne strony w mojej witrynie. "libraries.js" zawiera obie biblioteki modułów AMD (takie jak jQuery, jest to już moduł AMD w swoim rdzeniu) i biblioteki inne niż AMD (jak AngularJS). Tak więc nie ma "zdefiniować" dla AngularJS w pliku "libraries.js". – artuska

+0

Może powinienem ręcznie uczynić wszystkie biblioteki modułami AMD? Mam na myśli, po prostu edytować plik Angular.js i zawinąć jego kod w "define ('angle', [], function() {...})" function? – artuska

+0

Sądzę, że sensowne byłyby te duże moduły wykluczające z kompilacji. Możesz sprawdzić https://github.com/tnajdek/angular-requirejs- projekt, w którym AngularJS jest używany razem z RequireJS. –