Loads a CommonJS, AMD, or UMD module from a remote URL for the Browser or Node.js.
Lazy Load Modules to keep initial load times down and load modules just in time, similar to Webpack's code splitting.
Update Remote Modules independent of the web application. Update a module without redeploying the web application.
npm install @paciolan/remote-module-loaderThe createLoadRemoteModule function is used to inject dependencies into a loadRemoteModule function.
It is recommended to create a separate file, in this example it is called src/lib/loadRemoteModule.js.
If your module has no external dependencies, this is the easiest method to fetch the remote module.
/**
* src/lib/loadRemoteModule.js
*/
import createLoadRemoteModule from "@paciolan/remote-module-loader";
export default createLoadRemoteModule();You can pass dependencies to the module. All modules loaded with this version of loadRemoteModule, will have the dependencies available to require.
/**
* src/lib/loadRemoteModule.js
*/
import createLoadRemoteModule, {
createRequires
} from "@paciolan/remote-module-loader";
const dependencies = {
react: require("react")
};
const requires = createRequires(dependencies);
export default createLoadRemoteModule({ requires });The default loader can be overridden if you want to use an alternate method.
This example uses fetch for the fetcher.
/**
* src/lib/loadRemoteModule.js
*/
import createLoadRemoteModule from "@paciolan/remote-module-loader";
const fetcher = url => fetch(url).then(response => response.text());
export default createLoadRemoteModule({ fetcher });Modules are loaded asynchronously, so use similar techniques to any other async function.
/**
* src/index.js
*/
import loadRemoteModule from "./lib/loadRemoteModule";
const myModule = loadRemoteModule("http://fake.url/modules/my-module.js");
myModule.then(m => {
const value = m.default();
console.log({ value });
});/**
* src/index.js
*/
import loadRemoteModule from "./lib/loadRemoteModule";
const main = async () => {
const myModule = await loadRemoteModule(
"http://fake.url/modules/my-module.js"
);
const list = myModule.getList();
console.log({ list });
};
main();/**
* src/index.js
*/
import loadRemoteModule from "./lib/loadRemoteModule";
const main = async () => {
const myModule = await loadRemoteModule(
"http://fake.url/modules/my-module.js"
);
const value = myModule.default();
console.log({ value });
};
main();Remote modules can be in CommonJS, AMD, or UMD format. The loader provides both require/module/exports (CommonJS) and define (AMD) to every module, so the module itself determines which format to use.
function helloWorld() {
console.log("Hello World!");
}
exports.default = helloWorld;note: overwriting exports will cause failures.
// ❌ NO!
exports = {
default: "FAIL!"
};
// ✅ YES!
exports.default = "SUCCESS!";define(["exports"], function (exports) {
exports.default = function helloWorld() {
console.log("Hello World!");
};
});AMD modules can also return a value directly from the factory:
define(function () {
return {
default: function helloWorld() {
console.log("Hello World!");
}
};
});Webpack can be setup to export as CommonJS or AMD.
Inside webpack.config.js, set the libraryTarget to "commonjs" or "amd".
module.exports = {
output: {
libraryTarget: "commonjs"
}
};module.exports = {
output: {
libraryTarget: "amd"
}
};Dependencies should be excluded from the bundle because they will be provided by the Web Application can be added to webpack's externals section.
This will prevent webpack from bundling duplicate 3rd party libraries, decreasing the bundle size.
module.exports = {
output: {
libraryTarget: "commonjs"
},
externals: {
react: "react"
}
};Sites with a content_security_policy header set are likely to not work. CSP puts a restriction on using new Function, which remote-module-loader relies upon.
Joel Thoms (https://x.com/joelnet)
Icon made by Freepik from www.flaticon.com
