Próbuję załadować Backbone i Underscore (a także jQuery) z RequireJS. W przypadku najnowszych wersji Backbone i Underscore wydaje się to trudne. Po pierwsze, Underscore automatycznie rejestruje się jako moduł, ale Backbone zakłada, że Underscore jest dostępny globalnie. Powinienem również zauważyć, że Backbone nie wydaje się rejestrować siebie jako moduł, co powoduje, że jest niespójny z innymi bibliotekami. To najlepszy plik main.js, jaki mogłem wymyślić, który działa:
require(
{
paths: {
'backbone': 'libs/backbone/backbone-require',
'templates': '../templates'
}
},
[
// jQuery registers itself as a module.
'http://cdnjs.cloudflare.com/ajax/libs/jquery/1.7/jquery.min.js',
// Underscore registers itself as a module.
'http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.2.1/underscore-min.js'
], function() {
// These nested require() calls are just due to how Backbone is built. Underscore basically says if require()
// is available then it will automatically register an "underscore" module, but it won't register underscore
// as a global "_". However, Backbone expects Underscore to be a global variable. To make this work, we require
// the Underscore module after it's been defined from within Underscore and set it as a global variable for
// Backbone's sake. Hopefully Backbone will soon be able to use the Underscore module directly instead of
// assuming it's global.
require(['underscore'], function(_) {
window._ = _;
});
require([
'order!http://cdnjs.cloudflare.com/ajax/libs/backbone.js/0.5.3/backbone-min.js',
'order!app'
], function(a, app) {
app.initialize();
})
});
Powinienem wspomnieć, że gdy działa, optymalizator się dusi. Otrzymuję:
Tracing dependencies for: main
js: "/home/httpd/aahardy/requirejs/r.js", line 7619: exception from uncaught JavaScript throw: Error: Error: Error evaluating module "undefined" at location "/home/httpd/aahardy/phoenix/trunk/ui/js/../../ui-build/js/underscore.js":
JavaException: java.io.FileNotFoundException: /home/httpd/aahardy/phoenix/trunk/ui/js/../../ui-build/js/underscore.js (No such file or directory)
fileName:/home/httpd/aahardy/phoenix/trunk/ui/js/../../ui-build/js/underscore.js
lineNumber: undefined
http://requirejs.org/docs/errors.html#defineerror
In module tree:
main
Czy jest lepszy sposób na rozwiązanie tego problemu? Dzięki!
javascript
backbone.js
underscore.js
requirejs
Aaronius
źródło
źródło
Odpowiedzi:
RequireJS 2.X teraz w sposób organiczny adresuje moduły inne niż AMD, takie jak Backbone i Underscore, znacznie lepiej, korzystając z nowej
shim
konfiguracji.shim
Układ jest prosty w obsłudze: (1) jeden stanowi zależności (deps
), jeśli występuje, (które mogą być odpaths
konfiguracji i może być ważne Ścieżki się). (2) (opcjonalnie) określ nazwę zmiennej globalnej z pliku, który modyfikujesz, która powinna zostać wyeksportowana do funkcji modułu, które tego wymagają. (Jeśli nie określisz eksportu, musisz po prostu użyć globalnego, ponieważ nic nie zostanie przekazane do twoich funkcji require / define.)Oto prosty przykład użycia
shim
do załadowania Backbone. Dodaje również eksport dla podkreślenia, mimo że nie ma żadnych zależności.Uwaga: ten uproszczony kod zakłada, że jquery, backbone i underscore znajdują się w plikach o nazwach „jquery.js”, „backbone.js” i „underscore.js” w tym samym katalogu, co ten „główny” kod (który staje się podstawowym adresem URL dla require ). Jeśli tak nie jest, musisz użyć konfiguracji ścieżek .
Osobiście uważam, że dzięki wbudowanej
shim
funkcjonalności zalety nieużywania rozwidlonej wersji Backbone & Underscore przewyższają korzyści wynikające z używania widelca AMD zalecanego w innej popularnej odpowiedzi, ale tak czy inaczej działa.źródło
Sample RequireJS 2.0.1 + jQuery 1.7.2 project
requirejs.org/docs/download.html#samplejquery ?Aktualizacja : Od wersji 1.3.0 Usunięto podkreślenie Obsługa AMD (RequireJS) .
Możesz użyć amdjs / Backbone 0.9.1 i amdjs / Underscore 1.3.1 z obsługą AMD od Jamesa Burke (opiekuna RequireJS).
Więcej informacji na temat wsparcia AMD dla Underscore i Backbone .
Moduły są poprawnie zarejestrowane i nie ma potrzeby dodawania wtyczki do zamówienia:
Podkreślenie jest w rzeczywistości opcjonalne, ponieważ Backbone ma teraz własne zależności:
Z odrobiną cukru AMD możesz również napisać to w ten sposób:
Odnośnie błędu optymalizatora: dwukrotnie sprawdź konfigurację kompilacji. Zakładam, że twoja konfiguracja ścieżki jest wyłączona. Jeśli masz konfigurację katalogu podobną do RequireJS Docs , możesz użyć:
źródło
Dla porównania, od wersji 1.1.1 (~ luty 2013), Backbone rejestruje się również jako moduł AMD . Będzie działał z requirejs bez potrzeby używania jego konfiguracji shim. ( Widelec amdjs Jamesa Burke'a również nie był aktualizowany od 1.1.0)
źródło
Dobra wiadomość, Underscore 1.6.0 obsługuje teraz definicję requirejs !!!
wersje poniżej tego wymagają podkładek lub podkreślenia.
po prostu załaduj go przez
źródło
Napiszę bezpośrednio, możesz przeczytać wyjaśnienie na requirejs.org, możesz użyć poniższego kodu jako fragmentu kodu do codziennego użytku; (ps używam yeoman) (ponieważ zaktualizowano wiele rzeczy, publikuję to od lutego 2014 r.)
Upewnij się, że umieściłeś skrypt w pliku index.html
Następnie w main.js
app.js
Mam nadzieję, że się przydałem.!
źródło
źródło