Usando Backbone com RequireJS

É comum ver define(['underscore', 'backbone', ...no início de cada definição de módulo quando as pessoas estão usando o Backbone com RequireJS. Embora tecnicamente correto, é desnecessário e pode facilmente levar a bugs (onde os arquivos necessários são esquecidos ou os argumentos estão ausentes / na ordem errada).

Como as versões não-AMD oficiais do jQuery, Underscore * e Backbone se registram globalmente, não é necessário exigi-las mais de uma vez. Usando a shimopção de configuração do RequireJS, podemos configurá-los facilmente de forma que só tenhamos que declará-los uma vez:

require.config({
paths
: {
jquery
: '../vendor/jquery/jquery', // jQuery
lodash
: '../vendor/lodash/dist/lodash', // Underscore stand-in (non AMD version)
backbone
: '../vendor/backbone/backbone', // Backbone (non AMD version)
},
shim
: {
// Libraries
jquery
: {
exports
: '$'
},
lodash
: {
exports
: '_',
},
backbone
: {
exports
: 'Backbone',
deps
: ['jquery', 'lodash']
}

/*
* Our app requires Backbone

* (which in turn requires LoDash and jQuery)

*/

app
: {
deps
: ['backbone']
}
}
});

/*
* Now require the app code, which, because of the `shim`

* settings, will only load once jQuery, LoDash, and Backbone

* are added to the global scope

*/

require(['app']);

Você não precisará mais definir jQuery, Underscore ou Backbone em cada módulo, pois o aplicativo não será carregado até que estejam prontos.

Notas

  • Eu geralmente uso LoDash no lugar de sublinhado