Skip to content

Latest commit

 

History

History
37 lines (22 loc) · 2.86 KB

0003-fedx-scripts-serve.md

File metadata and controls

37 lines (22 loc) · 2.86 KB

Serving production Webpack builds locally with fedx-scripts

Summary

The build-and-deploy process for micro-frontends (MFEs) throughout Open edX include running the MFE through a production Webpack build process, relying on configuration specified in a webpack.prod.config.js file. The resulting file assets are what ultimately get released to production and served to users. However, it is currently non-obvious how to preview the production file assets generated by npm run build locally should the need arise (e.g., to have more confidence in the resulting Webpack output and/or behavior before relying on the build-and-deploy process to release to a staging/production environment).

Context

Most micro-frontends (MFEs) throughout the Open edX platform rely on a npm run build script that runs a production Webpack build based on the configuration specified in a webpack.prod.config.js file. The webpack-prod.config.js may be provided either by consumers in the root of their MFE's repository (i.e., typically using createConfig to extend/override parts of the default production Webpack configuration), or simply rely on the default webpack.prod.config.js configuration file provided by @edx/frontend-build.

The output from npm run build is generated in a Git-ignored dist directory, and contains the actual files that should be deployed to production.

Included in the dist directory's files is the MFE's index.html file that needs to be served for all routes the user may try loading. By simply loading index.html in the browser, it will inevitably run into some issues (e.g., not supporting React routing, etc.).

To mitigate this, this ADR describes a new mechanism to provide a standard, documented way to serve the generated assets from the production Webpack build when running npm run build.

Decision

We will create a new serve command for fedx-scripts that creates an Express.js server to run the generated dist file assets (e.g., index.html) on the PORT specified in the MFE's env.config.js and/or .env.development|private file(s) on localhost.

If no env.config.js and/or .env.development|private file(s) exist and/or no PORT setting is specified those files, the serve command will fallback to a default port 8080, which is similar to the default ports our typical example MFE applications use.

Implementation

The new serve command will live as under a new scripts directory under lib.

Once in place, a MFE application may add a serve script to its NPM scripts in the package.json file:

{
    "scripts": {
        "serve": "fedx-scripts serve"
    }
}

Then, running npm run serve in the root of that MFE application will run the new serve command in @edx/frontend-build, serving the assets in the MFE's dist directory on the PORT specified in the env.config.js file or .env.development|private file(s).