• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

CommonJS Module mit Browser laden

Mir hat das require als blockender Aufruf nicht gefallen und deshalb das Script grundlegend geändert:
require.js
Code:
function require(module) {
    if(require.modules.hasOwnProperty(module))
        return require.modules[module];
    if(!require.moduleSrc.hasOwnProperty(module))
        throw new Error("Cannot find Module '" + module + "'");
    var exports = {};
    require.eval(exports, require.moduleSrc[module]);
    require.modules[module] = exports;
    return exports;
}

require.load = function(modules, callback) {
    
    if(!require.dependencies.dir)
        throw Error("No directory defined for dependencies");
    if(!modules || ! modules instanceof Array)
        throw new Error("No modules to load");
    if(!require.dependencies.modules)
        require.dependencies.modules = {};
    if(typeof modules == "string")
        modules = [modules];
    
    var useableXHRObjects = [];
    
    var toLoad = 0;
    var depends;
    var loading = {};
    for(var i=0; i<modules.length; i++) {
        loadModule(modules[i]);
    }
    
    function loadModule(module) {
        if(require.dependencies.modules[module]) {
            depends = require.dependencies.modules[module];
            for(var j=0; j<depends.length; j++) {
                if(!loading.hasOwnProperty(depends[j]))
                    loadModule(depends[j]);
                loading[depends[j]] = true;
            }
        }
        if(!loading.hasOwnProperty(module))
            loadPath(module);
        loading[module] = true;
    }
    
    function loadPath(module) {
        toLoad++;
        var path = require.dependencies.dir + "/" + module + ".js?" + Math.random(), req = getXHRObject();
        
        req.open("GET", path, true);
        req.onreadystatechange = function() {
            if(req.readyState == 4) {
                if(req.status != 200) {
                    throw new Error("Module '" + module + "' not found! (HTTP status code " + req.status + ")");
                }
                else {
                    finishRequest(module, req.responseText);
                }
                useableXHRObjects.push(req);
                if(--toLoad == 0) {
                    callback();
                }
            }
        };
        
		req.send(null);
		return req;
    }
    
    function finishRequest(module, data) {
        require.moduleSrc[module] = data;
    }
    
    	
	function getXHRObject(){
		if (useableXHRObjects.length){
			return useableXHRObjects.pop();
		}
		var req;
		if (window.XMLHttpRequest){
			req = new XMLHttpRequest();
		}
		else if(window.ActiveXObject){
			var tries = ['Msxml2.XMLHTTP.7.0', 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP'];
			for (var i = 0; i < tries.length; i++){
				try{
					req = new ActiveXObject(tries[i]);
					break;
				}
				catch (e){}
			}
		}
		if (!req){
			throw new Error('Error creating request object!');
		}
		return req;
	}
    
}

require.eval = function(exports, src) {
    eval(src);
}

require.dependencies = {};

require.moduleSrc = {};

require.modules = {};
dependencies.js
Code:
require.dependencies = {
    dir: "/path/to/modules",
    modules: {
        x: ["a", "b", "c"],
        a: ["y"]
    }
};
und zum Aufrufen:
Code:
<script type="text/javascript" src="require.js"></script>
<script type="text/javascript" src="dependencies.js"></script>
<script type="text/javascript">
require.load(["x", "c"], function() {
    // hier stehen die Module x und c sowie alle Abhängigkeiten (hier a, b, c, y) zur Verfügung
    var x = require("x");
});
</script>
 
äh, nein.
Code:
if(require.modules.hasOwnProperty(module))
        return require.modules[module];
Code:
require.modules[module] = exports;
 
Zurück
Oben