За последние несколько лет микрофронтенд, архитектурный подход, где независимые приложения собраны в одно комплексное приложение, набрал заметную популярность. Его достоинство в том, что он даёт возможность объединить в едином приложении разные виджеты, страницы, которые написаны разными разработчиками и/или командами с использованием разных фреймворков. Подробности, включая подходы к организации, — под катом.

Достоинства и недостатки микрофронтенда

О возможностях микрофронтенда уже писали на Хабре, и достаточно развёрнуто. Главное, что стоит знать, — все преимущества и возможности раскрываются при разработке больших комплексных энтерпрайз-приложений.

Вот главные плюсы:

  • возможность внедрить модульную архитектуру — в этом случае отдельные виджеты или страницы работают в качестве независимых приложений

  • ускорение тестирования — если меняется что-то в виджете или странице, то их можно протестировать локально, не теряя время на комплексное тестирование всего «большого» приложения

  • параллельный деплой — то же самое, сохраняется модульность — все составные приложения можно деплоить независимо друг от друга

Есть, конечно, и недостатки:

  • сложность приложения увеличивается, и весьма значительно

  • код дублируется во многих случаях, ведь приложения разрабатываются отдельными командами, каждая из которых использует собственные технические решения, это значит, что могут использоваться одинаковые фреймворки и библиотеки

  • достаточно часто возникают проблемы с кешированием и версионностью приложений

Всё это говорит об одном — микрофронтенд стоит применять только в больших командах, которые работают над комплексными проектами. Если проект небольшой, а команда одна, притом это несколько человек, лучше использовать другой архитектурный подход. Конечно, могут быть и исключения, но их не так много. Если ваша команда — именно это исключение, расскажите об этом в комментарии — всем будет интересно.

Микрофронтенд в большинстве случаев позволяет ускорить разработку за счёт выделенных зон ответственности каждой из команд, а также изолированного тестирования. То есть речь идёт об оптимизации процессов разработки.

Ну а теперь — о подходах в микрофронтенде

Их не так много, и у каждого, как всегда, есть свои недостатки и преимущества.

Iframe

Очень известная технология, которая нашла новую жизнь в реализации микрофронтенд-архитектуры. На Хабре любой новичок знает об iframe, так что повторяться, описывая эту технологию, не стоит. А вот о преимуществах и недостатках, пожалуй, расскажем.

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

Но это преимущество достигается за счёт производительности, ведь каждая новая вставка iframe — добавление нагрузки. Этот фактор можно нивелировать, оптимизировав кеширование.

Что касается недостатков, то главный из них — взаимодействие с поисковыми роботами. Они не в состоянии отрисовывать iframe для каждого нового индексирования — соответственно, страдает SEO.

Кроме того, есть ещё и определённая сложность в поддержке такой архитектуры. К счастью, кроме iframe, есть и другие подходы.

NPM

Речь идёт о разработке с использованием пакетов NPM, что даёт несколько преимуществ — от производительности до SEO. В частности, нужные компоненты и файлы можно импортировать из библиотеки. В ходе разработки сохраняется типизация и нет проблем с версионностью, как в предыдущем варианте.

С другой стороны, приходится сохранять единство стека, а также следить за версионностью микрофронтенда и транзитивными зависимостями. Тут есть и обратная сторона медали — всё это позволяет без проблем подхватить разработку со стороны других команд. Зачем? Например, нужно добавить, изменить или удалить какие-то функции.

Подмодули git и монорепозитории

Это альтернатива предыдущему варианту. Помните мем «Мы установили тебе телевизор в телевизор, чтобы ты мог смотреть телевизор, пока смотришь телевизор»? Ну или как-то так. Здесь суть примерно та же — получаем репозитории внутри репозитория, внутри которых могут быть… Ну вы поняли.

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

Достоинства и недостатки примерно те же, что и в предыдущем варианте. Но есть ещё один минус — если нужно добавить какую-то новую возможность сразу во все пакеты одновременно, сделать это будет сложно. Слить все изменения вместе не получится.

Single-spa

А это подход, у которого почти нет недостатков, зато много преимуществ:

  • очень хорошая документация

  • можно шарить зависимости между отдельными виджетами

  • есть поддержка независимых деплойментов

  • есть рабочие примеры с использованием популярных современных фреймворков и библиотек

  • также есть готовая система врапперов, что позволяет быстро интегрировать существующие приложения в микрофронтенд-архитектуру

Сам по себе Single-spa — фреймворк, позволяющий объединять разные приложения, причём вне зависимости от того, какие библиотеки или фреймворки в них используются. То есть это идеальный вариант для микрофронтенда.

Вот так примерно выглядит приложение, где используется этот подход:

Кстати, схема похожа на iframe, но загрузка реализуется посредством нативного импорта + importmap или через Systemjs.

Недостатков почти нет, главный из них, как и в случае с iframe, — сложности с SEO. Но если поисковая оптимизация особо и не нужна, то этот подход крайне рекомендован, технология очень мощная.

Webpack 5 Module Federation

Отличный плагин, который разработан специально для микрофронтенда. Он позволяет выполнять корректную сборку с динамическим импортом во время выполнения. Развёртывание полностью независимое, а реализация — очень лёгкая.

Недостатков почти нет.

Что в итоге?

Микрофронтенд рекомендован тем проектам и командам, где:

  • есть необходимость в расширении

  • работает больше 10, а лучше 20 человек

  • приложение состоит из отдельных модулей, которые могут быть и отдельными приложениями

  • тестирование и багфиксинг занимают много времени

В противном случае, за малыми исключениями, этот подход лишь усложнит разработку, а не упростит процесс.

Если вы используете микрофронтенд в работе, расскажите о своём опыте и кейсах: когда начали использовать, какие выгоды получили и т. п.

Комментарии (9)


  1. Batalmv
    08.08.2023 14:32

    Был один опыт, решение было скорее вынужденным + архитектурное требованте заказчика , так как встраивали свои модули (Angular) в легаси приложение (JSF). Использовали iframe.

    Из нюансов:

    • Надо было шарить токен сессии

    • Был определенный затык с общими страницами для 404, 5xx, но больше связанно с особенностями CI/CD

    • И явно сразу не продумали навигацию, когда пользователь нажимает "back"

      В остальном - нормально


  1. nin-jin
    08.08.2023 14:32

    Если ваша команда — именно это исключение, расскажите об этом в комментарии — всем будет интересно.

    Ну, сами напросились..

    Смотрите, одна микрокоманда разрабатывает в своём репозитории полностью независимую легковесную (55kb) JS песочницу, не зная про существование других команд:

    $hyoo_js_eval
    $hyoo_js_eval

    Другая микрокоманда разрабатывает в своём репозитории полностью независимый легковесный (95kb) тул для микробенчмаркинга JS, куда вставляет ту самую JS песочницу для дебага кейсов, оставив от неё лишь рантайм-инспектор:

    $hyoo_js_perf
    $hyoo_js_perf

    А потом приходит третья микрокоманда, и собирает в своём репозитории легковесный (330кб) портал из десятка различных независимых приложений, где в одном из разделов выводятся бенчмарки используя тот самый тул, но в несколько кастомизированном виде:

    $hyoo_mol
    $hyoo_mol

    А затем эти полтора землекопа приходят на Хабр и видят там:

    Что даже без прикладного кода, UI-кита и прочих библиотек уже весит 330кб.


    1. SWATOPLUS
      08.08.2023 14:32
      -1

      JSX вместо tree и я попробую $mol.



    1. mayorovp
      08.08.2023 14:32

      Проблема, которую вы назвали, растёт исключительно из-за того что две разные команды пользуются разными фреймворками. И от добавления в эту кашу ещё и mol лучше не станет.


      Вот от перехода на единый фреймворк — станет… но в качестве этого единого фреймворка можно выбрать любой.


      1. nin-jin
        08.08.2023 14:32
        -1

        Покажите хоть один другой, который позволяет легко делать описанное в комментарии.


        1. mayorovp
          08.08.2023 14:32

          Да, в общем-то, любой. Ну, почти любой, сейчас какая-то мода пошла на фреймворки без поддержки инверсии зависимостей — вот они точно для этой задачи не подходят. Остальные подходят, вопрос только в опыте и пороге входа.


          Кстати, по порогу входа ваш мол совершенно точно проигрывает, вы ещё хвастались этим недавно.


          1. nin-jin
            08.08.2023 14:32
            -1

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

            Скорее иронизировал над тем, что бэкендеры спокойно самостоятельно осваивают, а для фронтендеров прям непреодолимое препятствие.


  1. PuerteMuerte
    08.08.2023 14:32

    Микрофронтэнды - это ещё одно отражение современного подхода к разработке. Когда нежелание или отсутствие квалификации менеджить укрупнённый проект выливается во фрагментацию проекта на слабо связанные небольшие модули, снижая продуктивность и разработки, и тестирования, и самое неприятное - продакшена.