2012-07-13 41 views
5

He estado trabajando con Require.JS y SignalR en los últimos días y he notado que cuando cargo mi sitio, a veces parece que SignalR/Hubs se carga antes de jquery a pesar de que aparece mi configuración require.js ser correcto.Require.js + SignalR

Aquí es mi config:

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();   
    }); 

Cuando esto no me da un error en la línea 16 del archivo de concentradores. Dice uncaught TypeError: Cannot read property 'signalR' of undefined.

Actualizado a V2 y modificado mi configuración.

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(); 
}); 

requieren ahora está buscando en los lugares equivocados para jQuery, subrayado, etc ... a pesar de mi diciendo que específicamente dónde buscar. Quizás esto tiene algo que ver conmigo después de un viejo tutorial cuando configuré requiere usar v1.

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

INFORME FINAL DE ACTUALIZACIÓN:

Aquí está mi configuración de trabajo. Espero que ayude a los novatos como yo a superar este problema.

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(); 
    }); 
}); 

Era obligatorio que cargue jquery en la función (domready, app, $). De lo contrario, el señalizador informará que no se puede encontrar.

Respuesta

4

Si está utilizando requirejs 2.x puede usar el atributo de configuración "shims". No puede especificar las dependencias entre los archivos que no son compatibles con AMD, como jQuery, jqueryui, etc ..

Usando la configuración como ejemplo:

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"] 
     } 
    } 
}); 

Además, configure las dependencias de "cuñas" elimina la uso del "orden" enchufar.

Consejo: Utilice "rutas" para establecer un nombre descriptivo para apis que usa su sistema, de modo que cuando se lanza una nueva versión de esa aplicación, simplemente puede cambiar en "rutas" y listo.

+0

Eso debería decir "cuña" en lugar de "calzas". – Sean

1

Solo para dar seguimiento a la respuesta proporcionada y por qué todavía tiene que incluir previamente jQuery ... la configuración para requerir es "shim", no "shims". Require no reconocerá ni precargará las dependencias especificadas sin la ortografía correcta de la configuración. Me he golpeado por esto recientemente y publicado al respecto: http://mikeycooper.blogspot.com/2013/01/requirejs-20-dependencies-seemingly.html

+0

Esta fue una pieza clave de información. Yo también fui mordido al usar "calzas" y no "calzas". ¡Gracias por llamar la atención sobre esto! –