My understanding of AMD modules (using for example RequireJs or curl.js) is:
require()
is used to asynchronously load different modules and when loaded then the callback fn is executed.
And to define a module, you would have separate scripts that use define()
But I've seen some modules use require()
inside their function definition, e.g.
define([a, b, c], function(i, ii, iii){
require([d, e, f], function(d, e, f) {
// do some stuff with these require()'d dependancies
})
/* rest of the code for this module */
})
But I find this confusing because I would have thought that if a module has dependancies then they should be passed through via the main define([dependancies], fnDefinition)
function and not within it via require()
as per the above example is doing.
Is there a reasoning behind this?
There are a few reasons you may want to use
require()
in a module.But first, be sure you request a reference to the correct
require
variable. In your example, the reference torequire
is a global. You want a reference to arequire
that is scoped to the context of your module (sometimes called a "local require"). This is easy:The main reason this is important is to ensure that relative module ids (e.g. "./peerModule" or "../unclePath/cousinModule") are resolved correctly. (This is one of the reasons, curl.js doesn't have a global
require
by default.)Reasons to use a local
require
:Lastly, AMD defines a second usage of
require
for compatibility with modules authored in the CommonJS Modules/1.1 which are then wrapped in adefine
. These look like this:Server-side javascript devs may find this format appealing. :)
Some AMD loaders (such as RequireJS 0.2+, dojo 1.7+, bdLoad, and curl.js 0.6+) will detect this hybrid AMD/CJSM1.1 format and find dependencies by scanning the module for
require
calls.