RequireJS 2.X now organically addresses non-AMD modules such as Backbone & Underscore much better, using the new shim
configuration.
The shim
configuration is simple to use: (1) one states the dependencies (deps
), if any, (which may be from the paths
configuration, or may be valid paths themselves). (2) (optionally) specify the global variable name from the file you’re shimming, which should be exported to your module functions that require it. (If you don’t specify the exports, then you’ll need to just use the global, as nothing will get passed into your require/define functions.)
Here is a simple example usage of shim
to load Backbone. It also adds an export for underscore, even though it doesn’t have any dependencies.
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
});
Note: this simplified code assumes that jquery, backbone and underscore are in files named “jquery.js”, “backbone.js” and “underscore.js” in the same directory as this “main” code (which becomes the baseURL for require). If this isn’t the case, you’ll need to use a paths config.
I personally think with the built-in shim
functionality, the advantages of not using a forked version of Backbone & Underscore outweigh the benefits of using the AMD fork recommended in the other popular answer, but either way works.