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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
92
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
90
Agentic UI
manfredsteyer
PRO
0
140
Signal Forms: Beyond the Basics @ngBaguette 2026 in Paris
manfredsteyer
PRO
0
240
Agentic UI beyond Chats Architecture Patterns & Open Standards @ngMunich 05/2026
manfredsteyer
PRO
0
220
Agentic AI in the Frontend: Architectures with Open Standards @iJS London 2026
manfredsteyer
PRO
0
150
Agentic AI & UI: Arcitecture, HITL, Emerging Standards
manfredsteyer
PRO
0
170
Agentic UI Requires Standards: AG-UI, A2UI, and MCP Apps Work Together @Angular London
manfredsteyer
PRO
1
97
Signal Forms: Beyond the Basics @ngBelgrade 2026
manfredsteyer
PRO
0
220
Other Decks in Programming
See All in Programming
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.6k
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
120
運用エージェントは "作る" から "育てる" へ - 記憶と自己進化の3層設計パターン / self-evolving-agents-three-layer-agent-design
gawa
12
3.6k
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
200
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
350
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
240
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
0
220
net-httpのHTTP/2対応について
naruse
0
470
AI時代のUIはどこへ行く?その2!
yusukebe
21
7k
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
20
6.5k
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
190
JavaDoc 再入門
nagise
0
320
Featured
See All Featured
Faster Mobile Websites
deanohume
310
31k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
130
Are puppies a ranking factor?
jonoalderson
1
3.5k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
Paper Plane (Part 1)
katiecoart
PRO
0
8.8k
Rails Girls Zürich Keynote
gr2m
96
14k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Navigating Team Friction
lara
192
16k
YesSQL, Process and Tooling at Scale
rocio
174
15k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
[SF Ruby Conf 2025] Rails X
palkan
2
1.1k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
540
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