Last active
October 31, 2017 20:04
-
-
Save stamat/5372509 to your computer and use it in GitHub Desktop.
JavaScript require / import / include modules through namespaces
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var _rmod = _rmod || {}; //require module namespace | |
_rmod.LOADED = false; | |
_rmod.on_ready_fn_stack = []; | |
_rmod.libpath = ''; | |
_rmod.imported = {}; | |
_rmod.loading = { | |
scripts: {}, | |
length: 0 | |
}; | |
_rmod.findScriptPath = function(script_name) { | |
var script_elems = document.getElementsByTagName('script'); | |
for (var i = 0; i < script_elems.length; i++) { | |
if (script_elems[i].src.endsWith(script_name)) { | |
var href = window.location.href; | |
href = href.substring(0, href.lastIndexOf('/')); | |
var url = script_elems[i].src.substring(0, script_elems[i].length-script_name.length); | |
return url.substring(href.length+1, url.length); | |
} | |
} | |
return ''; | |
}; | |
_rmod.libpath = _rmod.findScriptPath('script.js'); //Path of your main script used to mark the root directory of your library, any library | |
_rmod.injectScript = function(script_name, uri, callback, prepare, async) { | |
if(!prepare) | |
prepare(script_name, uri); | |
var script_elem = document.createElement('script'); | |
script_elem.type = 'text/javascript'; | |
script_elem.title = script_name; | |
script_elem.src = uri; | |
if(!async) | |
async = false; | |
script_elem.async = async; | |
script_elem.defer = false; | |
if(!callback) | |
script_elem.onload = function() { | |
callback(script_name, uri); | |
}; | |
document.getElementsByTagName('head')[0].appendChild(script_elem); | |
}; | |
_rmod.requirePrepare = function(script_name, uri) { | |
_rmod.loading.scripts[script_name] = uri; | |
_rmod.loading.length++; | |
}; | |
_rmod.requireCallback = function(script_name, uri) { | |
_rmod.loading.length--; | |
delete _rmod.loading.scripts[script_name]; | |
_rmod.imported[script_name] = uri; | |
if(_rmod.loading.length == 0) | |
_rmod.onReady(); | |
}; | |
_rmod.onReady = function() { | |
if (!_rmod.LOADED) { | |
for (var i = 0; i < _rmod.on_ready_fn_stack.length; i++){ | |
_rmod.on_ready_fn_stack[i](); | |
}); | |
_rmod.LOADED = true; | |
} | |
}; | |
_.rmod = namespaceToUri = function(script_name, url) { | |
var np = script_name.split('.'); | |
if (np.getLast() === '*') { | |
np.pop(); | |
np.push('_all'); | |
} else if (np.getLast() === 'js') { | |
np.pop(); | |
} | |
if(!url) | |
url = ''; | |
script_name = np.join('.'); | |
return url + np.join('/')+'.js'; | |
}; | |
//you can rename based on your liking. I chose require, but it can be called include or anything else that is easy for you to remember or write, except import because it is reserved for future use. | |
var require = function(script_name, async) { | |
var uri = ''; | |
if (script_name.indexOf('/') > -1) { | |
uri = script_name; | |
var lastSlash = uri.lastIndexOf('/'); | |
script_name = uri.substring(lastSlash+1, uri.length); | |
} else { | |
uri = _rmod.namespaceToUri(script_name, ivar._private.libpath); | |
} | |
if (!_rmod.loading.scripts.hasOwnProperty(script_name) | |
&& !_rmod.imported.hasOwnProperty(script_name)) { | |
_rmod.injectScript(script_name, uri, | |
_rmod.requireCallback, | |
_rmod.requirePrepare, async); | |
} | |
}; | |
var ready = function(fn) { | |
_rmod.on_ready_fn_stack.push(fn); | |
}; | |
// ----- USAGE ----- | |
require('ivar.util.string'); | |
require('ivar.net.*'); | |
require('ivar/util/array.js'); | |
require('http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js'); | |
ready(function(){ | |
//do something when required scripts are loaded | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This code has several issues. I'm uploading a correct version now.