Junkee[]
Lounge-Member
Code:
var require = function() {
var args = arguments;
if(!args.callee.moduleLoad)
args.callee.moduleLoad = {};
var moduleLoad = args.callee.moduleLoad;
if(!args.callee.modules)
args.callee.modules = {};
if(!args.callee.modulesDir) {
var scripts = document.getElementsByTagName("script");
for(var i=0; i<scripts.length; i++) {
if(/^.*\/require\.js(&.*)?$/.test(scripts[i].src)) {
var src = scripts[i].src.indexOf("?") == -1 ? scripts[i].src : scripts[i].substr(0, scripts[i].src.indexOf("?"));
args.callee.modulesDir = src.substr(0, src.lastIndexOf("/")) + "/modules/";
}
}
}
function createXHR() {
var req;
try{
req = new XMLHttpRequest();
}
catch (e){
try{
req = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e){
try{
req = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (failed){
req = null;
}
}
}
return req;
}
if(typeof arguments[arguments.length-1] == "function" && arguments.length > 1) { // async
var modules = [];
var counter = 0;
for(var i=0; i<arguments.length-1; i++) {
if(typeof args[i] != "string")
throw new Error(args[i].toString() + " is no string");
if(typeof args.callee.modules[args[i]] != "undefined") {
if(args.callee.modules[args[i]].loaded == false) {
moduleLoad[args[i]] = function(obj) {
modules.push(obj);
if(++counter == args.length-1) {
return args[args.length-1].apply(window, modules);
}
}
}
else {
modules.push(args.callee.modules[args[i]].obj);
if(++counter == args.length-1) {
return args[args.length-1].apply(window, modules);
}
}
continue;
}
args.callee.modules[args[i]] = {loaded:false};
(function(i) {
var req = createXHR();
req.open("get", args.callee.modulesDir + args[i] + ".js", true);
req.onreadystatechange = function() {
if(req.readyState == 4) {
if(req.status != 200)
throw new Error("Required file \"" + args[i] + "\" could not be loaded (" + req.status + ")");
var export = {};
eval(req.responseText);
modules[i] = export;
args.callee.modules[args[i]] = {loaded:true , obj:export};
if(moduleLoad[args[i]])
moduleLoad[args[i]](export);
if(++counter == args.length-1) {
return args[args.length-1].apply(window, modules);
}
}
}
req.send(null);
})(i);
}
}
else if(typeof args[0] == "string") { // sync
if(typeof args.callee.modules[args[0]] != "undefined" && args.callee.modules[args[0]].loaded === true)
return args.callee.modules[args[0]].obj;
req = createXHR();
req.open("get", args.callee.modulesDir + arguments[0] + ".js", false);
req.send(null);
if(req.status != 200)
throw new Error("Required file \"" + args[0] + "\" could not be loaded (" + req.status + ")");
var export = {};
eval(req.responseText);
args.callee.modules[args[0]] = {loaded:true, obj:export};
return export;
}
else
throw new Error("Wrong use of require; see docu or cry when there is no docu");
}
Code:
synchron:
var module1 = require("module1");
var module2 = require("module2");
asynchron:
require("module1", "module2", ..., function(module1, module2, ...) {
});
Code:
var x1 = require("x");
var x2 = require("x");
alert(x1 === x2); // true
Code:
var gx1, gx2
require("x", function(x1) {
gx1 = x1;
});
require("x", function(x2) {
gx2 = x2;
});
window.setTimeout(function() {
alert(gx1 === gx2); // true
}, 1000);
Verbesserungsvorschläge? Fragen?