Skip to content

Instantly share code, notes, and snippets.

@stri8ed
Created July 19, 2015 18:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stri8ed/e82501e77a0fed7ad09b to your computer and use it in GitHub Desktop.
Save stri8ed/e82501e77a0fed7ad09b to your computer and use it in GitHub Desktop.
requirejs-worker-spawn
define(function(require) {
'use strict';
const REQUIRE_URL = getRequireJsUrl();
const BASE_URL = getRequireJSBaseUrl();
function spawn(data, fn) {
return new Promise(function(res, rej) {
let wrapper = buildWrapper(fn);
let url = functionToUrl(wrapper);
let worker = new Worker(url);
worker.onmessage = res;
worker.onerror = rej;
URL.revokeObjectURL(url);
});
}
function buildWrapper(fn) {
let wrapper = `(function() {
'use strict';
importScripts('${REQUIRE_URL}');
require.config({ baseUrl : '${BASE_URL}' });
let _init = ${fn.toString()};
let _onComplete = function(result) {
self.postMessage(result); self.close(); }
_init(null, require, _onComplete);
})()`;
return wrapper;
}
function getRequireJsUrl() {
let filename = 'require.js';
let scripts = document.getElementsByTagName('script');
let src;
for(let i = 0, len = scripts.length; i < len; i++) {
src = scripts[i].src;
if(src.indexOf(filename) > -1) {
let parts = src.split('/');
if(parts[parts.length-1] === filename) {
return src;
}
}
}
return null;
}
function getRequireJSBaseUrl() {
let requireBaseUrl = require.toUrl('');
let href = window.location.href;
let endIdx = href.lastIndexOf('/');
let result = href.substring(0, endIdx) + '/' + requireBaseUrl;
return result;
}
function functionToUrl(fnString) {
let blob = new Blob([ fnString ],
{ type: 'application/javascript' } );
let url = URL.createObjectURL(blob);
return url;
}
spawn(null, function(data, require, onComplete) {
require(['core/someModule'], function(mod) {
onComplete('my results');
});
}).then(function(res) {
console.log(res);
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment