JavaScript 04: MicroFrontEnds
Docs
https://turborepo.com/
https://turborepo.com/docs
https://module-federation.io/
https://webpack.js.org/concepts/module-federation/
https://storybook.js.org/
https://storybook.js.org/docs
Micro-frontend architecture
Architectural approach where a frontend application is broken into smaller, independent pieces, each owned and developed by different teams, and then composed together to form a complete app.
Key Characteristics:
Each micro-frontend is a self-contained app (e.g., header, search bar, dashboard).
Built using the same or different frameworks (React, Vue, etc.).
Integrated into a host app (shell) at runtime or build time.
Why micro-frontend architecture?
Development Speed: work in parallel, and deploy independently.
Independent deployments
Better team autonomy
Easier code ownership
Scales well for large apps
Module Federation
Multiple separate builds form a single application.
These separate builds act like containers and can expose and consume code among themselves, creating a single, unified application.
Each build acts as a container and also consumes other builds as containers.
This way, each build is able to access any other exposed module by loading it from its container.
Use Cases For Module Federation
Separate builds per page
Components library as container
Module Federation Setup In Webpack
c.f. Webpack notes
Turborepo
Solves your monorepo's scaling problem.
High-performance build system for monorepos in JavaScript and TypeScript.
Developed by Vercel.
Makes managing and building monorepos faster and smarter by:
Caching builds
Running tasks in parallel
Skipping work that hasn’t changed
Deets:
Remote Cache stores the result of all your tasks, meaning that your CI never needs to do the same work twice.
Additionally, task scheduling can be difficult in a monorepo. You may need to build, then test, then lint...
Turborepo schedules your tasks for maximum speed, parallelizing work across all available cores.
What Is a Monorepo?
A monorepo is a single codebase (repository) that contains multiple projects or packages i.e. a frontend app, backend service, and shared libraries.
Storybook
Frontend workshop for building UI components and pages in isolation.
A sandbox to render components without interference - i.e. from app business logic or context.
Develop and share hard-to-reach states and edge cases - without the need to run your whole app.
Focus development on each variation of a component, even the hard-to-reach edge cases.
Build complex UIs with many requirements and countless UI variations:
devices
browsers
accessibility
performance
async states
cd apps
npx create-react-app design-system
cd design-system
npx storybook init
what configuration should we install? -> RECOMMENDED # If everything goes well, it automatically opens http://localhost:6006/
npm install -D @storybook/react@^9.0.15
npx build-storybook --version # to check build-storybook
works properly
npm install -D @storybook/cli@^9.0.15 # install specific version of the cli
npx build-storybook --version
npx storybook@9 init # install specific version of the storybook, matches the version of your dependencies like @storybook/react@^9.0.15.
what configuration should we install? -> RECOMMENDED # If everything goes well, it automatically opens http://localhost:6006/
running npx create-react-app design-system
inside an existing monorepo or Turborepo project, which is not the ideal approach. Here are the steps
cd PROJECT_ROOT
rm -rf apps/design-system # if you already have the folder created
npx create-react-app design-system --template cra-template
mv design-system apps/design-system
Then setup storybook inside that new project:
cd apps/design-system
npx storybook@9 init # install specific version of the storybook, matches the version of your dependencies like @storybook/react@^9.0.15.
what configuration should we install? -> RECOMMENDED # If everything goes well, it automatically opens http://localhost:6006/
npx build-storybook --version # to check build-storybook
works properly
npm install -D @storybook/react@^9.0.15
In apps/design-system/package.json:
"dependencies": { "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0",
"@movie-app/ui": "*", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", "web-vitals": "^2.1.4" },
And in apps/design-system run:
npm install
Test the alias with a small script or check it manually
cd apps/design-system/.storybook/
ls PATH_ENTERED_IN_CONFIG
Make sure the @movie-app/ui package is built:
cd packages/ui
npm run build
cd /Users/adrienberthou/all-that-jazz/reactappsss/week-5-serverless-deployment-0xadri/
npm run build
npm i --omit=dev
mv ./node_modules ./build/node_modules
cp ./.env ./build/.env
cp ./src/middleware/swagger.yaml ./build/middleware/swagger.yaml
cd build && zip -r ../archive14.zip . && cd ..
Last updated