Imagine this is your module…
define(['Utils/css'], function(css){
console.log(css);
});
If your Utils/css
dependancy was like the following…
define(['require'], function(require){
return {
style: require('Utils/CSS/getAppliedStyle'),
classes: require('Utils/CSS/getArrayOfClassNames'),
add: require('Utils/CSS/addClass'),
remove: require('Utils/CSS/removeClass'),
has: require('Utils/CSS/hasClass')
}
});
…then you would have this error displayed: Uncaught Error: Module name 'Utils/CSS/getAppliedStyle' has not been loaded yet for context: _
because you created a race condition issue.
One work around would be to do…
define(['Utils/CSS/getAppliedStyle', 'Utils/CSS/getArrayOfClassNames', 'Utils/CSS/addClass', 'Utils/CSS/removeClass', 'Utils/CSS/hasClass'], function(getAppliedStyle, getArrayOfClassNames, addClass, removeClass, hasClass){
return {
style: getAppliedStyle,
classes: getArrayOfClassNames,
add: addClass,
remove: removeClass,
has: hasClass
}
});
But that's FUGLY, so instead, go back to what we had before but just don't specify require
as a dependancy…
define(function(require){
return {
style: require('Utils/CSS/getAppliedStyle'),
classes: require('Utils/CSS/getArrayOfClassNames'),
add: require('Utils/CSS/addClass'),
remove: require('Utils/CSS/removeClass'),
has: require('Utils/CSS/hasClass')
}
});
I have an idea of why this works but maybe @jrburke can clarify.
the flow is basically:
no dependencies and +1 parameter
define(function(require){ ... })
toString()
on the callback function and read all therequire('module_id')
calls.no dependencies and no parameters
define(function(){ ... });
dependency array
define(['require'], function(require){ ... })
so as you can see both loads the files asynchronously but the later doesn't check the
require('module_id')
since it considers that all the dependencies are already on the array and/or all the internal require calls are asynchronous or are requiring modules that was previously loaded.if you want the
require('module_id')
to work as if it was a CJS module you need to use the 1st pattern or use the full CJS wrapper (2-3 arguments):