Микрофронтенды представляют собой архитектурный подход к построению фронтенд-приложений, при котором интерфейс разделяется на отдельные независимые части, каждая из которых разрабатывается, деплоится и обновляется автономно. В связке с Marko это позволяет создавать высокопроизводительные, модульные и легко масштабируемые приложения.
В Marko каждый компонент является самостоятельным блоком, который можно интегрировать в более крупный микрофронтенд. Стандартная структура проекта включает:
.marko шаблоном и .js логикой.Подход к микрофронтендам предполагает, что каждая часть интерфейса может быть как независимым приложением, так и интегрироваться в основное приложение через серверный рендеринг или клиентский импорт.
Компонент Marko состоит из трёх ключевых элементов:
Пример базового компонента:
<template>
<div class="card">
<h2>${input.title}</h2>
<p>${input.description}</p>
</div>
</template>
<script>
export default class {
onCreate() {
console.log('Компонент создан');
}
}
</script>
<style>
.card {
border: 1px solid #ccc;
padding: 16px;
border-radius: 8px;
}
</style>
Каждый компонент может быть независимым микрофронтендом, особенно если он взаимодействует с отдельным API или имеет собственную маршрутизацию.
Существует несколько подходов к интеграции микрофронтендов в Marko:
Сборка на уровне сервера (Server-Side Composition) Используется для интеграции разных приложений на сервере, где каждая часть рендерится отдельно и объединяется в общий HTML. Подходит для SEO-оптимизированных страниц.
Клиентская интеграция (Client-Side Composition)
Отдельные микрофронтенды загружаются динамически через
import() или через Web Components. Marko поддерживает
динамический импорт компонентов:
<await(import('./header.marko')) render(header => header) />
Marko предлагает несколько подходов к управлению состоянием компонентов:
this.state
внутри компонента, используется для UI-логики.input) и кастомные события
(this.emit()).Для микрофронтендов особенно важно, чтобы глобальное состояние было изолировано, чтобы один микрофронтенд не ломал логику другого.
Микрофронтенды часто требуют загрузки данных с разных сервисов. Marko поддерживает асинхронные операции на сервере и клиенте:
<await(input.dataPromise) render(data => {
return <div>${data.title}</div>;
}) />
Такой подход позволяет рендерить части страницы только после получения необходимых данных, не блокируя остальной интерфейс.
В больших приложениях каждый микрофронтенд может иметь собственный роутинг. В Marko используется комбинация:
express или
fastify с маршрутизацией для разных приложений.@marko/run и
marko-router позволяют обновлять компоненты без полной
перезагрузки страницы.Использование микрофронтендов требует особого внимания к производительности:
Микрофронтенды часто общаются с внешними API или микросервисами. В
Marko рекомендуется использовать сервисный слой (services/)
для всех внешних вызовов. Пример запроса через fetch:
export async function fetchUser(id) {
const response = await fetch(`https://api.example.com/users/${id}`);
if (!response.ok) throw new Error('Ошибка при загрузке пользователя');
return response.json();
}
Компонент может затем использовать этот сервис:
<await(fetchUser(input.userId)) render(user => <UserCard user=user/>) />
Каждый микрофронтенд должен быть автономным:
Такой подход облегчает масштабирование команды и поддерживает высокую скорость разработки.
Микрофронтенды в Marko позволяют строить модульные, управляемые и масштабируемые интерфейсы, сохраняя гибкость и производительность. Ключевые аспекты включают независимые компоненты, асинхронную загрузку данных, изоляцию состояния и оптимизацию ресурсов, что делает Marko мощным инструментом для сложных фронтенд-приложений.