Estoy tratando de cargar Backbone y Underscore (así como jQuery) con RequireJS. Con las últimas versiones de Backbone y Underscore, parece un poco complicado. Por un lado, Underscore se registra automáticamente como un módulo, pero Backbone supone que Underscore está disponible a nivel mundial. También debo señalar que Backbone no parece registrarse como un módulo, lo que lo hace un poco inconsistente con las otras bibliotecas. Este es el mejor main.js que se me ocurrió que funciona:
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();
})
});
Debo mencionar que, mientras funciona, el optimizador se ahoga. Recibo lo siguiente:
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
¿Hay una mejor manera de manejar esto? ¡Gracias!
javascript
backbone.js
underscore.js
requirejs
Aaronius
fuente
fuente
Respuestas:
RequireJS 2.X ahora aborda orgánicamente los módulos que no son AMD, como Backbone y Underscore, mucho mejor, utilizando la nueva
shim
configuración.La
shim
configuración es simple de usar: (1) uno establece las dependencias (deps
), si las hay, (que pueden ser de lapaths
configuración o pueden ser rutas válidas). (2) (opcionalmente) especifique el nombre de la variable global del archivo que está cambiando, que debe exportarse a las funciones de su módulo que lo requieran. (Si no especifica las exportaciones, necesitará simplemente usar el global, ya que nada pasará a sus funciones require / define).Aquí hay un ejemplo de uso simple
shim
para cargar Backbone. También agrega una exportación para subrayar, aunque no tiene ninguna dependencia.Nota: este código simplificado supone que jquery, backbone y subrayado están en archivos llamados "jquery.js", "backbone.js" y "underscore.js" en el mismo directorio que este código "principal" (que se convierte en baseURL para requerir ) Si este no es el caso, deberá utilizar una configuración de rutas .
Personalmente, creo que con la
shim
funcionalidad incorporada, las ventajas de no usar una versión bifurcada de Backbone & Underscore superan los beneficios de usar la bifurcación AMD recomendada en la otra respuesta popular, pero de cualquier manera funciona.fuente
Sample RequireJS 2.0.1 + jQuery 1.7.2 project
requirejs.org/docs/download.html#samplejquery ?Actualización : A partir de la versión 1.3.0, subrayado eliminó la compatibilidad con AMD (RequireJS) .
Puede usar amdjs / Backbone 0.9.1 y amdjs / Underscore 1.3.1 fork con soporte AMD de James Burke (el responsable de RequireJS).
Más información sobre el soporte de AMD para Underscore y Backbone .
Los módulos están debidamente registrados y no es necesario el complemento de pedido:
El subrayado es realmente opcional, porque Backbone ahora obtiene sus dependencias por sí solo:
Con un poco de azúcar AMD también podrías escribirlo así:
Con respecto al error del optimizador: verifique dos veces su configuración de compilación. Supongo que su configuración de ruta está desactivada. Si tiene una configuración de directorio similar a la de RequireJS Docs , puede usar:
fuente
Como referencia, a partir de la versión 1.1.1 (~ Feb '13), Backbone también registra como un módulo AMD . Funcionará con requirejs sin la necesidad de usar su configuración shim. ( La bifurcación amdjs de James Burke tampoco se ha actualizado desde 1.1.0)
fuente
Buenas noticias, Underscore 1.6.0 ahora soporta requirejs define !!!
las versiones a continuación requieren cuñas, o requieren subrayar.js y luego esperar ciegamente que la variable global "_" no se haya roto (lo que para ser justos es una apuesta justa)
simplemente cárguelo en
fuente
Escribiré directamente, puede leer la explicación en requirejs.org, puede usar el código a continuación como un fragmento para su uso diario; (ps, uso yeoman) (ya que muchas cosas se actualizaron, estoy publicando esto a partir de febrero de 2014).
Asegúrese de incluir el script en su index.html
Luego, en main.js
app.js
Espero haber sido útil.
fuente
fuente