Skip to content

Instantly share code, notes, and snippets.

@timjb
Last active February 12, 2016 00:30
Show Gist options
  • Select an option

  • Save timjb/4ea31d652813867970d3 to your computer and use it in GitHub Desktop.

Select an option

Save timjb/4ea31d652813867970d3 to your computer and use it in GitHub Desktop.

JavaScript File Set Loader

Loads your javascript files, resolves dependencies.

Usage Example

// *** PASTE COMPRESSED CODE FROM `js-fileset-loader.min.js` HERE ***

var productionFileSet = {
  'js-build/app.min.js'
};

var developmentFileSet = {
  'deps/react.js': [],
  'deps/react-dom.js': ['deps/react.js'],
  'js-build/queue-animations.js': ['deps/react.js', 'deps/react-dom.js']
}

var environment = (location.host === 'localhost:8000') ? 'development' : 'production';
loadJsFileSet(environment === 'development' ? developmentFileSet : productionFileSet, function () {});

Creating the minified version

The minified file js-fileset-loader.min.js has been compressed with the Closure Compiler using simple optimizations.

/* see https://gist.github.com/timjb/4ea31d652813867970d3 */
var loadJsFileSet = (function () {
var loadingState = {};
var loading = 1, loaded = 2;
function loadJsFile (src, cb) {
var script = document.createElement('script');
script.src = src;
script.async = true;
script.onload = cb;
var ref = document.getElementsByTagName("script")[0];
ref.parentNode.insertBefore(script, ref);
}
return function (jsFileSet, cb) {
var allLoaded = true;
Object.keys(jsFileSet).forEach(function (jsFile) {
if (loadingState[jsFile] === loaded) { return; }
allLoaded = false;
if (loadingState[jsFile] === loading) { return; }
var deps = jsFileSet[jsFile];
for (var i = 0; i < deps.length; i++) {
if (loadingState[deps[i]] !== loaded) { return; }
}
// all dependencies are loaded
loadingState[jsFile] = loading;
loadJsFile(jsFile, function () {
loadingState[jsFile] = loaded;
console.log('loaded `' + jsFile + '`')
loadJsFileSet(jsFileSet, cb);
});
});
if (allLoaded) { cb(); }
};
})();
/* https://goo.gl/km1j9V */
var loadJsFileSet=function(){function h(c,d){var b=document.createElement("script");b.src=c;b.async=!0;b.onload=d;var a=document.getElementsByTagName("script")[0];a.parentNode.insertBefore(b,a)}var c={};return function(e,d){var b=!0;Object.keys(e).forEach(function(a){if(2!==c[a]&&(b=!1,1!==c[a])){for(var g=e[a],f=0;f<g.length;f++)if(2!==c[g[f]])return;c[a]=1;h(a,function(){c[a]=2;console.log("loaded `"+a+"`");loadJsFileSet(e,d)})}});b&&d()}}();
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
Copyright (C) 2004 Sam Hocevar <[email protected]>
Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment