Giter VIP home page Giter VIP logo

remote-module-loader's Introduction

Remote Module Loader coverage:100%

Lunar Module

Loads a CommonJS module from a remote url.

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

By default loadRemoteModule will use the XMLHttpRequest object avaiable in the browser. This can be overridden if you want to use an alternate method.

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

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:

var name = "myModule";

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

exports.name = name;
exports.default = helloWorld;

note: overwriting exports will cause failures.

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

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

Webpack

Setting up Webpack to export a CommonJS is pretty easy.

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

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

Dependencies that will be provided by the Web Application that uses your Remote Module can be added to webpack's externals section.

This will prevent webpack from bundling unwanted 3rd party libraries, decreasing the bundle size.

module.exports = {
  output: {
    libraryTarget: "commonjs"
  },
  externals: {
    react: "react",
    "prop-types": "prop-types"
  }
};

Contributors

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

Icon made by Freepik from www.flaticon.com

remote-module-loader's People

Contributors

dependabot[bot] avatar joelnet avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.