var moduleCache = {};
var moduleRegistry = {};
function require(moduleName) {
if (moduleCache[moduleName]) {
return moduleCache[moduleName].exports;
}
var module = moduleCache[moduleName] = {
exports: {},
loaded: false
};
moduleRegistry[moduleName] = function() {
module.loaded = true;
module.exports = module.exports || {};
module.exports.__esModule = true;
module.exports.default = module.exports;
module.exports.__useDefault = true;
};
loadScript('path/to/' + moduleName + '.js', function() {
moduleRegistry[moduleName]();
});
return module.exports;
}
function loadScript(src, callback) {
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = src;
script.onload = function() {
callback();
};
document.head.appendChild(script);
}
require('moduleA').publicMethod();
function ModuleLoader() {
this.modules = {};
}
ModuleLoader.prototype.load = function (path) {
if (this.modules[path]) {
return Promise.resolve(this.modules[path]);
}
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf8', (err, data) => {
if (err) {
reject(err);
return;
}
const module = this.parseModule(data);
const result = this.executeModule(module);
this.modules[path] = result;
resolve(result);
});
});
};
ModuleLoader.prototype.parseModule = function (source) {
const exports = {};
const exportStatement = 'export default value;';
const match = source.match(/value\s*=\s*(\S+)/);
if (match) {
exports.default = match[1];
}
return exports;
};
ModuleLoader.prototype.executeModule = function (module) {
return module;
};
const loader = new ModuleLoader();
loader.load('./module.js').then(module => {
console.log(module);
});