DefineJS – A lightweight implementation of AMD module format
fixjs.github.io
fixjs.github.io
https://gist.github.com/paton/ab27a1be7e843d220ee3
Less than a tweet long when minified :)
If file size is extremely important to your project, I highly recommend using something like this instead of almond.js or require.js.
I run a service that requires our customers to install our Javascript snippet on their page.
Migrating away from require.js reduced file size by ~20%.
It's a little ambiguous when using something like Smash, since you're not actually importing a module onto a variable.
For example, check out this random file from D3 source: https://github.com/mbostock/d3/blob/master/src/interpolate/i...
As someone unfamiliar with the codebase, it's unclear to me where many of the variables are coming from (d3_interpolate, d3_rgb_names, d3_interpolateRgb, etc).
It'd imagine it makes managing dependencies a bit trickier.
(I don't use it myself, due to the current project being too large, so I use require.js in conjunction with amdclean which removes a lot of the module loader overheads.)
define.js: 259 LOC
You should rather ask what the difference to almond is (which is also from jburke and useful for bundled loading - I think this is more similiar to define.js).
almond: 275 LOC
As to a reason why someone would write his own AMD loader: I once wrote one, because I want'ed to be able to pass objects as array elements to the require parameter, to forward them to the callback function. Something similiar to this:
function callback(module1, object, module2) { ... }
require(['some-module-ID', object, 'another-module-ID'], callback);
Thus I got something similiar to Function.bind() for free.Also I could implement a global requirement list. A synchronous script in the head could add entries to this list and thus prevent the execution of any asynchronous script, which was not in the list. Thus those in the list could be loaded asynchronously. After all of them where resolved, all the others could be loaded.
For instance this is incredibly useful, if you wan't to load IE shims, for things like this: https://developer.mozilla.org/en-US/docs/Web/API/Element.cla... etc.
I guess I could open source it, if I feel like it. :D
Edit: Fixed LOC numbers. I also just checked my implementation: Only 168 LOC, while nearly implementing AMD (without relativ paths!), tuned for Closure/uglify.js/etc. and compatible to IE6, but with those 2 features above. I guess that's pretty good too…
use(['dependency'])
.then(function(dependency){
})
.then()
.cache();
Imagine a control flow in the module definition, or having different private scopes when defining a new module.
N.b. another AMD loader (30 lines of JS): https://curiosity-driven.org/amd-loader-with-promises