#javascript #jquery #backbone.js #requirejs #underscore.js
#javascript #jquery #backbone.js #requirejs #underscore.js
Вопрос:
Я видел много вопросов, касающихся использования RequireJS с Backbone, подчеркиванием и jQuery. Мой вопрос немного отличается; мое приложение работает, но я не знаю почему.
В настоящее время Underscore, jQuery и Backbone экспортируют все модули AMD, поэтому мне больше не нужно их подгонять и экспортировать их переменные. Поэтому мой main.js
выглядит следующим фрагментом кода.
main.js
require.config({
paths: {
jquery: 'lib/jquery/jquery-1.10.2',
'jquery-ui': 'lib/jquery/jquery-ui-1.10.4.min',
underscore: 'lib/underscore/underscore.min',
backbone: 'lib/backbone/backbone.min',
'backbone.localStorage': 'lib/backbone/backbone.localStorage'
}
});
require(['jquery', 'jquery-ui', 'underscore', 'backbone', 'backbone.localStorage'], function() {
});
require.html
<!DOCTYPE html>
<html>
<head>
<title>My Sample Project</title>
<!-- data-main attribute tells require.js to load
scripts/main.js after require.js loads. -->
</head>
<body>
<h1>My Sample Project</h1>
<div id="test"> </div>
<script type="text/javascript" data-main="js/main" src="js/lib/require/require.js"></script>
<script type="text/javascript">
</script>
</body>
</html>
Когда я захожу require.html
, я могу перейти в консоль, и все мои переменные там правильно загружены. Например, var x = Backbone.Model.extend({}); var y = new x;
работает просто отлично. Однако Backbone зависит как от подчеркивания, так и от jQuery. Разрешает ли RequireJS автоматически эти зависимости, используя модули, поставляемые этими библиотеками, или это работает только по счастливой случайности?
Комментарии:
1. Библиотеки
define
сами определяют свои зависимости. Взгляните на (несжатый) код Backbone или jQuery и найдитеdefine(
, это должно привести вас к нужной строке.
Ответ №1:
У вас есть require
сразу после настройки конфигурации requirejs
require(['jquery', 'jquery-ui', 'underscore', 'backbone', 'backbone.localStorage'], function() {
});
Они случайно загружаются в правильном порядке, чтобы управлять этой последовательностью, вам нужно определить зависимости каждого модуля в прокладке
Комментарии:
1. Я знаю, что они требуются моему модулю; Я спрашиваю, случайно ли они загружены в правильном порядке или RequireJS правильно их организовал.
2. Неправильно. Фабричный метод каждого модуля (библиотеки) установит соответствующий глобальный параметр перед выполнением обратного вызова. Лучше использовать возвращаемое значение каждой библиотеки, совместимой с AMD, в вашем обратном вызове (или фабричном методе в случае вашего собственного модуля) на случай, если глобальное значение изменится или исчезнет. Каждый из них не будет удовлетворен, пока не будут удовлетворены его зависимости.
3. Что не так? Вопрос заключается в порядке загрузки, если нет прокладки, управляющей зависимостями, все это происходит до того, как вызывается фактический обратный вызов модуля.
Ответ №2:
Require очень помогает в такого рода работе.
Вы можете указать зависимости простым и правильным способом, используя команду ‘shim’, например, так.
//Coffeescript example
paths:
backbone : 'path/backbone'
underscore : 'path/underscore'
jquery: 'path/jquery'
shim:
backbone:
deps:['underscore','jquery']
exports: 'Backbone'
Таким образом, вы определяете, что при вызове модуля с именем ‘Backbone’ require загрузит все зависимости, записанные внутри deps:[] .
Теперь он никогда не будет загружать backbone до подчеркивания.
У меня есть блог и сообщение об этом, к сожалению, это только на португальском, но, возможно, поможет.
http://www.rcarvalhojs.com/backbone/2014/06/03/comecando-require-backbone.html
Комментарии:
1. Chrome перевел это для меня, и это немного помогло. Я понимаю, что мы можем указывать зависимости, но я спрашиваю о том, что я не указывал свои зависимости, и мое приложение все еще работало, поэтому я спрашиваю, было ли это волшебством, что все они загружались в правильном порядке или, поскольку они являются AMD, RequireJS позаботился о порядке загрузки?