Дослідіть фреймворк single-SPA для створення масштабованих мікрофронтенд-архітектур, які легко підтримувати. Дізнайтесь про його переваги, впровадження та найкращі практики для глобальних команд.
Фреймворк Single-SPA: Комплексний посібник з оркестрації мікрофронтендів
У сучасному світі веб-розробки, що стрімко розвивається, монолітні фронтенди все частіше не встигають за вимогами зростаючих застосунків та розподілених команд. Архітектура мікрофронтендів стала потужним рішенням цих проблем, дозволяючи розробникам створювати складні користувацькі інтерфейси як сукупність незалежних, розгортаних та підтримуваних компонентів. Цей підхід сприяє автономності команд, заохочує повторне використання коду та спрощує загальний процес розробки. Серед різноманітних фреймворків для оркестрації мікрофронтендів single-SPA вирізняється як універсальний та надійний вибір.
Що таке мікрофронтенди?
Мікрофронтенди — це архітектурний стиль, за якого фронтенд-застосунок розбивається на менші, незалежні та самодостатні одиниці (мікрофронтенди). Кожен мікрофронтенд може розроблятися, розгортатися та підтримуватися окремими командами. Уявіть це як композицію з кількох міні-застосунків, що працюють разом для створення цілісного користувацького досвіду.
Ключові характеристики мікрофронтендів:
- Технологічна незалежність: Кожен мікрофронтенд може бути створений з використанням різних фреймворків та технологій (React, Angular, Vue.js тощо)
- Незалежне розгортання: Мікрофронтенди можна розгортати незалежно, не впливаючи на інші частини застосунку.
- Автономні команди: Різні команди можуть володіти та підтримувати різні мікрофронтенди, що сприяє автономності та швидшим циклам розробки.
- Повторне використання коду: Спільні компоненти та бібліотеки можуть використовуватися в різних мікрофронтендах.
- Покращена масштабованість та підтримка: Менші, незалежні одиниці легше масштабувати, підтримувати та оновлювати порівняно з великим монолітним застосунком.
Чому варто обрати Single-SPA?
Single-SPA — це JavaScript-фреймворк, який спрощує оркестрацію кількох JavaScript-застосунків (мікрофронтендів) на одній веб-сторінці. Він не нав'язує жодного конкретного технологічного стеку для самих мікрофронтендів, дозволяючи командам обирати інструменти, що найкраще відповідають їхнім потребам. Цей фреймворк діє як мета-фреймворк, забезпечуючи інфраструктуру для завантаження, вивантаження та управління життєвим циклом різних мікрофронтендів.
Ось чому single-SPA є популярним вибором для оркестрації мікрофронтендів:
- Незалежність від фреймворків: single-SPA можна використовувати практично з будь-яким JavaScript-фреймворком, включаючи React, Angular, Vue.js, Svelte та інші. Ця гнучкість дозволяє командам впроваджувати мікрофронтенди поступово, не переписуючи існуючі застосунки.
- Поступове впровадження: Ви можете поступово переносити монолітний застосунок на архітектуру мікрофронтендів, починаючи з невеликих, ізольованих функцій.
- Спільне використання коду: single-SPA дозволяє спільно використовувати код та залежності між мікрофронтендами, зменшуючи надмірність та покращуючи узгодженість.
- Ліниве завантаження (Lazy Loading): Мікрофронтенди завантажуються за вимогою, що покращує час початкового завантаження сторінки та загальну продуктивність.
- Спрощене розгортання: Незалежне розгортання мікрофронтендів дозволяє прискорити цикли випуску та зменшити ризики.
- Надійне управління життєвим циклом: single-SPA забезпечує чітко визначений життєвий цикл для кожного мікрофронтенду, гарантуючи, що вони належним чином ініціалізуються, монтуються, демонтуються та знищуються.
Ключові концепції Single-SPA
Для ефективного використання single-SPA важливо розуміти його основні концепції:
- Конфігурація Single-SPA (Single-SPA Config): Основний JavaScript-файл, який завантажує застосунок single-SPA. Він відповідає за реєстрацію мікрофронтендів та визначення логіки маршрутизації. Часто він включає кореневий компонент, який керує всім.
- Мікрофронтенди: Незалежні JavaScript-застосунки, зареєстровані в конфігурації single-SPA. Кожен мікрофронтенд відповідає за рендеринг певної частини користувацького інтерфейсу.
- Пакети (Parcels): Компоненти для повторного використання, які можуть бути спільними для мікрофронтендів. Пакети корисні для створення загальних елементів інтерфейсу або бізнес-логіки, яка потрібна в кількох частинах застосунку.
- Коренева конфігурація (Root Config): Основна оболонка застосунку, яка завантажує та оркеструє мікрофронтенди. Вона відповідає за обробку маршрутизації, управління глобальним станом та комунікацію між мікрофронтендами.
- Функції активності (Activity Functions): JavaScript-функції, які визначають, коли мікрофронтенд має бути активним (змонтованим) або неактивним (демонтованим). Зазвичай вони базуються на URL-маршрутах або іншому стані застосунку.
Впровадження Single-SPA: Покроковий посібник
Розглянемо базовий приклад налаштування застосунку single-SPA з двома мікрофронтендами: один створений на React, а інший — на Vue.js.
Крок 1: Налаштування конфігурації Single-SPA
Спочатку створіть новий каталог для вашого застосунку single-SPA та ініціалізуйте проєкт Node.js:
mkdir single-spa-example
cd single-spa-example
npm init -y
Далі встановіть необхідні залежності:
npm install single-spa import-map-overrides
Створіть файл `index.html` у кореневому каталозі:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Single-SPA Example</title>
<meta name="importmap-type" content="systemjs-importmap">
<script type="systemjs-importmap">
{
"imports": {
"single-spa": "https://cdn.jsdelivr.net/npm/single-spa@5.9.0/lib/single-spa.min.js",
"react": "https://cdn.jsdelivr.net/npm/react@16.13.1/umd/react.production.min.js",
"react-dom": "https://cdn.jsdelivr.net/npm/react-dom@16.13.1/umd/react-dom.production.min.js",
"vue": "https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.min.js"
}
}
</script>
<script src="https://cdn.jsdelivr.net/npm/import-map-overrides@2.2.0/dist/import-map-overrides.js"></script>
<script src="https://cdn.jsdelivr.net/npm/systemjs@6.8.3/dist/system.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/systemjs@6.8.3/dist/extras/named-exports.js"></script>
</head>
<body>
<noscript>
You need to enable JavaScript to run this app.
</noscript>
<div id="root"></div>
<script>
System.import('single-spa-config');
</script>
<import-map-overrides-full show-when-local-storage="devtools"></import-map-overrides-full>
</body>
</html>
Цей файл `index.html` налаштовує завантажувач модулів SystemJS, import maps та конфігурацію single-SPA. Import maps визначають URL-адреси для залежностей, які використовуються мікрофронтендами.
Створіть файл `single-spa-config.js`:
import * as singleSpa from 'single-spa';
singleSpa.registerApplication(
'react-app',
() => System.import('react-app'),
location => location.pathname.startsWith('/react')
);
singleSpa.registerApplication(
'vue-app',
() => System.import('vue-app'),
location => location.pathname.startsWith('/vue')
);
singleSpa.start();
Цей файл реєструє два мікрофронтенди: `react-app` та `vue-app`. `activityFunction` визначає, коли кожен мікрофронтенд має бути активним, на основі URL.
Крок 2: Створення мікрофронтенду на React
Створіть новий каталог для мікрофронтенду на React:
mkdir react-app
cd react-app
npx create-react-app .
npm install single-spa-react
Змініть файл `src/index.js`, щоб використовувати `single-spa-react`:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import singleSpaReact from 'single-spa-react';
const lifecycles = singleSpaReact({
React,
ReactDOM,
rootComponent: App,
errorBoundary(err, info, props) {
// Customize the root error boundary for your microfrontend here.
return (<h1>Error</h1>);
},
});
export const { bootstrap, mount, unmount } = lifecycles;
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
Створіть файл `public/index.html` (якщо він не існує) і переконайтеся, що в ньому є div з id `root`:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Web site created using create-react-app"
/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<!--
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>React App</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.
To begin the development, run `npm start` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body>
</html>
Змініть `App.js`, щоб відобразити власний текст для легкої перевірки нашої роботи:
import React from 'react';
import logo from './logo.svg';
import './App.css';
function App() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
This is the <b>React Micro-Frontend</b>!
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
}
export default App;
Зберіть мікрофронтенд React:
npm run build
Перейменуйте каталог `build` на `react-app` і розмістіть його в корені застосунку single-SPA. Потім всередині каталогу `react-app` створіть файл `react-app.js` із вмістом файлу з `build/static/js`. Якщо в каталозі `static/js` є більше js-файлів, включіть їх також.
Оновіть import map у `index.html`, щоб він вказував на мікрофронтенд React:
{
"imports": {
"single-spa": "https://cdn.jsdelivr.net/npm/single-spa@5.9.0/lib/single-spa.min.js",
"react": "https://cdn.jsdelivr.net/npm/react@16.13.1/umd/react.production.min.js",
"react-dom": "https://cdn.jsdelivr.net/npm/react-dom@16.13.1/umd/react-dom.production.min.js",
"vue": "https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.min.js",
"react-app": "/react-app/react-app.js"
}
}
Крок 3: Створення мікрофронтенду на Vue.js
Створіть новий каталог для мікрофронтенду на Vue.js:
mkdir vue-app
cd vue-app
npx @vue/cli create .
npm install single-spa-vue --save
Під час налаштування Vue CLI виберіть пресет за замовчуванням або налаштуйте його за потребою.
Змініть файл `src/main.js`, щоб використовувати `single-spa-vue`:
import Vue from 'vue'
import App from './App.vue'
import singleSpaVue from 'single-spa-vue';
Vue.config.productionTip = false
const vueLifecycles = singleSpaVue({
Vue,
appOptions: {
el: '#vue-app',
render: h => h(App)
}
});
export const bootstrap = vueLifecycles.bootstrap;
export const mount = vueLifecycles.mount;
export const unmount = vueLifecycles.unmount;
Змініть `App.vue`, щоб відобразити власний текст для легкої перевірки нашої роботи:
<template>
<div id="app">
<img alt="Vue logo" src="./assets/logo.png">
<p>This is the <b>Vue Micro-Frontend</b>!</p>
<HelloWorld msg="Welcome to Your Vue.js App"/>
</div>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue'
export default {
name: 'App',
components: {
HelloWorld
}
}
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
}
</style>
Зберіть мікрофронтенд Vue.js:
npm run build
Перейменуйте каталог `dist` на `vue-app` і розмістіть його в корені застосунку single-SPA. Потім всередині каталогу `vue-app` створіть файл `vue-app.js` із вмістом файлу з `dist/js/app.js`. Якщо в каталозі `dist/js` є більше js-файлів, включіть їх також.
Оновіть import map у `index.html`, щоб він вказував на мікрофронтенд Vue.js:
{
"imports": {
"single-spa": "https://cdn.jsdelivr.net/npm/single-spa@5.9.0/lib/single-spa.min.js",
"react": "https://cdn.jsdelivr.net/npm/react@16.13.1/umd/react.production.min.js",
"react-dom": "https://cdn.jsdelivr.net/npm/react-dom@16.13.1/umd/react-dom.production.min.js",
"vue": "https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.min.js",
"react-app": "/react-app/react-app.js",
"vue-app": "/vue-app/vue-app.js"
}
}
Крок 4: Запуск застосунку
Запустіть файл `index.html` за допомогою простого HTTP-сервера. Ви можете використовувати інструмент, такий як `http-server`:
npm install -g http-server
http-server -c-1
Перейдіть на `http://localhost:8080/react`, щоб побачити мікрофронтенд React, і на `http://localhost:8080/vue`, щоб побачити мікрофронтенд Vue.js.
Важливі зауваження:
- Цей приклад використовує просту маршрутизацію на основі префіксів URL. Для більш складних сценаріїв маршрутизації розгляньте можливість використання спеціалізованої бібліотеки, наприклад `single-spa-router`.
- У виробничому середовищі ви, як правило, будете роздавати мікрофронтенди з CDN або іншого сервісу хостингу статичних ресурсів.
- Цей приклад використовує import maps для управління залежностями. Розгляньте можливість використання інструменту збірки, такого як Webpack або Parcel, для бандлінгу ваших мікрофронтендів для виробництва.
Просунуті техніки Single-SPA
Після того, як ви налаштували базовий застосунок single-SPA, ви можете дослідити більш просунуті техніки для покращення масштабованості та підтримки вашої архітектури.
Спільне використання коду за допомогою пакетів (Parcels)
Пакети (Parcels) дозволяють спільно використовувати компоненти та логіку між мікрофронтендами. Це може допомогти зменшити дублювання коду та покращити узгодженість у вашому застосунку.
Щоб створити пакет, ви можете використовувати функцію `singleSpa.mountRootParcel`:
import * as singleSpa from 'single-spa';
import React from 'react';
import ReactDOM from 'react-dom';
function MyParcel(props) {
return (<div>Hello from Parcel! {props.name}</div>);
}
const parcel = singleSpa.mountRootParcel(() => {
return Promise.resolve({
bootstrap: () => Promise.resolve(),
mount: (props) => {
ReactDOM.render(<MyParcel name={props.name} />, document.getElementById('parcel-container'));
return Promise.resolve();
},
unmount: () => {
ReactDOM.unmountComponentAtNode(document.getElementById('parcel-container'));
return Promise.resolve();
},
});
});
// To mount the parcel:
parcel.mount({ name: 'Example' });
Комунікація між мікрофронтендами
Мікрофронтендам часто потрібно спілкуватися один з одним для обміну даними або виклику дій. Існує кілька способів досягти цього:
- Спільний глобальний стан: Використовуйте бібліотеку для управління глобальним станом, таку як Redux або Vuex, для обміну даними між мікрофронтендами.
- Користувацькі події (Custom Events): Використовуйте користувацькі події DOM для передачі повідомлень між мікрофронтендами.
- Прямі виклики функцій: Експортуйте функції з одного мікрофронтенду та імпортуйте їх в інший. Цей підхід вимагає ретельної координації, щоб уникнути залежностей та циклічних посилань.
- Брокер повідомлень (Message Broker): Впровадьте патерн брокера повідомлень, використовуючи бібліотеку, таку як RabbitMQ або Kafka, щоб роз'єднати мікрофронтенди та забезпечити асинхронну комунікацію.
Аутентифікація та авторизація
Впровадження аутентифікації та авторизації в архітектурі мікрофронтендів може бути складним завданням. Ось деякі поширені підходи:
- Централізована аутентифікація: Використовуйте центральний сервіс аутентифікації для обробки входу користувачів. Сервіс аутентифікації може видавати токени, які використовуються для аутентифікації запитів до мікрофронтендів.
- Спільний модуль аутентифікації: Створіть спільний модуль аутентифікації, який використовується усіма мікрофронтендами. Цей модуль може керувати токенами та сесією користувача.
- API Gateway: Використовуйте API-шлюз для обробки аутентифікації та авторизації для всіх запитів до мікрофронтендів. API-шлюз може перевіряти токени та застосовувати політики контролю доступу.
Переваги архітектури мікрофронтендів із Single-SPA
- Підвищена автономність команд: Незалежні команди можуть розробляти та розгортати мікрофронтенди, не впливаючи на інші команди. Це сприяє автономності та швидшим циклам розробки.
- Покращена масштабованість: Мікрофронтенди можна масштабувати незалежно, що дозволяє оптимізувати розподіл ресурсів та справлятися зі збільшеним трафіком.
- Покращена підтримка: Менші, незалежні одиниці легше підтримувати та оновлювати порівняно з великим монолітним застосунком.
- Технологічне розмаїття: Команди можуть обирати найкращий технологічний стек для свого мікрофронтенду, що забезпечує більшу гнучкість та інновації.
- Зменшений ризик: Незалежне розгортання мікрофронтендів зменшує ризик при впровадженні змін та спрощує процедури відкату.
- Поступова міграція: Ви можете поступово переносити монолітний застосунок на архітектуру мікрофронтендів, не вимагаючи повного переписування.
Виклики архітектури мікрофронтендів
Хоча мікрофронтенди пропонують багато переваг, вони також створюють певні виклики:
- Підвищена складність: Управління кількома мікрофронтендами може бути складнішим, ніж управління єдиним монолітним застосунком.
- Накладні витрати на комунікацію: Координація комунікації між мікрофронтендами може бути складною.
- Складність розгортання: Розгортання кількох мікрофронтендів може бути складнішим, ніж розгортання одного застосунку.
- Узгодженість: Підтримка узгодженого користувацького досвіду в різних мікрофронтендах може бути складною.
- Дублювання: Без ретельного планування код та залежності можуть дублюватися в різних мікрофронтендах.
- Операційні накладні витрати: Налаштування та управління інфраструктурою для кількох мікрофронтендів може збільшити операційні витрати.
Найкращі практики для створення мікрофронтендів із Single-SPA
Щоб успішно впровадити архітектуру мікрофронтендів із single-SPA, дотримуйтесь цих найкращих практик:
- Визначте чіткі межі: Чітко визначте межі між мікрофронтендами, щоб мінімізувати залежності та накладні витрати на комунікацію.
- Створіть спільний гайдлайн стилів: Створіть спільний посібник зі стилів, щоб забезпечити узгоджений користувацький досвід у всіх мікрофронтендах.
- Автоматизуйте розгортання: Автоматизуйте процес розгортання, щоб спростити випуск мікрофронтендів.
- Моніторте продуктивність: Відстежуйте продуктивність кожного мікрофронтенду для виявлення та вирішення проблем.
- Використовуйте централізовану систему логування: Використовуйте централізовану систему для агрегації логів з усіх мікрофронтендів та спрощення усунення несправностей.
- Впровадьте надійну обробку помилок: Впровадьте надійну обробку помилок, щоб помилки в одному мікрофронтенді не впливали на інші.
- Документуйте свою архітектуру: Документуйте архітектуру мікрофронтендів, щоб кожен у команді розумів, як вона працює.
- Оберіть правильну стратегію комунікації: Виберіть відповідну стратегію комунікації залежно від потреб вашого застосунку.
- Надавайте пріоритет продуктивності: Оптимізуйте продуктивність кожного мікрофронтенду, щоб забезпечити швидкий та чутливий користувацький досвід.
- Враховуйте безпеку: Впроваджуйте найкращі практики безпеки для захисту вашої архітектури мікрофронтендів від уразливостей.
- Впроваджуйте культуру DevOps: Сприяйте розвитку культури DevOps для покращення співпраці між командами розробки та операцій.
Сценарії використання Single-SPA та мікрофронтендів
Single-SPA та мікрофронтенди добре підходять для різноманітних сценаріїв використання, зокрема:
- Великі, складні застосунки: Мікрофронтенди можуть допомогти розбити великі, складні застосунки на менші, більш керовані одиниці.
- Організації з кількома командами: Мікрофронтенди дозволяють різним командам працювати незалежно над різними частинами застосунку. Наприклад, у глобальній e-commerce компанії одна команда може зосередитися на каталозі товарів (наприклад, з Німеччини), інша — на кошику для покупок (наприклад, з Індії), а третя — на акаунтах користувачів (наприклад, зі США).
- Міграція застарілих застосунків: Мікрофронтенди можна використовувати для поступової міграції застарілих застосунків на більш сучасну архітектуру.
- Створення рішень Platform-as-a-Service (PaaS): Мікрофронтенди можна використовувати для створення PaaS-рішень, які дозволяють розробникам створювати та розгортати власні застосунки.
- Персоналізований користувацький досвід: Різні мікрофронтенди можна використовувати для надання персоналізованого досвіду на основі ролей, уподобань або місцезнаходження користувача. Уявіть новинний сайт, який динамічно завантажує різні модулі контенту залежно від інтересів та історії читання користувача.
Майбутнє мікрофронтендів
Архітектура мікрофронтендів продовжує розвиватися, з'являються нові інструменти та техніки для вирішення проблем створення та управління розподіленими фронтенд-застосунками. Ось деякі ключові тенденції, на які варто звернути увагу:
- Веб-компоненти (Web Components): Веб-компоненти — це стандарт для створення повторно використовуваних елементів інтерфейсу, які можна використовувати в будь-якому веб-застосунку. Веб-компоненти можна використовувати для створення мікрофронтендів, які є незалежними від фреймворків та легко інтегруються в різні застосунки.
- Федерація модулів (Module Federation): Федерація модулів — це функція Webpack, яка дозволяє спільно використовувати код та залежності між різними збірками Webpack. Федерацію модулів можна використовувати для створення мікрофронтендів, які є слабко зв'язаними та незалежно розгортаються.
- Рендеринг на стороні сервера (SSR): Рендеринг на стороні сервера може покращити продуктивність та SEO застосунків на мікрофронтендах. SSR можна використовувати для рендерингу початкового HTML мікрофронтенду на сервері, зменшуючи кількість JavaScript, яку потрібно завантажувати та виконувати на клієнті.
- Граничні обчислення (Edge Computing): Граничні обчислення можна використовувати для розгортання мікрофронтендів ближче до користувача, зменшуючи затримку та покращуючи продуктивність. Граничні обчислення також можуть відкрити нові можливості для мікрофронтендів, такі як офлайн-доступ та обробка даних у реальному часі.
Висновок
Single-SPA — це потужний фреймворк для створення масштабованих, підтримуваних та гнучких архітектур мікрофронтендів. Дотримуючись принципів мікрофронтендів та використовуючи можливості single-SPA, організації можуть розширити можливості своїх команд, прискорити цикли розробки та надавати винятковий користувацький досвід. Хоча мікрофронтенди вносять складнощі, впровадження найкращих практик, ретельне планування та вибір правильних інструментів є ключовими для успіху. Оскільки ландшафт мікрофронтендів продовжує розвиватися, бути в курсі нових технологій та технік буде вирішальним для створення сучасних та стійких веб-застосунків.