Cargando Backbone y Underscore usando RequireJS


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 asume que Underscore está disponible globalmente. También debo señalar que Backbone no parece registrarse como un módulo, lo que lo hace un poco inconsistente con las otras libs. Este es el mejor main.js Yo podría llegar a 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();
    })
});

I debe mencionar que, mientras funciona, el optimizador se atraganta en él. 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!

Author: Aaronius, 2011-11-15

6 answers

RequireJS 2.X ahora se ocupa orgánicamente de los módulos que no son de AMD, como Backbone y Underscore, mucho mejor, shim configuración.

La configuración shim es simple de usar: (1) uno establece las dependencias (deps), si las hay, (que pueden ser de la configuración paths, o pueden ser rutas válidas en sí mismas). (2) (opcionalmente) especifique el nombre de la variable global del archivo que está shimming, que debe exportarse a las funciones del módulo que lo requieran. (Si no especifique las exportaciones, entonces tendrá que usar el global, ya que nada pasará a sus funciones require / define.)

Aquí hay un simple ejemplo de uso de shim para cargar Backbone. También agrega una exportación para subrayado, aunque no tenga ninguna dependencia.

require.config({
  shim: {
    underscore: {
      exports: '_'
    },
    backbone: {
      deps: ["underscore", "jquery"],
      exports: "Backbone"
    }
  }
});

//the "main" function to bootstrap your code
require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone) {   // or, you could use these deps in a separate module using define

});

Nota: este código simplificado asume que jquery, backbone y underscore están en archivos llamados "jquery.js", " backbone.js " y " underscore.js " en el mismo directorio que este código "main" (que se convierte en el baseUrl de require). Si este no es el caso, necesitará usar una configuración de rutas .

Personalmente creo que con la funcionalidad incorporada shim, 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.

 293
Author: Ben Roberts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-31 17:00:40

Actualización : A partir de la versión 1.3.0 Se eliminó el soporte para AMD (RequireJS) .

Puede usar la bifurcación amdjs/Backbone 0.9.1 y la bifurcación amdjs/Underscore 1.3.1 con soporte AMD de James Burke (el mantenedor de RequireJS).

Más información sobre El soporte de AMD para Underscore y Backbone.

// main.js using RequireJS 1.0.7
require.config({
    paths: {
        'jquery': 'libs/jquery/1.7.1/jquery',
        'underscore': 'libs/underscore/1.3.1-amdjs/underscore', // AMD support
        'backbone': 'libs/backbone/0.9.1-amdjs/backbone', // AMD support
        'templates': '../templates'
    }
});

require([
    'domReady', // optional, using RequireJS domReady plugin
    'app'
], function(domReady, app){
    domReady(function () {
        app.initialize();
    });
});

Los módulos están correctamente registrados y no hay necesidad del complemento order:

// app.js
define([
    'jquery', 
    'underscore',
    'backbone'
], function($, _, Backbone){
    return {
        initialize: function(){
            // you can use $, _ or Backbone here
        }
    };
});

El subrayado es en realidad opcional, porque Backbone ahora obtiene sus dependencias por su cuenta:

// app.js
define(['jquery', 'backbone'], function($, Backbone){
    return {
        initialize: function(){
            // you can use $ and Backbone here with
            // dependencies loaded i.e. Underscore
        }
    };
});

Con algunos AMD sugar también podrías escribirlo así:

define(function(require) {
    var Backbone = require('backbone'),
        $ = require('jquery');

    return {
        initialize: function(){
            // you can use $ and Backbone here with
            // dependencies loaded i.e. Underscore
        }
    };
});

Con respecto al error del optimizador: doble comprobación de la configuración de compilación. Asumo que su configuración de ruta está desactivada. Si tiene una configuración de directorio similar a RequireJS Docs puede usar:

// app.build.js
({
    appDir: "../",
    baseUrl: "js",
    dir: "../../ui-build",
    paths: {
        'jquery': 'libs/jquery/1.7.1/jquery',
        'underscore': 'libs/underscore/1.3.1-amdjs/underscore',
        'backbone': 'libs/backbone/0.9.1-amdjs/backbone',
        'templates': '../templates'
    }, 
    modules: [
        {
            name: "main"
        }
    ]
})
 171
Author: Riebel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-23 16:56:00

Para referencia, a partir de la versión 1.1.1 (~Feb '13), Backbone también se 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)

 5
Author: biril,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-15 22:09:23

Escribiré directamente, puede leer la explicación en requirejs.org, usted podría utilizar el siguiente código como un fragmento para su uso diario; (p. s. yo uso yeoman) (desde muchas cosas actualizadas, estoy publicando esto a partir de febrero 2014.)

Asegúrese de incluir script en su índice.html

<!-- build:js({app,.tmp}) scripts/main.js -->
<script data-main="scripts/main" src="bower_components/requirejs/require.js"></script>
<!-- endbuild -->

Entonces, en general.js

require.config({
    shim: {
        'backbone': {
            deps: ['../bower_components/underscore/underscore.js', 'jquery'],
            exports: 'Backbone'
        }
    },

    paths: {
        jquery: '../bower_components/jquery/jquery',
        backbone: '../bower_components/backbone/backbone'
    }
});

require(['views/app'], function(AppView){
    new AppView();
});

App.js

/**
 * App View
 */
define(['backbone', 'router'], function(Backbone, MainRouter) {
    var AppView = Backbone.View.extend({
        el: 'body',

        initialize: function() {
            App.Router = new MainRouter();
            Backbone.history.start();
        }
    });

    return AppView;
});

Espero haber sido útil.!

 4
Author: STEEL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-24 16:55:09

Buenas noticias, Underscore 1.6.0 ahora soporta requirejs define !!!

Las versiones por debajo de esto requieren cuñas, o requieren subrayado.js entonces espera ciegamente que la variable global " _ " no ha sido aplastada (lo cual para ser justo es una apuesta justa)

Simplemente cárgalo por

  requirejs.config({
    paths: {
        "underscore": "PATH/underscore-1.6.0.min",
    }
  });
 3
Author: aqm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-12 10:16:42
require.config({
  waitSeconds: 500,
  paths: {
    jquery: "libs/jquery/jquery",
    jqueryCookie: "libs/jquery/jquery.cookie",
    .....
  },

  shim: {
    jqxcore: {
      export: "$",
      deps: ["jquery"]
    },
    jqxbuttons: {
      export: "$",
      deps: ["jquery", "jqxcore"]
    }
    ............
  }
});

require([
 <i> // Load our app module and pass it to our definition function</i>
  "app"
], function(App) {
  // The "app" dependency is passed in as "App"
  // Again, the other dependencies passed in are not "AMD" therefore don't pass a parameter to this function
  App.initialize();
});
 0
Author: Sumesh TG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-19 07:34:50