Я пытаюсь загрузить Backbone и Underscore (а также jQuery) с RequireJS. С последними версиями Backbone и Underscore это выглядит довольно сложно. Например, Underscore автоматически регистрируется как модуль, но Backbone предполагает, что Underscore доступен во всем мире. Я также должен отметить, что Backbone, похоже, не регистрирует себя как модуль, что делает его несовместимым с другими библиотеками. Это лучший файл main.js, который я смог придумать:
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();
})
});
Я должен отметить, что, пока он работает, оптимизатор подавляется им. Я получаю следующее:
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
Есть ли лучший способ справиться с этим? Спасибо!
javascript
backbone.js
underscore.js
requirejs
Aaronius
источник
источник
Ответы:
RequireJS 2.X теперь органически обращается к модулям не-AMD, таким как Backbone & Underscore, намного лучше, используя новую
shim
конфигурацию.shim
Конфигурация проста в использовании: (1) один утверждает зависимости (deps
), если таковые имеются, (которые могут быть отpaths
конфигурации, или могут быть действительными тракты сами). (2) (опционально) укажите имя глобальной переменной из файла, который вы используете, которое должно быть экспортировано в функции вашего модуля, которым это требуется. (Если вы не укажете экспорт, вам нужно будет просто использовать глобальный, так как ничто не будет передано в ваши функции require / define.)Вот простой пример использования
shim
для загрузки Backbone. Он также добавляет экспорт для подчеркивания, даже если у него нет никаких зависимостей.Примечание: этот упрощенный код предполагает, что jquery, backbone и underscore находятся в файлах с именами "jquery.js", "backbone.js" и "underscore.js" в том же каталоге, что и этот "основной" код (который становится baseURL для require ). Если это не так, вам нужно использовать конфигурацию путей .
Лично я считаю, что благодаря встроенной
shim
функциональности преимущества отсутствия разветвленной версии Backbone & Underscore перевешивают преимущества использования AMD-форка, рекомендованного в другом популярном ответе, но в любом случае это работает.источник
Sample RequireJS 2.0.1 + jQuery 1.7.2 project
requirejs.org/docs/download.html#samplejquery ?Обновление : Начиная с версии 1.3.0 Underscore удалена поддержка AMD (RequireJS) .
Вы можете использовать amdjs / Backbone 0.9.1 и вилку amdjs / Underscore 1.3.1 с поддержкой AMD от James Burke (сопровождающего RequireJS).
Больше информации о поддержке AMD для Underscore и Backbone .
Модули правильно зарегистрированы, и плагин заказа не требуется:
Подчеркивание на самом деле необязательно, потому что Backbone теперь получает свои зависимости самостоятельно:
С сахаром AMD вы также можете написать это так:
Что касается ошибки оптимизатора: перепроверьте конфигурацию сборки. Я предполагаю, что ваша конфигурация пути отключена. Если у вас есть каталог, похожий на RequireJS Docs, вы можете использовать:
источник
Для справки, начиная с версии 1.1.1 (~ февраль '13), Backbone также регистрируется как модуль AMD . Он будет работать с requirejs без необходимости использовать его конфигурацию shim. ( Форк amdjs Джеймса Бёрка также не обновлялся с 1.1.0)
источник
Хорошая новость: Underscore 1.6.0 теперь поддерживает requirejs define !!!
версии ниже этого требуют шиммы, или требуют underscore.js, затем вслепую надеясь, что глобальная переменная "_" не была разбита (что справедливо, будет честной ставкой)
просто загрузите его
источник
Я напишу прямо, вы можете прочитать объяснение на requirejs.org, вы можете использовать приведенный ниже код в качестве фрагмента для вашего повседневного использования; (ps я использую yeoman) (так как многие вещи обновлены, я публикую это по состоянию на февраль 2014 года.)
Убедитесь, что вы включили скрипт в ваш index.html
Затем в main.js
app.js
Я надеюсь, что был полезен.!
источник
источник