SlideShare a Scribd company logo
Technology agnostic
microservices at SPA frontend
Vladlen Fedosov, Director of R&D @Namecheap, Inc
Mmm... Listen talk or check Instagram? 🤔
● What are microservices at Frontend and why you need to be aware?
● Possible approaches overview. Pros/Cons
● Working solution overview
● Extra tips & tricks from our experience
Vlad Fedosov
Director of R&D @Namecheap
TL;DR:
● 10 years in the industry
● Went path from Junior to Architect
● Use JS since Mootools era
● Amateur DevOps evangelist
● AWS ninja
● Believe in self-organized, cross-functional teams
“Opening the door for everyone to
a free and open Internet”
Do we have an issue here?
Problem statement...
What are Microservices?
Microservices - also known as the microservice architecture - is an architectural
style that structures an application as a collection of services that are
● Highly maintainable and testable
● Loosely coupled
● Independently deployable
● Organized around business capabilities
● Owned by a small team
What are Microservices?
Ok, got it! But what about
frontend?
JSFest 2019: Technology agnostic microservices at SPA frontend
Meet “Micro Frontends”
In short: they are Microservices architecture that was adopted for UI needs
To be more specific:
Think about web app as a composition of features which are owned by
independent teams. Each team has a distinct area of business or mission it cares
about and specialises in. A team is cross functional and develops its features
end-to-end, from database to user interface.
JSFest 2019: Technology agnostic microservices at SPA frontend
What are Micro Frontends?
Do I need Micro Fragments in my project?
No, unless:
● You have several cross-functional teams working on the same frontend app.
And they want:
○ Independent development lifecycle
○ Independent releases
○ Calm sleep at night w/o a chance of their functionality being broken by other team’s release
● You’re working on a huge enterprise app and want to get out of the golden
cage of your outdated framework.
● Bring your own case 🙋‍♂
Page (re-)composition
JSFest 2019: Technology agnostic microservices at SPA frontend
What is page composition?
Fragment 1
Fragment 2
Fragment 3
Layout
What is page composition?
Fragment 1
Fragment 2
Fragment 3
First request,
composition may
happen at
client/server side
What is page re-composition?
Different app
was loaded
State
change
2nd request,
re-composition at
client/server side
What are the options we have?
Available approaches
1. Support 1 framework, break code onto NPM modules (static/lazy loading)
2. Support multiple frameworks and
a. compose page at server side
b. compose page at client side
c. compose page at server & client side
JSFest 2019: Technology agnostic microservices at SPA frontend
Available approaches
Approach / Criteria Technology
agnostic
Code isolation SEO/SM-bots
compatible (SSR)
UX Level
1 Framework, NPM
modules
❌ Limited ✅ ✅
X Frameworks,
client side composition
✅ ✅ ❌ Limited
(longer initial load)
X Frameworks,
server side composition
✅ ✅ ✅ Limited (need to reload
page for re-composition)
X Frameworks,
isomorphic composition
✅ ✅ ✅ ✅
Let’s see what we have in
production nowadays
Our next-gen solution overview:
“Isomorphic Layout Composer”
⚠ DEMO TIME ⚠
Core technologies we used
Zalando Tailor
single-spa - JS framework for Micro Frontends
We need to go deeper...
Challenges we faced with
● Page composition & re-composition
● Routing & page transition
● Micro Frontends registry
● Dynamic code loading & updating
● SSR support
● Error reporting
● Cross-fragment communication
● Code isolation
● Guardrails
Overall architecture - System (high level)
Registry
Client Server
Router
Layout composer
(Tailor)
MS 1
MS 2
MS X
UI composition layer
(single-spa)
Template
engine
Overall architecture - Micro Frontend
App
Shared
Code
client.js
mount()
unmount()
server.js
config ←
Business logic
Client side bundle
Server bundle
Assets
Server runner
Server API
CDN
Challenges - Code Isolation
Simple rules for micro-frontend developers:
● No “window” modification, no global variables
● No DOM modifications outside assigned container
● No shared CSS, apps use Scoped CSS only
● No shared state, apps can communicate only via events
Real experience: we banned Angular as it was patching “window” & had issues if
you’re running 2+ Angular apps on the same page
Challenges - Page composition
<html>
<head>
...
</head>
<body>
<slot name="navbar"></slot>
<slot name="body"></slot>
<slot name="footer"></slot>
</body>
</html>
Challenges - Registry
Holds info about:
● Apps
● Routes
● Templates
apps: {
"@portal/news": {
spaBundle: "http://127.0.0.1:3000/dist/single_spa.js",
cssBundle: "http://127.0.0.1:3000/dist/21f11a2afc03af3d62f8.css",
ssr: { // Optional. If omitted - no rendering will be done at the server side
src: "http://localhost:3000/news/?fragment=1",
},
},
},
templates: { master: "master.template.html" },
routes: [ // Express like routes, matched in order of appearance
{
route: "/news/*",
template: "master",
slots: {
navbar: { appName: "@portal/navbar" },
body: { appName: "@portal/news" },
}
}
]
Challenges - Routing & page transition
/news/latest
Global Router: /news/*
App Router: /latest
/latest
Rule: MF App is aware about it’s own routes only.
Implementation: 2-tiered router
Challenges - Routing & page transition
But how app A can perform transition to the view within app B?
It’s simple - use built in capabilities of your framework. Nothing changes.
1. User clicks link
2. App A framework invokes history.pushState()
3. ILC listens for 'hashchange', 'popstate' & “<a>” click events
4. ILC checks if any changes to the set of the apps visible on a page needed
5. ILC performs unmounting of the old apps & mounts new ones
Challenges - Dynamic code loading
Solution of choice: SystemJS , every App should be built as AMD/SystemJS
bundle & registered in the registry.
It will be loaded as soon as it will be requested by the Global Router or as explicit
dependency in code:
● Webpack “externals”
● System.import('react')
<script type="systemjs-importmap">
{
"imports": {
"@portal/news":"http://127.0.0.1:3000/index.js",
"react": "https://cdnjs.cloudflare.com/.../index.js"
}
}
</script>
Few more advanced things...
Deploy/Rollback
We have two challenges here:
● Notify ILC about new versions of our fragments
● Synchronize versions of the code at server (SSR) & client (Browser)
But how can we solve them?
Deploy/Rollback - Notification
● Make API call to the Registry after deployment to CDN but before server
update
● Use version discovery mechanism. Example:
○ Keep metadata file at CDN with disabled HTTP cache & update it after deploy.
{
"spaBundle": "https://my-cdn.com/app-name/main.c02de4198cc732e5797a.js",
"cssBundle": "https://my-cdn.com/app-name/main.c02de4198cc732e5797a.css",
"dependencies": {
"react": "https://my-cdn.com/app-name/react.v16.0.1.js"
}
}
Deploy/Rollback - Synchronize versions
Registry
App 1: v2
ILC
App 1: v2
ILC
App 1: v1
App server
v1
App server
v2
Not all ILC instances are in
sync with Registry
App deployment in progress...
Special response header:
x-bundle-overrides
Error reporting
1. Use framework built-in capabilities, ILC listens at framework error handlers
2. Be prepared for the worst case scenario:
window.addEventListener('error', function(event) {
const moduleInfo = SystemJS.getModuleInfo(event.filename); // <---
if (moduleInfo === null) {
return;
}
event.preventDefault();
console.error( … );
newrelic.noticeError( … ); // Track errors centrally
});
Cross-fragment communication
There are 3 main options:
● Browser events.
● Shared services.
● Shared state. This solution doesn’t impose or restrict shared state between
Micro-Frontends. Bring your own if you need it.
Further improvements
● Integration of the Tailor & single-spa under single tool with unified
client/server API
● Template transition handling
● LDE improvements for our engineers
● Automated tests
● Documentation, documentation, documentation...
● Built-in monitoring
● Fragment inside fragment (parcels)
Vlad Fedosov
Director of R&D
@Namecheap, Inc
vlad.fedosov@gmail.com
Slides:
Or just scan it:
bit.ly/2BRrn8V
Source
code:
github.com/StyleT/icl

More Related Content

PPTX
JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...
PPTX
Reactjs Introduction - Virtual DOM
PPTX
Building single page applications
PPTX
Single Page Application (SPA) using AngularJS
PPTX
Build web apps with react js
PDF
Angular 2 vs React. What to chose in 2017?
PDF
Story about module management with angular.js
PDF
The complete-beginners-guide-to-react dyrr
JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...
Reactjs Introduction - Virtual DOM
Building single page applications
Single Page Application (SPA) using AngularJS
Build web apps with react js
Angular 2 vs React. What to chose in 2017?
Story about module management with angular.js
The complete-beginners-guide-to-react dyrr

What's hot (20)

PDF
Web Components and PWA
PDF
Intro to vue.js
PPTX
React js, node js &amp; angular js which one is the best for web development
PPT
Top java script frameworks ppt
PDF
Setup ColdFusion application using fusebox mvc architecture
PDF
AngularJS + React
PPTX
Arkhitech - who we are and what we do
PDF
Angular 1.x reloaded: improve your app now! and get ready for 2.0
PDF
Refactoring to a Single Page Application
PPTX
Mvvm knockout vs angular
PPTX
Gwt ppt
PPT
JAVA SCRIPT
ODP
9 Useful Things that Every Web Developer Needs to Know
PPTX
Web Performance & Latest in React
PPTX
PWA basics for developers
ODP
A Good PHP Framework For Beginners Like Me!
PDF
Angular 2 vs React
PDF
Frontend microservices: architectures and solutions
PDF
ReactJS or Angular
PDF
Overview of React.JS - Internship Presentation - Week 5
Web Components and PWA
Intro to vue.js
React js, node js &amp; angular js which one is the best for web development
Top java script frameworks ppt
Setup ColdFusion application using fusebox mvc architecture
AngularJS + React
Arkhitech - who we are and what we do
Angular 1.x reloaded: improve your app now! and get ready for 2.0
Refactoring to a Single Page Application
Mvvm knockout vs angular
Gwt ppt
JAVA SCRIPT
9 Useful Things that Every Web Developer Needs to Know
Web Performance & Latest in React
PWA basics for developers
A Good PHP Framework For Beginners Like Me!
Angular 2 vs React
Frontend microservices: architectures and solutions
ReactJS or Angular
Overview of React.JS - Internship Presentation - Week 5
Ad

Similar to JSFest 2019: Technology agnostic microservices at SPA frontend (20)

PPTX
Micro Front Ends : Divided We Rule by Parth Ghiya - AhmedabadJS
PPTX
Micro-Frontends JSVidCon
PDF
OdessaJs 2020 - How to build your first micro frontend in a matter of minutes
PPTX
“Micro Frontends”- You Keep Using That Word, I Don’t Think It Means What You ...
PDF
Front end microservices - October 2019
PDF
Front end microservices: architectures and solution
PDF
'How to build your first micro frontend in a matter of minutes' by Vladlen Fe...
PDF
How to migrate large project from Angular to React
PDF
Ivan Jovanovic - Micro Frontends - Codemotion Rome_2019
PPTX
Building applications in a Micro-frontends way
PDF
"Micro-frontends from A to Z. How and Why we use Micro-frontends in Namecheap...
PDF
Micro Frontends in Action 1st Edition Michael Geers
PDF
Micro Frontends in Action 1st Edition Michael Geers
PPTX
Building Microtrends With React
PDF
Scaling frontend applications with micro-frontends Presentation.pdf
PDF
Performance and Scalability Art of Isomorphic React Applications
PDF
micro-frontends-with-vuejs
PPTX
'MICROFRONTENDS WITH REACT' by Liliia Karpenko
PDF
Micro frontends
PDF
Node.js BFFs - our way to the better/micro frontends
Micro Front Ends : Divided We Rule by Parth Ghiya - AhmedabadJS
Micro-Frontends JSVidCon
OdessaJs 2020 - How to build your first micro frontend in a matter of minutes
“Micro Frontends”- You Keep Using That Word, I Don’t Think It Means What You ...
Front end microservices - October 2019
Front end microservices: architectures and solution
'How to build your first micro frontend in a matter of minutes' by Vladlen Fe...
How to migrate large project from Angular to React
Ivan Jovanovic - Micro Frontends - Codemotion Rome_2019
Building applications in a Micro-frontends way
"Micro-frontends from A to Z. How and Why we use Micro-frontends in Namecheap...
Micro Frontends in Action 1st Edition Michael Geers
Micro Frontends in Action 1st Edition Michael Geers
Building Microtrends With React
Scaling frontend applications with micro-frontends Presentation.pdf
Performance and Scalability Art of Isomorphic React Applications
micro-frontends-with-vuejs
'MICROFRONTENDS WITH REACT' by Liliia Karpenko
Micro frontends
Node.js BFFs - our way to the better/micro frontends
Ad

Recently uploaded (20)

PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PDF
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
PDF
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
PDF
Digital Strategies for Manufacturing Companies
PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
DOCX
The Five Best AI Cover Tools in 2025.docx
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PPT
JAVA ppt tutorial basics to learn java programming
PDF
Upgrade and Innovation Strategies for SAP ERP Customers
PDF
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
PPTX
Transform Your Business with a Software ERP System
PDF
PTS Company Brochure 2025 (1).pdf.......
PDF
medical staffing services at VALiNTRY
PDF
Softaken Excel to vCard Converter Software.pdf
PPTX
L1 - Introduction to python Backend.pptx
PDF
top salesforce developer skills in 2025.pdf
PPTX
Introduction to Artificial Intelligence
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
Internet Downloader Manager (IDM) Crack 6.42 Build 41
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
Digital Strategies for Manufacturing Companies
How to Migrate SBCGlobal Email to Yahoo Easily
Wondershare Filmora 15 Crack With Activation Key [2025
The Five Best AI Cover Tools in 2025.docx
Design an Analysis of Algorithms II-SECS-1021-03
JAVA ppt tutorial basics to learn java programming
Upgrade and Innovation Strategies for SAP ERP Customers
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
Transform Your Business with a Software ERP System
PTS Company Brochure 2025 (1).pdf.......
medical staffing services at VALiNTRY
Softaken Excel to vCard Converter Software.pdf
L1 - Introduction to python Backend.pptx
top salesforce developer skills in 2025.pdf
Introduction to Artificial Intelligence
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free

JSFest 2019: Technology agnostic microservices at SPA frontend

  • 1. Technology agnostic microservices at SPA frontend Vladlen Fedosov, Director of R&D @Namecheap, Inc
  • 2. Mmm... Listen talk or check Instagram? 🤔 ● What are microservices at Frontend and why you need to be aware? ● Possible approaches overview. Pros/Cons ● Working solution overview ● Extra tips & tricks from our experience
  • 3. Vlad Fedosov Director of R&D @Namecheap TL;DR: ● 10 years in the industry ● Went path from Junior to Architect ● Use JS since Mootools era ● Amateur DevOps evangelist ● AWS ninja ● Believe in self-organized, cross-functional teams
  • 4. “Opening the door for everyone to a free and open Internet”
  • 5. Do we have an issue here? Problem statement...
  • 6. What are Microservices? Microservices - also known as the microservice architecture - is an architectural style that structures an application as a collection of services that are ● Highly maintainable and testable ● Loosely coupled ● Independently deployable ● Organized around business capabilities ● Owned by a small team
  • 8. Ok, got it! But what about frontend?
  • 10. Meet “Micro Frontends” In short: they are Microservices architecture that was adopted for UI needs To be more specific: Think about web app as a composition of features which are owned by independent teams. Each team has a distinct area of business or mission it cares about and specialises in. A team is cross functional and develops its features end-to-end, from database to user interface.
  • 12. What are Micro Frontends?
  • 13. Do I need Micro Fragments in my project? No, unless: ● You have several cross-functional teams working on the same frontend app. And they want: ○ Independent development lifecycle ○ Independent releases ○ Calm sleep at night w/o a chance of their functionality being broken by other team’s release ● You’re working on a huge enterprise app and want to get out of the golden cage of your outdated framework. ● Bring your own case 🙋‍♂
  • 16. What is page composition? Fragment 1 Fragment 2 Fragment 3 Layout
  • 17. What is page composition? Fragment 1 Fragment 2 Fragment 3 First request, composition may happen at client/server side
  • 18. What is page re-composition? Different app was loaded State change 2nd request, re-composition at client/server side
  • 19. What are the options we have?
  • 20. Available approaches 1. Support 1 framework, break code onto NPM modules (static/lazy loading) 2. Support multiple frameworks and a. compose page at server side b. compose page at client side c. compose page at server & client side
  • 22. Available approaches Approach / Criteria Technology agnostic Code isolation SEO/SM-bots compatible (SSR) UX Level 1 Framework, NPM modules ❌ Limited ✅ ✅ X Frameworks, client side composition ✅ ✅ ❌ Limited (longer initial load) X Frameworks, server side composition ✅ ✅ ✅ Limited (need to reload page for re-composition) X Frameworks, isomorphic composition ✅ ✅ ✅ ✅
  • 23. Let’s see what we have in production nowadays
  • 24. Our next-gen solution overview: “Isomorphic Layout Composer”
  • 28. single-spa - JS framework for Micro Frontends
  • 29. We need to go deeper...
  • 30. Challenges we faced with ● Page composition & re-composition ● Routing & page transition ● Micro Frontends registry ● Dynamic code loading & updating ● SSR support ● Error reporting ● Cross-fragment communication ● Code isolation ● Guardrails
  • 31. Overall architecture - System (high level) Registry Client Server Router Layout composer (Tailor) MS 1 MS 2 MS X UI composition layer (single-spa) Template engine
  • 32. Overall architecture - Micro Frontend App Shared Code client.js mount() unmount() server.js config ← Business logic Client side bundle Server bundle Assets Server runner Server API CDN
  • 33. Challenges - Code Isolation Simple rules for micro-frontend developers: ● No “window” modification, no global variables ● No DOM modifications outside assigned container ● No shared CSS, apps use Scoped CSS only ● No shared state, apps can communicate only via events Real experience: we banned Angular as it was patching “window” & had issues if you’re running 2+ Angular apps on the same page
  • 34. Challenges - Page composition <html> <head> ... </head> <body> <slot name="navbar"></slot> <slot name="body"></slot> <slot name="footer"></slot> </body> </html>
  • 35. Challenges - Registry Holds info about: ● Apps ● Routes ● Templates apps: { "@portal/news": { spaBundle: "http://127.0.0.1:3000/dist/single_spa.js", cssBundle: "http://127.0.0.1:3000/dist/21f11a2afc03af3d62f8.css", ssr: { // Optional. If omitted - no rendering will be done at the server side src: "http://localhost:3000/news/?fragment=1", }, }, }, templates: { master: "master.template.html" }, routes: [ // Express like routes, matched in order of appearance { route: "/news/*", template: "master", slots: { navbar: { appName: "@portal/navbar" }, body: { appName: "@portal/news" }, } } ]
  • 36. Challenges - Routing & page transition /news/latest Global Router: /news/* App Router: /latest /latest Rule: MF App is aware about it’s own routes only. Implementation: 2-tiered router
  • 37. Challenges - Routing & page transition But how app A can perform transition to the view within app B? It’s simple - use built in capabilities of your framework. Nothing changes. 1. User clicks link 2. App A framework invokes history.pushState() 3. ILC listens for 'hashchange', 'popstate' & “<a>” click events 4. ILC checks if any changes to the set of the apps visible on a page needed 5. ILC performs unmounting of the old apps & mounts new ones
  • 38. Challenges - Dynamic code loading Solution of choice: SystemJS , every App should be built as AMD/SystemJS bundle & registered in the registry. It will be loaded as soon as it will be requested by the Global Router or as explicit dependency in code: ● Webpack “externals” ● System.import('react') <script type="systemjs-importmap"> { "imports": { "@portal/news":"http://127.0.0.1:3000/index.js", "react": "https://cdnjs.cloudflare.com/.../index.js" } } </script>
  • 39. Few more advanced things...
  • 40. Deploy/Rollback We have two challenges here: ● Notify ILC about new versions of our fragments ● Synchronize versions of the code at server (SSR) & client (Browser) But how can we solve them?
  • 41. Deploy/Rollback - Notification ● Make API call to the Registry after deployment to CDN but before server update ● Use version discovery mechanism. Example: ○ Keep metadata file at CDN with disabled HTTP cache & update it after deploy. { "spaBundle": "https://my-cdn.com/app-name/main.c02de4198cc732e5797a.js", "cssBundle": "https://my-cdn.com/app-name/main.c02de4198cc732e5797a.css", "dependencies": { "react": "https://my-cdn.com/app-name/react.v16.0.1.js" } }
  • 42. Deploy/Rollback - Synchronize versions Registry App 1: v2 ILC App 1: v2 ILC App 1: v1 App server v1 App server v2 Not all ILC instances are in sync with Registry App deployment in progress... Special response header: x-bundle-overrides
  • 43. Error reporting 1. Use framework built-in capabilities, ILC listens at framework error handlers 2. Be prepared for the worst case scenario: window.addEventListener('error', function(event) { const moduleInfo = SystemJS.getModuleInfo(event.filename); // <--- if (moduleInfo === null) { return; } event.preventDefault(); console.error( … ); newrelic.noticeError( … ); // Track errors centrally });
  • 44. Cross-fragment communication There are 3 main options: ● Browser events. ● Shared services. ● Shared state. This solution doesn’t impose or restrict shared state between Micro-Frontends. Bring your own if you need it.
  • 45. Further improvements ● Integration of the Tailor & single-spa under single tool with unified client/server API ● Template transition handling ● LDE improvements for our engineers ● Automated tests ● Documentation, documentation, documentation... ● Built-in monitoring ● Fragment inside fragment (parcels)
  • 46. Vlad Fedosov Director of R&D @Namecheap, Inc vlad.fedosov@gmail.com Slides: Or just scan it: bit.ly/2BRrn8V Source code: github.com/StyleT/icl