Building A Micro Frontend Consuming A Design System | Part 3
Learn how to create a react application that consumes the design system.
This blogpost is a part of the "Building Design System and Micro Frontends" series. For more content, read the first post and the second post. The source code for all parts of this series can be found in this GitHub repository.
In this part, we will create a react application that consumes the design system. The app will have the capability to display itself as a standalone app or as a micro frontend in shell application.
Developing a React App with Mounting Capabilities
The idea here is to create a react app that does not automatically mount to DOM but rather assigns two functions mount and unmount to a property on the window object. The page that wants to display this app will call mount function and give it a host DOMElment plus some configuration. In our case, the configuration will be one property isStandAlone that will indicate if the app should display its own shell or as embedded micro fronted. We will also create an `index.html` file which will be deployed along with the application. If someone tries to access our app directly, the server will serve index.html. HTML will contain a small script that will set up our app in stand-alone mode.
Creating the Nutrition Portal Directory
Create directory nutrition-portal in the same folder as design-systme (next to each other).
Setting Up Project Dependencies
Run following commands from nutrition-portal directory to setup project dependencies:
Create file ./src/App.js with the following content:
import React from "react";
import from "react-hot-loader/root";
import from "../../design-system/dist/main";
import "../../design-system/dist/main.css";
class App extends React.Component {
render() {
return (
);
}
}
export default hot(App);
Make sure paths in lines 3 and 4 are reflecting where you placed your design system.
Create file ./src/index.js with the following content:
import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
function mount(mountNode, args) {
ReactDOM.render(, mountNode);
}
function unmount(mountNode) {
let res = ReactDOM.unmountComponentAtNode(mountNode);
}
window.nutritionPortalMount = mount;
window.nutritionPortalUnmount = unmount;
./src/index.js will be our entry point. The important part here is that it is not rendering our react app but rather defines two functions for mounting and unmounting our app. At the end mount and unmount functions are assigned to a property on window object.
Create file ./src/index.html with the following content:
After deployment, if anyone hits the correct domain he will see this micro frontend rendered in standalone mode. A little script at the end of body will mount application to the div. We also pass arguments to the app making clear it should render with its own shell.
Create file ./webpack.config.js with the following content:
You can run the application in stand-mode by running npm start; it should bind to port 7001. Open http://localhost:7001. You should see something like this:
For the other micro frontends you can repeat the setup or simply copy this application and change the following things in the copy:
The application package name in package.json (property name at the top of the file). This is important for webpack. You won't be able to load two micro frontends with the same package name in one shell application.
Port number in webpack.config.js (the setting is in devServer section, line 45)
The name of mount and unmount functions in ./src/index.js (lines 13,14)
The name of mount function in ./src/index.html (line 13)
Micro frontend name in the App.js (label of the button, line 11).
In the repository with the code for this series I created additional copies: exercise-portal, meals-planner-portal, and recipes-portal.
What´s next?
In the next post, we will integrate micro frontends inside the shell application. It will be the last post in this series.
Bleiben Sie mit dem TIMETOACT GROUP Newsletter auf dem Laufenden!
Wir verwenden Cookies
Um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Außerdem geben wir Informationen zu Ihrer Verwendung unserer Website an unsere Partner für soziale Medien, Werbung und Analyse weiter. Unsere Partner führen diese Informationen möglicherweise mit weiteren Daten zusammen, die Sie ihnen bereitgestellt haben oder die sie im Rahmen Ihrer Nutzung der Dienste gesammelt haben. Dies schließt gegebenenfalls die Verarbeitung Ihrer Daten in den USA ein.
Weitere Informationen zu Cookies erhalten Sie in unserem Datenschutzhinweis