Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@paciolan/remote-module-loader

Package Overview
Dependencies
Maintainers
1
Versions
24
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@paciolan/remote-module-loader

Loads a CommonJS module from a remote URL for the Browser or Node.js.

  • 3.0.3
  • latest
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
5.9K
decreased by-24.46%
Maintainers
1
Weekly downloads
 
Created
Source

Remote Module Loader coverage:100%

Loads a CommonJS module from a remote URL for the Browser or Node.js.

Lunar Module

Use Cases

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.

Install

npm install @paciolan/remote-module-loader

createLoadRemoteModule

The 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.

Simple Example

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();

Require Example

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 });

Using your own fetcher

The default loader can be overridden if you want to use an alternate method.

This example uses axios for the fetcher.

/**
 * src/lib/loadRemoteModule.js
 */

import createLoadRemoteModule from "@paciolan/remote-module-loader";
import axios from "axios";

const fetcher = url => axios.get(url).then(request => request.data);

export default createLoadRemoteModule({ fetcher });

Usage

Modules are loaded asynchronously, so use similar techniques to any other async function.

Promise Style

/**
 * 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 });
});

Named Exports

/**
 * 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();

Async/Await Style

/**
 * 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();

Creating a Remote Module

Remote Modules must be in the CommonJS format, using exports to export functionality.

This is an example of a simple CommonJS module:

function helloWorld() {
  console.log("Hello World!");
}

exports.default = helloWorld;

note: overwriting exports will cause failures.

// ❌ NO!
exports = {
  default: "FAIL!"
};

// ✅ YES!
exports.default = "SUCCESS!";

Webpack

Webpack can be setup to export as CommonJS.

Inside webpack.config.js, set the libraryTarget to "commonjs".

module.exports = {
  output: {
    libraryTarget: "commonjs"
  }
};

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"
  }
};

Content Security Policy (CSP)

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.

Read more on CSP

Alternatives

Contributors

Joel Thoms (https://twitter.com/joelnet)

Icon made by Freepik from www.flaticon.com

FAQs

Package last updated on 13 Feb 2024

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc