Web module loader
This package loads commonjs modules at runtime. It's intended to immitate node's module loading in the browser. It will also work within node.
Installation
npm install --save web-module-loader
Usage
There are two APIs:
-
loader
- A higher-level API that allows providing top-level modules by name (e.g.moment
), and registers exports as scripts are evaluated. -
evaluate
- A lower-level API that allows passing arequire
function and then evaluating a script that can look up modules by calling the providedrequire
.
Loader
Requiring top-level modules
If moment
is installed, for example:
import loader from "web-module-loader";
import moment from "moment";
const context = loader({ moment });
const script = `
const moment = require('moment');
module.exports = moment(1111111111111).format('MM/DD/YY');
`;
const result = context()(script);
console.log(result); // => 03/17/05
Multiple scripts
Scripts can require one another by relative path:
import loader from "web-module-loader";
const context = loader();
const scriptA = "module.exports = 1;";
const scriptB = "module.exports = 2 + require('./a');";
const scriptC = "module.exports = 3 + require('../b');";
context("a.js")(scriptA);
context("b.js")(scriptB);
const result = context("foo/c.js")(scriptC);
console.log(result); // => 6;
Evaluate
Exporting values
import { evaluate } from "web-module-loader";
const result = evaluate()("module.exports = 3;");
console.log(result); // => 3
Requiring modules
If moment
is installed, for example:
import { evaluate } from "web-module-loader";
import moment from "moment";
const require = name => {
switch (name) {
case "moment":
return moment;
default:
throw new Error(`Module ${name} not found!`);
}
};
const script = `
module.exports = moment(1111111111111).format('MM/DD/YY');
`;
const result = evaluate(require)(script);
console.log(result); // => 03/17/05
Storing exported modules
If you want to evaluate multiple files that can require
one another, consider creating an object to store exports by name:
import { evaluate } from "web-module-loader";
const moduleMap = {};
const require = name => {
if (name in moduleMap) {
return moduleMap[name];
}
throw new Error(`Module ${name} not found!`);
};
const scriptA = "module.exports = 3;";
const scriptB = "module.exports = 4 + require('a')";
const bundler = evaluate(require);
moduleMap.a = bundler(scriptA);
moduleMap.b = bundler(scriptB);
console.log(moduleMap.b); // => 7