

DefineJS – A lightweight implementation of AMD module format - fixjs
http://fixjs.github.io/define.js/

======
cj
I recently wrote a 20 LOC (synchronous) implementation of define() and
require().

[https://gist.github.com/paton/ab27a1be7e843d220ee3](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.

~~~
rkwz
But, what's the point of this? How's this an alternative of require.js?

~~~
cj
File size.

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%.

~~~
vmind
If it's just a snippet, and require.js made up 20% of the filesize, then why
not just have a single file, or assume a single closure and concatenate a few
files together? You'll gain even better filesize from minifying inside a
single closure. The formalised step up from this is SMASH, which is how d3 is
built: [https://github.com/mbostock/smash](https://github.com/mbostock/smash)

~~~
cj
IMO, a big upside of using a define / require pattern, even when the final
library is fully concatenated, is that you have a clear picture of all of
variables that are available in a particular module.

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...](https://github.com/mbostock/d3/blob/master/src/interpolate/interpolate.js)

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.

~~~
vmind
Well yes, it's not ideal for all development, but you professed a need for
smaller filesize, which it's ideal for. Naming conventions can alleviate most
of the variable issues, it's just another way to solve the problem that has
some advantages and disadvantages.

(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.)

------
prayerslayer
Maybe the author could comment on what's wrong with require.js (the most
popular AMD module loader) and which problems DefineJS solves?

~~~
Touche
The entire point of a standard is to have multiple implementations. They don't
all need to be justified.

~~~
Kudos
I've just started using AMD and have no idea how this differs (maybe it
effectively doesn't), so it'd be nice to have a paragraph on that somewhere.

------
wldlyinaccurate
I'm having trouble understanding why I would use this over ES6 modules, or
even RequireJS/Almond? The README comes across as more of a blog post than
technical documentation.

~~~
stemc43
because ES6 modules are not yet well-supported?

~~~
Touche
There's a polyfill that works very well actually:
[https://github.com/ModuleLoader/es6-module-
loader](https://github.com/ModuleLoader/es6-module-loader) IE8/IE9 depending
on what ES6 features you use.

~~~
stemc43
I wasn't following JS loaders for sometime. Are you saying that most people
now use ES6 modules instead of AMD?

~~~
Touche
No, I'm not saying that, I'm saying that you can use them and that polyfill
allows you to do so.

------
fixjs
A new working example which shows how to use one of the nonstandard syntaxes
in DefineJS, something like:

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.

------
m90
I'm all in for more choices in AMD implementations, but why doesn't this
expose the standard `require` and `define` methods? I do get that I'm supposed
to map them myself, but then again I have no clue what advantage I get from
this?

~~~
fixjs
One of the main goals here is to provide developers the ability of exposing it
to different globals with different behaviors and configuration, which is not
possible yet in this version, but it will be there in the next couple of
hours.

------
fixjs
@prayerslayer: nothing wrong with require.js, the main goal is to create a
more portable alternative and more importantly to add couple of new and
nonstandard ways of modular coding as a proposal for the JavaScript community.

~~~
burntsushi
Could you please explain in more technical detail? What specifically are the
trade-offs between DefineJS and RequireJS?

~~~
Theyeard
I'd rather see technical details too plus maybe a comparison between
require.js/almond and define.js. Currently it's not clear what are the
advantages of define.js.

N.b. another AMD loader (30 lines of JS): [https://curiosity-driven.org/amd-
loader-with-promises](https://curiosity-driven.org/amd-loader-with-promises)

------
fixjs
Check out the DefineJS-v0.2.2 with a bunch of examples and Promised Modules.

------
fixjs
Thanks for your feedbacks. The next release will be available in the next
couple of hours, with a bunch of examples and a more technical RRADME.

------
fixjs
I just added a working example of DefineJS which shows the way that the
regular AMD format gets implemented.

