Require.js + SignalR

Я работал с Require.JS и SignalR в течение последних нескольких дней и заметил, что когда я загружаю свой сайт, иногда кажется, что SignalR/Hubs загружаются раньше, чем jquery, несмотря на то, что моя конфигурация require.js кажется правильной.

Вот моя конфигурация:

require.config({
    paths: {
        jQuery: 'libs/jquery/jquery',
        Underscore: 'libs/underscore/underscore',
        Backbone: 'libs/backbone/backbone',
        Marionette: 'libs/backbone/backbone.marionette'
    }
});

require([
        'app',
        'order!libs/jquery/jquery-min',
        'order!libs/jQueryUI/jquery-ui-1.8.11.min',
        'order!libs/jqGrid/grid.locale-en',
        'order!libs/jqGrid/jquery.jqGrid.min',
        'order!libs/underscore/underscore-min',
        'order!libs/backbone/backbone-min',
        'order!Marionette',
        'order!libs/jquery.signalR-0.5.1',
        'order!noext!signalr/hubs'
    ], function (app) {
        app.initialize();        
    });

Когда это не удается, я получаю сообщение об ошибке в строке 16 файла концентраторов. Там написано uncaught TypeError: Cannot read property 'signalR' of undefined.

Обновлен до V2 и изменил мою конфигурацию.

var fRequire = require.config({
    paths: {
        jQuery: 'libs/jquery/jquery',
        Underscore: 'libs/underscore/underscore',
        Backbone: 'libs/backbone/backbone',
        Marionette: 'libs/backbone/backbone.marionette',
        sigr: 'libs/jquery.signalR-0.5.1'
    },
    shims: {        
        "libs/jquery.signalR-0.5.1": {
            deps: ["jQuery"]
        },
        "libs/jqGrid/jquery.jqGrid.min": {
            deps: ["jQuery"]
        },
        "libs/jquery/jquery-ui-1.8.19.min": {
            deps: ["jQuery"]
        },
        "libs/jqGrid/grid.locale-en": {
            deps: ["jQuery"]
        },
        "noext!signalr/hubs": {
            deps: ["sigr"]
        }
    }
});

fRequire([
    'app'
], function (app) {
    app.initialize();
});

Теперь require ищет jquery, подчеркивание и т. д. в неправильных местах... несмотря на то, что я конкретно указал, где искать. Возможно, это как-то связано со мной, следуя старому руководству, когда я настроил требование с использованием v1.

http://backbonetutorials.com/organizing-backbone-using-modules/

ПОСЛЕДНЕЕ ОБНОВЛЕНИЕ:

Вот мой рабочий конфиг. Надеюсь, это поможет новичкам вроде меня справиться с этой проблемой.

require.config({
    baseUrl: '/js',
    paths: {
        "jquery": 'libs/jquery/jquery-min',
        "underscore": 'libs/underscore/underscore-min',
        "backbone": 'libs/backbone/backbone-min',
        "marionette": 'libs/backbone/backbone.marionette',
        "sigr": 'libs/jquery.signalR-0.5.1'
    },
    shims: {
        "backbone": {
            deps: ["underscore", "jquery"],
            exports: "Backbone"
        },
        "underscore": {
            deps: ["jquery"]
        },
        "marionette": {
            deps: ["backbone", "jquery"]
        },
        "sigr": {
            deps: ["jquery"]
        },
        "libs/jqGrid/jquery.jqGrid.min": {
            deps: ["jquery"]
        },
        "libs/jquery/jquery-ui-1.8.19.min": {
            deps: ["jquery"]
        },
        "libs/jqGrid/grid.locale-en": {
            deps: ["jquery"]
        },
        "noext!signalr/hubs": {
            deps: ["sigr"]
        }
    }
});

// for future ref, I loaded jquery here because app.js references sigr which requires it.
// without enabling it before the module is loaded sigr would complain jquery was not enabled.
require([
    'libs/domReady',
    'app',
    'jquery'
], function (domReady, app, $) {
    domReady(function () {
        app.initialize();
    });
});

Было обязательно, чтобы я загружал jquery в функцию (domready, app, $). В противном случае сигнализатор сообщит, что его невозможно найти.


person coreyperkins    schedule 13.07.2012    source источник


Ответы (2)


Если вы используете requirejs 2.x, вы можете использовать атрибут конфигурации «shims». Там вы можете указать зависимости между файлами, несовместимыми с AMD, такими как jquery, jqueryui и т. д.

Используя вашу конфигурацию в качестве примера:

require.config({ 
   paths: { 
      jQuery: 'libs/jquery/jquery', 
      Underscore: 'libs/underscore/underscore', 
      Backbone: 'libs/backbone/backbone', 
      Marionette: 'libs/backbone/backbone.marionette' 
   },
   // specify depedencies
   shim: {
      "libs/jquery.signalR-0.5.1" : {
           deps: ["jQuery"]
       },
       "libs/jqGrid/jquery.jqGrid.min" : {
           deps: ["jQuery"] 
       }
   }
});

Кроме того, настройка зависимостей в «прокладках» исключает использование «порядка!» плагин.

Совет. Используйте «пути», чтобы установить понятное имя для API, используемого вашей системой, поэтому, когда будет выпущена новая версия этого API, вы можете просто изменить «пути», и все готово.

person Marcelo De Zen    schedule 13.07.2012
comment
Это должно говорить прокладка вместо прокладки. - person Sean; 30.05.2014

Просто чтобы проследить за предоставленным ответом и почему вам все еще нужно предварительно включить jQuery ... настройка конфигурации для требования - это «прокладка», а не «прокладка». Require не будет распознавать и предварительно загружать зависимости, указанные без правильного написания параметра конфигурации. Недавно меня это задело, и я написал об этом: http://mikeycooper.blogspot.com/2013/01/requirejs-20-dependencies-seemingly.html

person Mikey Cooper    schedule 26.01.2013
comment
Это была ключевая информация. Я тоже был укушен использованием прокладок, а не прокладок. Спасибо, что обратили на это внимание! - person Elijah Lofgren; 17.11.2015