Skip to content

Instantly share code, notes, and snippets.

@millermedeiros
Forked from ryanflorence/universal-module.js
Created September 29, 2011 19:21
Show Gist options
  • Save millermedeiros/1251668 to your computer and use it in GitHub Desktop.
Save millermedeiros/1251668 to your computer and use it in GitHub Desktop.
Universal JavaScript Module, supports AMD (RequireJS), Node.js, and the browser.
(function(def){
def('myModule', ['someDependency', 'somethingElse'], function(someDependency, somethingElse){
//return the module's API
return {};
});
}(
// wrapper to run code everywhere
typeof define === 'function' && define.amd?
//AMD
function(name, deps, factory){
define(deps, factory); //registering as an unnamed module, more flexible and match CommonJS
} :
(typeof require === 'function' && typeof module !== 'undefined' && module.exports ?
//CommonJS
function(deps, factory){
module.exports = factory.apply(this, deps.map(require));
} :
//Browser (regular script tag)
function(name, deps, factory){
var d, i = 0, global = this, old = global[name], mod;
while(d = deps[i]){
deps[i++] = this[d];
}
global[name] = mod = factory.apply(global, deps);
mod.noConflict = function(){
global[name] = old;
return mod;
};
}
)
));
// AMD
require(['myModule'], function (myModule){
// use myModule here
});
// Node.js
var myModule = require('myModule');
// Global
myModule
// if myModule is already defined, `noConflict` gives it back
var myNonConflictingModule = myModule.noConflict();
@unscriptable
Copy link

I like how your boilerplate is on the bottom and the module definition at the top.

imho even define && define.amd is safe enough. Doesn't hurt to do the additional check though.

@millermedeiros
Copy link
Author

in case someone reaches this gist, I just published a new post explaining why AMD rocks: http://blog.millermedeiros.com/2011/09/amd-is-better-for-the-web-than-commonjs-modules/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment