Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
5 Steps to Your Frankenstein Micro Frontends
Search
Manfred Steyer
PRO
February 10, 2022
Programming
590
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
5 Steps to Your Frankenstein Micro Frontends
Manfred Steyer
PRO
February 10, 2022
More Decks by Manfred Steyer
See All by Manfred Steyer
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
370
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
0
170
Nostalgia Meets Technology: Super Mario with TypeScript
manfredsteyer
PRO
0
250
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
270
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
180
Agentic UI
manfredsteyer
PRO
0
280
Signal Forms: Beyond the Basics @ngBaguette 2026 in Paris
manfredsteyer
PRO
0
320
Agentic UI beyond Chats Architecture Patterns & Open Standards @ngMunich 05/2026
manfredsteyer
PRO
0
270
Agentic AI in the Frontend: Architectures with Open Standards @iJS London 2026
manfredsteyer
PRO
0
200
Other Decks in Programming
See All in Programming
yield再入門 #phpcon
o0h
PRO
0
1.1k
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
270
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
700
the container ship “Apple Silicon”@WWDC26 Recap -Japan-\(region).swift
shingangan
0
130
数百円から始めるRuby電子工作
tarosay
0
160
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
160
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
800
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
520
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
230
Google Apps Script で Ruby を動かす
kawahara
0
270
仕様駆動開発の消費期限
watany
20
8.6k
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
500
Featured
See All Featured
Deep Space Network (abreviated)
tonyrice
0
260
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
340
The Cost Of JavaScript in 2023
addyosmani
55
10k
Statistics for Hackers
jakevdp
799
230k
Paper Plane
katiecoart
PRO
2
53k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
490
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.8k
Google's AI Overviews - The New Search
badams
0
1.1k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
490
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.2k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
The untapped power of vector embeddings
frankvandijk
2
1.8k
Transcript
@ManfredSteyer ManfredSteyer 5 Steps to Your Frankenstein Micro Frontends Manfred
Steyer, ANGULARarchitects.io
@ManfredSteyer Egg-Laying Woolly Milk Pig (German Metaphor)
@ManfredSteyer Booking App Booking App Check-in App Check-in App Boarding
App Boarding App Luggage App Luggage App Micro Frontends
@ManfredSteyer
@ManfredSteyer
@ManfredSteyer Booking App Booking App Check-in App Check-in App Boarding
App Boarding App Luggage App Luggage App One Reason: Migrating Step by Step (1) (1) (2+) (2+)
@ManfredSteyer Booking App Booking App Check-in App Check-in App Boarding
App Boarding App Luggage App Luggage App Onother Reason: Merger
@ManfredSteyer
@ManfredSteyer Contents #1: Module Federation 101 #2: Loading several SPAs
#3: 5 Steps to Your Solution
@ManfredSteyer Manfred Steyer
@ManfredSteyer
@ManfredSteyer Idea const Component = await import('other-app/comp')
@ManfredSteyer Webpack 5 Module Federation Shell (Host) Microfrontend (Remote) //
Maps Urls in // webpack config remotes: { mfe1: "http://..." } // Expose files in // webpack config exposes: { './Cmp': './my.cmp.ts' } import('mfe1/Cmp')
@ManfredSteyer How to Share Libs? Shell (Host) Microfrontend (Remote) shared:
[ "@angular/core", "…" ] shared: [ "@angular/core", "…" ]
@ManfredSteyer ❤️
@ManfredSteyer await import('other-app/main'); const rootElm = document.createElement('my-element') document.body.appendChild(rootElm); WrapperComponent It's
a bit easier if this is a web component
@ManfredSteyer The Best of Both Worlds
@ManfredSteyer https://red-ocean-0fe4c4610.azurestaticapps.net
@ManfredSteyer Free eBook ANGULARarchitects.io/book Updated for Module Federation and Alternatives
@ManfredSteyer
@ManfredSteyer Some Ugly Pitfalls and Workarounds Multiple Routers Bundle Size
Cache Angular Platform Zone.js
@ManfredSteyer Further Reading on Tricky Details etc.
@ManfredSteyer
@ManfredSteyer // webpack.config.js in Micro Frontend plugins: [ new ModuleFederationPlugin({
name: "react", filename: "remoteEntry.js", exposes: { './web-components': './app.js', }, shared: ["react", "react-dom"] }), ]
@ManfredSteyer // Routing Config in Shell { //path: 'react', matcher:
startsWith('react'), component: WebComponentWrapper, data: { type: 'script', remoteEntry: 'https://[…]/remoteEntry.js', remoteName: 'react', exposedModule: './web-components', elementName: 'react-element' } as WebComponentWrapperOptions },
@ManfredSteyer // Path Matcher in both, Shell and Micro Frontends
{ //path: 'react', matcher: startsWith('react'), component: WebComponentWrapper, data: { type: 'script', remoteEntry: 'https://[…]/remoteEntry.js', remoteName: 'react', exposedModule: './web-components', elementName: 'react-element' } as WebComponentWrapperOptions },
@ManfredSteyer // Bootstrapping in both, Shell and Micro Frontends bootstrap(AppModule,
{ production: environment.production });
@ManfredSteyer // app.component.ts // Make shell share zone.js shareNgZone(ngZone); //
Only needed in MFEs: connectRouter(router);
@ManfredSteyer const sharedMappings = new mf.SharedMappings(); sharedMappings.register( path.join(__dirname, '../../tsconfig.json'), ['@my-project/local-lib-in-monorepo'],
@ManfredSteyer https://github.com/manfredsteyer/react-app
@ManfredSteyer
@ManfredSteyer // Path Matcher in both, Shell and Micro Frontends
{ //path: 'react', matcher: startsWith('react'), component: WebComponentWrapper, data: { type: 'script', remoteEntry: 'https://[…]/remoteEntry.js', remoteName: 'react', exposedModule: './web-components', elementName: 'react-element' } as WebComponentWrapperOptions },
@ManfredSteyer You Need a Good Reason! Module Federation: Sharing Code
Web Components: Hiding Frameworks and Versions
@ManfredSteyer Take Care of the Egg-Laying Woolly Milk Pig!
@ManfredSteyer d Slides & Examples Remote Company Workshops and Consulting
http://angulararchitects.io