Как стать автором
Обновить

Комментарии 30

А как решается проблема со стилями, что будет если в разных модулях окажутся стили для одинаковых классов?

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

Не очень понял, что такое basehref? Для двух модулей на странице создадутся два элемента style в которых могут оказаться конфликты, например класс .content, который окажется в разных модулях в нескольких элементах, разве нет?

В данном кейсе главным выберется тот стиль, что прилетел из host приложения.

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

Css in js, например linaria, не используете до сих пор?

Для ангуляра не видится смысла в данном действии. С появлением нормального standalone API в 15 версии, можно рассмотреть данное решение.

1) А микрофронтенд может использовать другой микрофронтенд? Или всех их разруливает (роутит) ядро?
2) Работает ли hot reload при разработке?
3) Работает ли SSR? И видит ли node.js что микрофронтенд обновился при hot reload

1. Да можно использовать, для этого внутри ремоута нужно определить роут и вызвать с помощью функции loadRemoteEntryModule().

2. При использовании nx-workspace автоматом перезагружается хост, но появилось это относительно недавно, до этого приходилось ручками обновлять страницу в браузере. В остальном hot работает как надо

3. Поддержка SSR заявлена, но не совсем отлично работает, поэтому данный момент пока держу за скобками и отложил в бэклог)

Спасибо за статью, как раз сейчас стоит задача перевести приложение с микрофронтами (angular-architects) на SSR. Отсюда просьба, дать какой-то совет или ссылку "что почитать", чтобы этот путь не был столь долог, опасен и не стал тупиковым) пожалуйста!

puppeteer + cache, в фоне кэш страниц обновляется, а на запрос странички отдается сразу готовый HTML из кэша, работает супер быстро и никаких переделок на фронте не требует, после загрузки бандла просто данные зафечатся по новой которые при загрузки отображаюся и пользователь увидит их самыми актуальными, а для поисков пофиг что они могут быть на 5-10 минут "устаревшие", на SEO это не влияет

Оу, спасибо, изучу и этот вариант!

Осторожнее с этим вариантом.


Запуск браузера на сервере для получения сгенерированного фронтом HTML — это куча накладных расходов, которых, как правило, можно избежать.

Нет. Это копейки. 1-2 экземпляра запущенных которые обновляют кэш и периодически перезапускаются дабы избежать возможных утечек памяти.
Альтернативы 3:
1) Нe использовать SSR.
2) Использовать классические схемы типо PHP + jQuery и т.п.
3) Превратить свой проект в говнокод и получить на ровном месте дополнительно связанные руки, ограничения, реальную нагрузку на сервер и использовать всяческие Next.js, Nuxt.js и прочую фигню.

Если я правильно понимаю, то для SSR приложения из 25 микрофоронтов нужно будет поднятые 25 приложений на ангуляре? Предложенный вариант можно использовать с кешем и только для отдачи ботам. Что думаете? Есть ответ на первый вопрос? спасибо.

Что вы имеете в виду под "25 поднятыми приложениями"?

25 приложений, которые слушают определенный для себя порт.

Обычный сайт - раздается как статика, SSR - слушает порт и отдает сформированный HTML и статику. И продолжая эту логическую цепочку, я предположил, что SSR в 25-ти микрофронтах - это 25 таких слушающий порт приложений. Или это совсем не так и запускаем только основное, а остальное билдим? На данный момент я вообще не понимаю как начать SSR на angular-architects

Запрос от браузера направляется только на один веб-сервер, и он-то и будет заниматься SSR. И рендерить, как и в браузерном случае, он будет в первую очередь приложение-оболочку (app shell), рендер микрофронтов является ответственностью этой самой оболочки.

То, что запрос отправляется один - понятно. Я именно про рендер микрофронтов. В дев режиме - это же запущенные приложения, а в проде собранные js файлы. При SSR как должен выглядеть рендер микрофоронтов? Нет ли случаем ссылки на мурзилку или что-то похожее?

Ну вот смотрите. Как происходит рендер в браузере? Сначала рендерится оболочка, которая загружает один или несколько микрофронтов и говорит им отрендериться.


Как должен происходить SSR? А так же, сначала рендерится оболочка, которая загружает один или несколько микрофронтов и говорит им отрендериться.


Где на этом этапе могут выплыть 25 слушающих сокет приложений?

Да хоть 125 и хоть на всём подряд, react, angular, vue, jquery, svelte и т.п.

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.org', {
    waitUntil: 'networkidle0',
  });
  // Полностью отрендереный HTML на 125 микрофронтах с использованием любым библиотек и фреймворков
  const bodyHTML = await page.evaluate(() =>  document.documentElement.outerHTML);
  redis.set(pageUrl, bodyHTML);

  await browser.close();
})();

Микрофронтенды решают много проблем, но и привносят достаточно новых.

Как и любая другая технология в целом. Серебряных пуль не существует.

Я так понимаю используется несколько ангуляр приложений. Не возникает проблема с zone.js?

Нет, проблем не возникает. На уровне конфига мы можем управлять зависимостями и синглтонить их. Поэтому все что касается ангуляра автоматом прописано как singlton: true

Но помимо монолитного фронта обычно есть еще и монолитный бэк. А это значит, что будем распиливать и фронт, и бэк.

Ловко. Возьму на вооружение.

- Надо отрефакторить фронт.

- Значит и бэк будем, а то что это он!

Насколько понимаю, нельзя сделать шеллом реакт приложение, а вот ангуляр с его роутингом привязывать как микрофронт? То есть решение исключительно для ангуляр команд?

ПС почему Modul Federation? Вроде как Module Federation

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

Я спрашиваю потому что в полуоф репозитории такого семпла нет, видел только такой, без Ангуляра https://github.com/module-federation/module-federation-examples/tree/master/react-in-vue

Но класс если вы делали!

Нет, я так не делал.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий