npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@appshell/cli

v0.7.0

Published

cli utility to generate a global appshell artifacts for module federation micro-frontends

Downloads

657

Readme

Appshell CI

@appshell/cli

Utility for building micro-frontends with Appshell and Webpack Module federation.

Working examples can be found here.

Getting Started

To begin, you'll need to install @appshell/cli:

npm install @appshell/cli --save-dev

or

yarn add -D @appshell/cli

or

pnpm add -D @appshell/cli

Usage

appshell [command]

Commands:
  appshell generate [target]  Generates a resource
  appshell register           Register one or more appshell manifests
  appshell start              Start the appshell runtime environment

appshell generate

appshell generate [target]

Generates a resource

Commands:
  appshell generate manifest  Generate the appshell manifest by processing the template specified by --template
  appshell generate env       Generate the runtime environment js file that reflects the current process.env
  appshell generate global-config     Generate the global appshell configuration file by merging sources specifed by --registry options
  appshell generate metadata  Generate the appshell metadata file by merging sources specifed by --registry options

Generate manifest

Generates the appshell global runtime manifest.

appshell generate manifest

Generate the appshell global runtime manifest

Options:
      --help        Show help                                           [boolean]
      --version     Show version number                                 [boolean]
  -t, --template  Path to the appshell config template to process     [string] [default: "appshell.template.json"]
  -o, --outDir      Output location for the appshell manifest           [string] [default: "dist"]
  -f, --outFile     Output filename for the appshell manifest           [string] [default: "appshell.manifest.json"]

Sample usage

appshell generate manifest --template dist/appshell.template.json

Where does the content of APPSHELL_REGISTRY come from?

Each micro-frontend configured to use @appshell/manifest-webpack-plugin emits a manifest template, which is subsequently used to generate a manifest for the remote module. This manifest is then registered with the APPSHELL_REGISTRY.

Sample config template appshell.template.json:

{
  "remotes": {
    "CraModule/App": {
      "url": "${CRA_MFE_URL}",
      "metadata": {
        "route": "/cra",
        "displayName": "Example App",
        "displayGroup": "${CRA_MFE_DISPLAY_GROUP}",
        "order": 10,
        "icon": "ViewList"
      },
      "id": "3eb81a0c"
    }
  },
  "module": {
    "exposes": {
      "./App": "./src/App"
    },
    "filename": "remoteEntry.js",
    "name": "CraModule",
    "shared": {
      "react": {
        "singleton": true,
        "requiredVersion": "^18.2.0"
      },
      "react-dom": {
        "singleton": true,
        "requiredVersion": "^18.2.0"
      }
    }
  },
  "environment": {
    "RUNTIME_ARG_1": "${RUNTIME_ARG_1}",
    "RUNTIME_ARG_2": "${RUNTIME_ARG_2}"
  }
}

How does my runtime environment get reflected in the appshell manifest?

Note the variable expansion syntax ${CRA_MFE_URL}. When appshell generate manifest is called the actual runtime environment values are injected in order to produce the remote module's appshell manifest.

Note the environment section defines runtime environment variables that are injected into the global namesapce window.__appshell_env__[module_name] when an Appshell component is loaded. See the examples for a use case.

Sample appshell manifest produced by the appshell generate manifest function:

{
  "remotes": {
    "CraModule/App": {
      "id": "3eb81a0c",
      "url": "http://localhost:3001/remoteEntry.js",
      "scope": "CraModule",
      "module": "./App",
      "metadata": {
        "route": "/cra",
        "displayName": "Example App",
        "displayGroup": "main",
        "order": 10,
        "icon": "ViewList"
      }
    },
    "VanillaModule/Vanilla": {
      "id": "8232ce86",
      "url": "http://localhost:3002/remoteEntry.js",
      "scope": "VanillaModule",
      "module": "./Vanilla",
      "metadata": {
        "route": "/vanilla",
        "displayName": "Example React App",
        "displayGroup": "main",
        "order": 10,
        "icon": "ViewList"
      }
    }
  },
  "modules": {
    "Appshell": {
      "name": "Appshell",
      "shared": {
        "react": {
          "singleton": true,
          "requiredVersion": "^18.2.0"
        },
        "react-dom": {
          "singleton": true,
          "requiredVersion": "^18.2.0"
        }
      }
    },
    "CraModule": {
      "exposes": {
        "./App": "./src/App"
      },
      "filename": "remoteEntry.js",
      "name": "CraModule",
      "shared": {
        "react": {
          "singleton": true,
          "requiredVersion": "^18.2.0"
        },
        "react-dom": {
          "singleton": true,
          "requiredVersion": "^18.2.0"
        }
      }
    },
    "VanillaModule": {
      "exposes": {
        "./Vanilla": "./src/App"
      },
      "filename": "remoteEntry.js",
      "name": "VanillaModule",
      "shared": {
        "react": {
          "singleton": true,
          "requiredVersion": "^18.2.0"
        },
        "react-dom": {
          "singleton": true,
          "requiredVersion": "^18.2.0"
        }
      }
    }
  },
  "environment": {
    "CraModule": {
      "RUNTIME_ARG_1": "Foo",
      "RUNTIME_ARG_2": "Biz"
    },
    "VanillaModule": {
      "RUNTIME_ARG_1": "Bar"
    }
  }
}

This appshell manifest is registered with APPSHELL_REGISTRY and subsequently consumed by the Appshell host.

Register a manifest

Register one or more appshell manifests with the global registry.

appshell register

Register one or more appshell manifests

Options:
      --help      Show help                                            [boolean]
      --version   Show version number                                  [boolean]
  -m, --manifest  One or more manifests to register                      [array]
  -r, --registry  Registry path for the appshell manifests
                                         [string] [default: "appshell_registry"]

Generate runtime env

Generates a runtime env js file that can be consumed by the application at runtime.

appshell generate env

Generate the runtime environment js file that reflects the current process.env

Options:
      --help     Show help                                                  [boolean]
      --version  Show version number                                        [boolean]
  -e, --env      The .env file to process                                   [string] [default: ".env"]
  -o, --outDir   Output location for the appshell environment js             [string] [default: "."]
  -f, --outFile  Output filename for the appshell environment js             [string] [default: "appshell.env.js"]
  -p, --prefix   Only capture environment variables that start with prefix  [string] [default: ""]
  -g, --globalName     Global variable name window[globalName] used in the output js    [string] [default: "__appshell_env__"]

Sample usage

appshell generate env -e .env --prefix APPSHELL_ --outDir dist

Sample output appshell.env.js

window.__appshell_env__ = {
  APPSHELL_VAR_1 = 'val 1',
  APPSHELL_VAR_2 = 'val 2'
};

Include in the public html

<script src="appshell.env.js"></script>