"Официальное" решение в микрофронтендах

Module Federation, Webpack 5

Вечканов Алексей

https://github.com/Hydrock

Коротко о себе

Творчесво

  1. DAI - dependency-aging-index - выдаст ошибку если зависимости сильно устарели
  2. статьи на medium - иногда пишу заметки
  3. web-handbook.ru - список и описание html тегов

Webpack Module Federation

Что будет в докладе?

1. Проблемы фронтенда

Проблемы фронтенда

Распиливаем фронт на части

Какие проблемы хотим решить?

2. Что такое микрофронтенды?

Для начала что такое микросервисы?

Микросервисы – это широко распространенный архитектурный паттерн для разработки, используемый в бекэнде.

Микросервисные системы объединяют небольшие независимо разворачиваемые сервисы, которые запускаются в разных процессах (машинах) и коммуницируют по сети.

Микросервисы преследуют низкую связность компонентов системы между собой, что дает высокую автономность командам

Microfrontends – аналогичный архитектурный паттерн для фронтенда, в котором независимо доставляемые клиентские компоненты в браузер объединяются в единое целое.

⚠️ Но! Зрелость методов и технологий гораздо ниже, чем у микросервисов.

Что дают микрофронтенды?

Упрощение координации задач

– Команды более сфокусированы на своих предметных областях, четкая зона ответственности.

Возможность независимого развертывания

– Позволяет командам быть более автономными.

Сокращение цикла поставки

– Более быстрая сборка и тесты. Как нового функционала, так и исправления ошибок.

Снижение сложности

– Отдельные части меньше и легче для понимания, чем большой сложный монолит.

Изоляция ошибок

– Проще изолировать сбои в отдельных частях приложения, пока остальная часть приложения работает.

microservices VS microfrontends

✔️ В разработке очень похожи

❌ В рантайме не похожи

3. Существующие решения

Server Side Fragment Composition

Server Side Fragment Composition

Очень древняя технология когда вебсервер собирает из разных блоков сервисов в единую html.

✔️ SSR

❌ это не SPA

Iframes

Web Components

Веб стандарт 11-13 годов.

Web Components

Linked Pages & SPAs

Подход, при котором load-балансировщик согласно адреса страницы отдает то или иное SPA-приложение. На одном адресе только одно приложение.

Доклад Александра Китова про Атомарные SPA

Single-spa

https://single-spa.js.org

Один из самых популярных фреймворков на данный момент для SPA (since 2016). Тонкий слой оркестровки, который согласно URL запускает тот или иной микрофронтенд, "выключая" предыдущий.

Свой велосипед

Своя реализация модульности в Новом Клике

Module Federation

Новая киллер фича в Webpack 5 (since 2020). Позволяет точечно подключать модули из другой webpack-сборки, которая расположена на другом хосте. Альтернатива systemjs.

4. Описание Module Federation

© Module Federation invented and prototyped by Zack Jackson

Zack Jackson
Zack Twitter Zack Github

История появления

История появления

Module federation позволяет одному Webpack-приложению динамически подгружать код из другого Webpack-приложения.

MF это webpack-plugin, который позволяет импортировать chunk'и из стороннего webpack bundle в рантайме.

Все что может сбандлить Webpack (css, images, fonts, ...) с MF может быть зашарено между микрофронтендами.

Грубо говоря, MF позволяет смерджить в рантайме два Webpack manifest'а. И заставить их работать вместе, как будто вы их скомпилировали с самого начала. (https://webpack.js.org/concepts/manifest/)

✔️ MF может шарить между собой общие зависимости, если совпадает semver.

К примеру если React уже загружен, то он не будет повторно грузиться со стороннего webpack приложения.

✔️ MF могут быть развернуты на разных доменах и деплоиться независимо.

✔️ "Сборка" происходит на лету при запуске приложения в браузере.

Цели приследуемые при разработке MF

Резюме

5. Архитектура Module Federation

Терминология

Terminology

Схема MF

Как вебпак резолвит модули и scope?

Brief introduction to scope hoisting in Webpack
            
import action from './other-module.js';

var value = action();

export default value;
            
        
            
(function(module, exports, WEBPACK_REQUIRE_METHOD) {
    'use strict';
        
        var action = WEBPACK_REQUIRE_METHOD(1);
        var value = action();
    
        exports.default = value;
});
            
        
            
[
    /* 0 module */
    function() {},
    /* 1 module */
    function() {},
    /* n module */
    function() {}
]
            
        

Архитектура - ссылки

6. Демо

Ссылки на репы потренироваться

7. Проблемы

Проблемы

8. Советы - Полезные ссылки

SSR?

React 18 improves the existing behavior of Suspense

Асинхронный запуск (bootstrap file)

тут Зак Рассказывает зачем...

TypeScript

Определение Модуля

Fallback as npm package

https://www.youtube.com/watch?app=desktop&v=K-yQB9YGmgE

Как готовить шареные модули

https://habr.com/ru/post/554682/

Дашбоард

dashboard-plugin

Еще много полезных ссылок

Голосование

Спасибо

https://github.com/Hydrock