Зависимости в RequireJS с Backbone, подчеркиванием и jQuery в 2014 году

#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 позаботился о порядке загрузки?