Эта статья обычно предназначена для того, чтобы ответить на несколько вопросов:
- Миграция на микро-фронтенды, что именно мы хотим?
- Какие части обычно включает в себя отраслевая «микроинтерфейсная» система?
- Какая технология обычно используется для «микроинтерфейсного фреймворка», близкого к одноклассникам R&D?
- Может ли проект нашей команды сейчас находиться на "микроинтерфейсе"? Что нужно изменить и в какой степени?
(Читайте полный текст ниже примерно через 20 минут)
Micro front-end понятие не новое, о нем в той или иной степени слышали все, здесь я не буду давать кучу определений, а просто подытожу обзор/обзор текущих отраслевых практик, эта статья нацелена наЕще нетСтуденты или команды, которые использовали микро-интерфейсы в своем бизнесе, могут легко получить общее представление о «микро-интерфейсах» с помощью этого обзора;
В общем, понятие "микрофронтенд" до сих пор в расцвете от его создания до его разработки (делать свое делоПри разработке не существует единого консенсуса/стандарта (с высокой долей рынка); каждая крупная фабрика/сообщество имеет разные определения этой концепции и лежащей в ее основе технологии.
Итак, чего мы хотим?
Как следует, этотипичныйПример структуры микроинтерфейса : на странице, доступ к которой осуществляется по URL-адресу, имеется основное приложение (базовое), несколько сосуществующих подприложений A/B, а подприложение B имеет вложенное подприложение C. ; их могут использовать разные команды Независимая разработка, каждое приложениеОнлайн самостоятельно, не мешая друг другу.
«Независимый онлайн» «Невмешательство»
Важно для нас«Независимый онлайн» «Невмешательство», не мешают друг другу на уровне онлайн-релиза и не мешают друг другу на уровне сосуществования приложений;
Это самая интуитивная способность, которую нам должен принести микро-фронтенд, потому что прямая проблема, с которой мы сталкиваемся, это «есть внутренние модули, которые нужно разобрать по разным командам для разработки, как выпустить и выйти в онлайн» (т.е. , «разделить некоторые большие внутренние модули на подприложения» »).
начать с«Не мешать друг другу на уровне онлайн-релиза»Если говорить, например, о главном приложении версии 1.0.1, а о вспомогательном приложении А версии 2.1.0, люди из разных команд запустили свои собственные приложения, и это никак не повлияло на ритм их релизов;
Когда вспомогательное приложение A обновляется до версии 2.1.1, основное приложение и вспомогательное приложение B должныНикаких изменений/релизов вообще, онлайн-страница — это вспомогательное приложение A, эта область является новой.
Упростите этот случай до минимального, всего одно основное приложение и одно вспомогательное приложение, давайте посмотрим«Независимый онлайн»это дело.
Перед этим давайте поговорим о не-микро интерфейсе,загрузка страницыКак это работает:
Обычно запись результата упаковки приложения на странице интерфейса представляет собой раздел<script>
Тег загружает файл js и после выполнения монтирует содержимое в узел dom, как показано ниже.
<html>
<head>
...
</head>
<body>
<div id="root"></div>
<script src="//cdn/entry/main-app.js@1.0.2"></script>
</body>
</html>
При доступе к разным маршрутам (url-адресам) на странице исходно упакованные js будут асинхронно загружать js-чанки соответствующих маршрутов и компонентов, а затем отображать содержимое/компоненты по этому маршруту после получения кода;
Возьмем, к примеру, webpack, вставив<script>
тег для получения других фрагментов js, каждый фрагмент js загружается с помощью jsonp (файл входа — IIFE).
<html>
<head>
...
<script src="//cdn/chunk/0.f3c200e0.async.js"></script>
<script src="//cdn/chunk/1.5bb06b78.async.js"></script>
</head>
<body>
<div id="root"></div>
<script src="//cdn/entry/main-app.js@1.0.2"></script>
</body>
</html>
// 0.f3c200e0.async.js
(window.webpackJsonp=window.webpackJsonp||[]).push([chunkId], xxxChunk)
Затем переключитесь на фреймворк микро-интерфейса, загрузка будет немного другой, в частности, при рендеринге контента в определенных областях,От «загрузки собственного чанка» к «загрузке записи приложения», загрузчик изменен с веб-пакета на "контейнер микро-фронтенда";
получить доступhttps://xxx-domiain/main-app/sub-route/xxxx
Например, упрощенный процесс:
- Основное приложение соответствует
/main-app/sub-soute
Маршрут, отображать содержимое текущего маршрута - Если в текущем содержимом маршрутизации есть подприложения, загрузите их асинхронно.Запись подприложения
- подприложение соответствует
/sub-route/xxxx
Маршрутизация, рендеринг соответствующего контента маршрутизации в своей области
назад«Независимый онлайн»В этом вопросе, во-первых, уже всем известно, что микро-фронтенд-фреймворк на самом деле«Родительское приложение загружает запись дочернего приложения», а затем просто задайте этот «вход» как раздел js (или html), как показано на рисунке ниже,
Тогда у нас еще так много проблем;
- Как внедрить скрипт записи загрузки, куда его загрузить и как контролировать версию?
- Где выйти в интернет, как выйти в интернет?
- Когда поддержание является онлайн и обновлена, почему бы не позволить основным приложению быть переупаковано?
- Как выбрать другую версию для запуска/отката/оттенков серого?
- Как я могу увидеть список всех текущих под-приложений?
- Как интегрировать совместную отладку при переключении между несколькими версиями?
- ...
Микро интерфейсная система
На самом деле это отражает то, чтоНаш спрос на «микро-интерфейс» — это не только «фреймворк микро-интерфейса», но и целая поддерживающая «система микро-интерфейса»;
Это общее содержание системы.Последние несколько вопросов в предыдущем разделе можно определить по«Система управления» «Пакет разработки»ответить, и обычно все говорят"Фреймворк микро-интерфейса"только в этой системе«Контейнер времени выполнения»эта часть;
система управления
«Систему управления» можно рассматривать как онлайн-платформу управления + онлайн-процесс выпуска;
Согласно текущим результатам исследования, реализация микро-фронтенда должна быть оснащена такой платформой управления, хотя она настолько абсолютна, но имеет на две функции больше, чем онлайн-платформа не-микро-фронтенда:
- Управление приложением- Могут быть запущены разные версии различных основных приложений и подприложений, а также могут быть перечислены адреса входа различных версий онлайн-приложений.
- управление зависимостями- Четкое управление зависимостями приложения родитель-потомок и ввод адреса входа дочернего приложения в родительское приложение.
Согласно предыдущему разделу «Загрузка записи», загрузка записи дочернего приложения — это родительское приложение для загрузки URL-адреса js, например:https://cdn/.../entry@v1.js
, то подприложениеонлайнТо есть обновить URL-адрес (версию), каждый раз, когда он выходит в сеть, это новый адрес входа (версия);
А для того, чтобы «обновить суб-приложение онлайн и предотвратить переупаковку основного приложения», также необходимо разрешить этому URL-адресу записи проходить через онлайн-платформу.инъекцияв родительское приложение, а не жестко кодировать в коде родительского приложения; этоинъекцияПроцесс и то, какие субприложения внедряются, выполняются на этой онлайн-платформе управления.
Другие части, такие как «выпуск версии», «план в оттенках серого» и «приватизация», соответствуют общей интерфейсной онлайн-платформе развертывания и не будут повторяться;
Пока есть реальный онлайн-запрос, этой системы управления не может не быть, если ее нет, значит, команде нужно делать другую.
В приложении: некоторые результаты исследования
грузовой контейнер | Платформа управления |
---|---|
Qiankun(на базе одного спа) | OneX (Внутри Али — Ant Financial) |
MicroX (внутри Али) | MicroX + CSKit (внутри Alibaba — Alibaba Cloud Intelligence) |
icestark | Iceworks (Ali Inside-Flying Ice) |
alfajs | Альфа (Alibaba Internal — Alibaba Cloud Console) |
Пакет разработки
Эта часть документации особенно важна, это не просто введение в фреймворк микроинтерфейса, включая документацию самой разработки, а также только что упомянутый «процесс онлайн-релиза». должны иметь документы, соединенные последовательно.
Существуют небольшие различия между сборкой/выпуском, что означает, что упакованные записи могли измениться или даже больше; формат продукта подприложения имеет некоторые ограничения, такие как потребность в дополнительных файлах, связанных с «загрузочной записью».
Интегрированная отладка между несколькими приложениями «родитель-потомок» включает:
- Локальная разработка подприложений может быть отделена от родительского приложения и начинать разработку и отладку независимо
- Отладка локального дочернего приложения и доступ к родительскому приложению, оба запускаются локально
- Чтобы воспроизвести онлайн-баги, нужно отладить дочернее приложение и родительское приложение для доступа, одно из которых запускается локально, а другое загружается онлайн
микроматериалы
Пунктирная линия нарисована для «микроматериалов», потому что они появились относительно поздно в построении системы (также далеко от нашего понимания).(Aeolus)Текущий спрос далеко), на ранней стадии работы микроинтерфейса нет необходимости в реализации;
А появление «микроматериалов» — это по сути трансформация формы микрофронтенда, изменение микрофронтенда из"Комбинация приложений на разных уровнях страницы, без пакетов"преобразовать в«В соответствии с протоколом интерфейса удаленные компоненты и функции могут быть загружены напрямую, без пакетов»,
Он напрямую стирает границы App/Page/Component(widget)/Function/Plugin, написан в виде нативного браузерного импорта esm и deno import (есть еще бэкенд "удаленный вызов процедур" (RPC) в способ вызова. Чувство), напрямую снижая порог повторного использования компонентов и удаленной загрузки, поэтому такие вещи, как рынок материалов, также будут следовать этой тенденции;
// 伪代码示例,加载函数级别的微组件并执行
import foo from 'https://cdn/.../foo.js'
const foo = import('https://cdn/.../foo.js')
const foo = load('https://cdn/.../foo.js')
foo(xxx)
В этом случае просто различайте границы текущих заголовков.
- App- Целое микроинтерфейсное приложение также может иметь множество модулей и несколько страниц внутри.
- Page- Чуть более крупный компонент микроинтерфейса с маршрутизацией можно назвать страницей, например страницей запроса данных.
- Widget- Виджеты (виджеты) без роутинга, например кнопки с уникальным стилем
- Function- Функциональная функция, которая загружается и выполняется удаленно, например, представьте себе загрузку функции в lodash с помощью UMD (формат интерфейса определяется вне приложения)
- Plugin- Формат интерфейса, относительно строгие функции, определяемые контекстом выполнения (формат интерфейса определяется приложением)
контейнер среды выполнения
Эта часть — то, что обычно делает «микроинтерфейсный фреймворк» в узком смысле;
Что он в основном делает, возможно, это:
-
загрузка приложения- В соответствии с зарегистрированным подприложением через указанный URL-адрес загрузите запись подприложения в согласованном формате и смонтируйте ее в указанное место.
- В настоящее время в отрасли существует два распространенных формата входа:HTMLиJS
- JS более чистый в качестве входа, и проще преобразовать старые проекты с HTML в качестве входа.
- Комбинация входа отца и сына(т.е. определить зависимости)Так же есть два режимасостав времени сборкиикомпозиция во время выполнения
- Некоторые фреймворки получают статус регистрации субприложения и адрес входа на основе данных, подобных манифесту.
- Частичная поддержка фреймворка иПлатформа управленияПри сотрудничестве среда выполнения принимает адрес входа, динамически вводимый платформой.(Есть также фреймворки, которые утверждают, что среда выполнения и платформа управления развязаны, но на самом деле, если вы ее не используете, вам придется реализовать логику внедрения самостоятельно)
- В настоящее время в отрасли существует два распространенных формата входа:HTMLиJS
-
жизненный цикл- загружать/монтировать/обновлять/выгружать и т.д.
- Инициализация при загрузке/монтировании, защита разрешений, язык i18n и т. д.
- Очистка при удалении, например удаление тегов скриптов, тегов стилей, субприложений dom и т. д.
- И мост для двустороннего обновления при маршрутизации и связи родитель-потомок
-
синхронизация маршрута- При переключении маршрута субприложения URL-адрес обновляется синхронно; когда URL-адрес перескакивает/обновляется, суб-приложение обновляется синхронно
- То есть маршрутизация для подприложений эквивалентна url
-
связь приложений- Это означает поддержку удобной связи между родительским и дочерним приложениями, не такой сложной, как postMessage (имеется в виду строки)
- Что, вы просите родственные приложения общаться друг с другом? Конечно, все используют родительское приложение в качестве EventHub.
-
изоляция песочницы- Для того, чтобы каждое приложение «дополняло друг друга», каждое приложение должно выполняться в «изолированной» среде.
- Без изоляции глобальные стили CSS могут быть конфликтующими и хаотичными, а глобальные переменные JS могут быть загрязнены/подделаны/заменены.
- В этой части отрасли существует множество решений и направлений развития, и я расскажу об этом в следующей главе.
- Обработка исключений- Унифицированная обработка всех вышеперечисленных вещей, когда сообщается об ошибке, такой как сбой загрузки или сбой сопоставления маршрута.
изоляция песочницы
Обычно между несколькими приложениями необходимо изолировать только две части: JS и CSS;
JS-изоляция
Snapshot
дополнительное приложениеустанавливать, сначала сделайте снимок глобальной переменной окна и поместите его в замыкание, затем бросьте глобальное окно в суб-приложение и поместите его в суб-приложениеудалитьПри восстановлении глобальной переменной окна через снапшот;
Это практика некоторых ранних фреймворков, на самом деле это не формирует "изоляцию", а лишь предотвращает "загрязнение" друг друга несколькими подприложениями, также есть много ограничений:
- Родительские и дочерние приложения не могут сосуществовать, а вся страница под маршрутом URL-адреса является дочерним приложением.
- Несколько подприложений не могут сосуществовать, потому что существует только одно глобальное окно и только один снимок.
- Безопасность метода снимка недостаточно строгая, и у глубокой копии будут проблемы при встрече с документом/историей и т. д.
Сейчас такого нет, и используется идея песочницы.
Sandbox
Wasm VM
Перекомпилируйте интерпретатор Wasm JS и поместите его в браузер, а суб-приложение поместите прямо в эту виртуальную машину для выполнения;
Изоляция очень строгая, я видел много технических статей, объясняющих это, но до сих пор не исследовался ни один реальный фреймворк микро-фронтенда.
Причина та же, что если вы не используете Web Worker/iframe, изоляция слишком строгая, связь очень хлопотная, а накладные расходы на связь очень большие;
(Но есть и другие способы использования помимо микроинтерфейсов, напримерStackBlitz )
with() + new Function(code) + Proxy
with
Синтаксис используется для изменения цепочки областей видимости, которая используется здесь для перехвата оконных просмотров при записи доступа к глобальным переменным, таким как прямой доступArray.from
вместоwindow.Array.from
когда пишешь
new Function
Функция выполнения кода эквивалентна eval, но eval может получить доступ к текущим локальным переменным области видимости, независимо от того, где выполняется новая функция возврата Function, она может получить доступ только к глобальной области видимости, что нам и нужно.
иProxy
Предоставляется объект, используемый в замыканиях with и new Function в качестве области действия окна. Атрибут белого списка ограничивает доступ к некоторым элементам в реальном окне. Через прокси при удалении/добавлении глобальных переменных/apis реальные глобальные переменные не будут затронуты y окно оказывает влияние;
В то же время он перехватывает различные операции над документом/историей/местонахождением, такие как вставка элементов в document.body для перемещения вселенной, переписывание history.push и последующая синхронизация его с URL-адресом, перехват пути расположения, чтобы только подприложения получить внутренние маршруты и т. д., эти различные ограничения составляют среду песочницы;
// 简化伪代码示例
window = new Proxy(pick(window, whiteListProperties), { ... })
document = new Proxy(document, { ... })
...
sandbox = new Function(`
return function ({ window, location, history, document }, code){
with(window) {
${code}
}
}`)
sandbox().call(window, { window, location, history, document }, code)
Но степень перехвата окна здесь ограничена, дажеЕго можно просто понимать как «поверхностное копирование», а не как «глубокое копирование»., легко избежать и добиться загрязнения через глобальный общий API, например, напрямую изменитьArray.prototype.push
поведение;
with() + new Function(code) + Proxy + iframe contex
Чтобы более безопасно решить описанную выше проблему выхода из глобального API окна прокси, вы можете взять окно iframe в качестве окна контекста среды песочницы;
iframe здесь не используется напрямую в качестве песочницы для выполнения кода подприложения, и подприложение по-прежнему выполняется вwith + new Function
, этот iframe является просто созданным пустым iframe того же происхождения, его единственная цель - получить егоiframe.contentWindow
Объект передается дочернему приложению как окно;
Из-за строгой изоляции iframe все глобальные объекты не имеют ничего общего с внешним слоем(кроме родителя), так и внутри и снаружиArray
Array.prototype
Они не совпадают, что равносильно перехвату окна предыдущей схемы.«Глубокое копирование», является относительно полным и элегантным решением для песочницы;
(Прокси-перехват документа/истории/локализации такой же, как и предыдущее решение)
// 简化伪代码示例
frame = document.body.appendChild(document.createElement('iframe',{
src: 'about:blank',
sandbox: "allow-scripts allow-same-origin allow-popups allow-presentation allow-top-navigation",
style: 'display: none;',
}))
window = new Proxy(frame.contentWindow, { ... })
document = new Proxy(document, { ... })
...
sandbox = new Function(`
return function ({ window, location, history, document }, code){
with(window) {
${code}
}
}`)
sandbox().call(window, { window, location, history, document }, code)
Realms
tc39 новая спецификация все еще в предложенииRealms, этап 2, может создавать полностью независимые глобальные объекты и глобальные области видимости, которые подходят для реализации песочниц (есть также некоторыеОбсуждение побега),
В настоящее время фреймворк микроинтерфейса не исследовался, и только Figma упомянула, что он используется для собственного подключаемого решения.(После упомянутого выше «микроматериала» в категорию «микрофронтенд» можно включить и плагины);
Изоляция CSS
В отличие от относительной зрелости изоляции JS, изоляция CSS совершенно незрела в отрасли, и в настоящее время она представляет собой небольшую проблему для большинства микроинтерфейсных сред;
Большинство из них скажут вам добавлять префиксы инженерным способом для предотвращения конфликтов, например, модули БЭМ/css/css в js/пользовательские префиксы и т.д.;
Но это не может решить ситуацию, когда разные приложения зависят от разных версий одной и той же UI-библиотеки;
И большинство исторических проектов также имеют много жестко запрограммированных className. Это трудно полностью реформировать;
Удаление при переключении приложений
Это то же самое, что и упомянутый выше [принцип монтирования/выгрузки] Snapshot для изоляции JS при переключении приложений, и проблема тоже та же, поэтому повторяться не буду;
Shadow DOM
Shadow DOMЗвучит как действительно эффективная песочница для изоляции CSS.При той же строгой изоляции DOM, что и у iframe, элементы внутри Shadow DOM никогда не будут влиять на элементы вне его;
и будь то<style>
или<link rel="stylesheet">
Сгенерированный css не влияет друг на друга внутри и снаружи;
(Источник изображения MDN)
Звучит очень хорошо, просто поставьте Shadow DOM вне каждого суб-приложения и все будет хорошо, а ссылка style/css, вставленная в шапку суб-приложения, будет перехватываться в этом Shadow DOM;
<html>
▶︎ <head>...</head>
▼ <body>
▼ <div id="main-app" >
...
<!-- 子应用 A 对应的 shadow dom 容器 -->
▼ <div id="sub-app-a-container">
▼ #shadow-root (open)
▶︎ <style>...</style>
▶︎ <link rel="stylesheet">...</link>
▼ <div id="sub-app-a">
...
</div>
</div>
</div>
</body>
</html>
Но на самом деле, помимо совместимости, в браузерном Shadow DOM есть куча багов, а младшая версия react-dom не поддерживает события Shadow DOM, есть еще одна проблема:
всплывающая маска
Если быть точным: как быть с элементами, которые вставляются в document.body через JS в под-приложениях, таких как Tooltip/Popover/Modal?
Если они действительно вставлены в document.body, то Shadow DOM будет пропущен, и не будет CSS субприложения, и стили пропадут;
Если операция вставки захвачена документом песочницы JS, куда должны быть вставлены эти элементы Tooltip/Popover/Modal?
Если он вставлен в теневую DOM субприложения на том же уровне, что и смонтированный DOM, некоторые стили субприложения могут иметь проблемы из-за изменений в структуре DOM (порядок) или из-за расположения, размера , поля/отступы области, где расположено подприложение. Несовместимо с телом, что приводит к отклонению в позиционировании вставленного элемента (например, всплывающей подсказки), ведь не все вставленные элементы позиционируются с фиксированным положением;
Решение для хака состоит в том, чтобы поместить элемент div Shadow DOM, соответствующий каждому подприложению, в конце документа.body Свойства позиционирования, размера и поля/отступа этого элемента div и document.body точно такие же, что эквивалентно покрывающий тело выше, а теги ссылок style/css, вставленные соответствующими суб-приложениями, полностью синхронизируются внутри,
Этот div Shadow DOM используется для переноса элементов, вставленных в document.body дочерним приложением.(Требуется сотрудничество с песочницей JS), таким образом, будь то Tooltip/Popover/Modal или элементы без фиксированного позиционирования, полученный css согласуется с подприложением, а позиция выравнивается с телом, что в принципе решает проблему;
<html>
▶︎ <head>...</head>
▼ <body>
▼ <div id="main-app" >
...
<!-- 子应用 A 对应的 shadow dom 容器 -->
▼ <div id="sub-app-a-container">
▼ #shadow-root (open)
▶︎ <style>...</style>
▶︎ <link rel="stylesheet">...</link>
▼ <div id="sub-app-a">
...
</div>
</div>
</div>
<!-- 子应用 A 同步所有样式的 shadow dom 容器 -->
▼ <div id="sub-app-a-global-shadow">
▼ #shadow-root (open)
▶︎ <style>...</style>
▶︎ <link rel="stylesheet">...</link>
▼ <div id="modal">
...
</div>
</div>
</body>
</html>
Но хак не идеален, но практика, основанная на синхронном CSS, может иметь проблемы, такие как сбой синхронизации, упущение и т. д.;
- например правильно
<style>
Синхронизация внутри тега должна контролироваться все время, а синхронизация между двумя теневыми DOM должна быть взад и вперед, потому что новый может быть вставлен в любой из них.<style>
теги или в одном из оригинальных<style>
Модификации внутри тегов; - Другой пример — схема css в js, которая обычно используется для повышения производительности.CSSStyleSheet.insertRule() APIдля создания стилей, так что хотя на элементы могут влиять стили css, соответствующие
<style>
Содержимое метки полностью пусто, и ручная синхронизация на основе содержимого метки не может быть выполнена.Песочница JS должна взаимодействовать с перехватывающим API-интерфейсом insertRule для синхронизации; - И если место, куда суб-приложение вставляет dom через JS, не является document.body , а любым другим местом, в котором есть dom, его здесь также сложно захватить;
Технический долг!!
Ниже перечислены типичные технические долги, но процесс их устранения также можно рассматривать как часть процесса преобразования микроинтерфейса.
-
Перекрестная связь компонентов между модулями
Модуль представляет внутренние компоненты/методы других модулей,
Эти упомянутые элементы должны быть разделены на общедоступные компоненты/методы;
(например, компоненты дерева выражений, использующие метки для подготовки данных, компоненты визуального фильтра и т. д.)
-
Общедоступные зависимые компоненты/методы не были полностью разделены и упакованы
Общие общедоступные компоненты/публичные методы службы и т. д. требуют последующего рефакторинга и разделения
-
Преобразование режима маршрутизации URL-адресов не было выполнено (hash history => browser history)
Aeolus уже запрашивал и планировал перейти с истории хеширования на историю браузера, но это еще не сделано.
Если планируется преобразование, но преобразование микроинтерфейса было выполнено до этого, совместимость преобразования маршрутизации может быть затруднена;
Различные контейнеры микроинтерфейса имеют разные уровни поддержки режимов маршрутизации, а также имеют различную поддержку того, могут ли приложения родитель-потомок использовать разные режимы;
-
Обновление React v17 для устранения проблем с Shadow DOM
Изоляция CSS основного фреймворка имеет поддержку Shadow DOM, и React необходимо обновить до версии 17, чтобы исправить различные проблемы с Shadow DOM;
А поскольку текущая версия umi и React управляется внутренним пакетом umi, по сути, это обновление обновляется вместе с umi, и с такими особенностями, как ленивая маршрутизация новой версии umi, тоже нужно разобраться.
-
жестко закодированное имя класса jsx, записанное в коде
Большинство этих имен классов не имеют префикса, а именование очень простое (правое, левое, первое, последнее...), из-за чего очень легко вызвать конфликты, и эта часть также нуждается в преобразовании или рефакторинге; частей много кода, и их очень трудно сосчитать
-
Процессы Dev/CI/CD все еще перерабатываются (monorepo / dev preformance / ci tasks)
Трансформация самого микрофронтенда также оказывает влияние на процесс Dev/CI/CD, поэтому лучше не делать и то, и другое одновременно;
Общее повторное использование зависимостей
Микрофронтенды не решают проблему повторного использования, само по себе «повторное использование зависимостей» — это не то, чем должен заниматься фреймворк микрофронтенда, а некоторые зависимости нельзя и не следует использовать повторно (например, выполнение кода будет иметь побочные эффекты на внутренние переменные/контекст самой зависимости) (некоторые фреймворки повторно используют и извлекают npm на уровне библиотеки, но это также вызовет проблемы с фрагментами пакетов);
Какой фреймворк использовать?
Технически можно использовать любой фреймворк, дизайн каждого фреймворка в основном декларирует несколько строк легковесных и неинвазивных методов доступа, поэтому стоимость доступа и стоимость замены очень малы, дело в том, что Aeolus должен завершить расщепление модулей. ;
На самом деле, мы можем выбирать только тех, у кого есть поддерживающие службы системы управления и разработчиков, которые находятся рядом с нами, в противном случае нам нужно построить поддерживающую систему управления в соответствии с фреймворком и самостоятельно устранять проблемы с доступом на уровне исходного кода.
Поэтому нам также нужно быть готовыми к тому, чтобы отвязаться и даже заменить фреймворк микро-фронтенда в любой момент трансформации.
В какой степени его нужно переделывать?
- Внутренняя публика зависит от раскола раскола, отправки отправленного пакета
- Соответствующий модуль полностью перемещается в другой репозиторий (или каталог монорепозитория, например, apps/ ), иВозможность начать разработку самостоятельно(Потому что его можно разработать и развернуть)
- Остальное - упаковать и получить доступ согласно соответствующему рамочному документу.
- Каковы руководящие планы для конкретного фактического процесса преобразования и проектирования переходной стадии?
Refs
В ходе всего процесса перечислены наиболее актуальные и ценные статьи, которые я прочитал.
источник
Techniques, strategies and recipes for building a modern web app with multiple teams using different
Обзор
[Рекомендация] — это общий обзор микроинтерфейсов, включая эволюцию дизайна, эволюцию технологий и т. д.
- [Live Record]
- Как спроектировать и внедрить микроинтерфейс — InfoQ | Phodal
- Архитектура микро-фронтенда в действии - Вещи микро-фронтенда | Phodal
- Как спроектировать и внедрить микроинтерфейсную коробку QianKun - Fang Huan
- Что такое микро-фронтенд? - передняя часть назад
- 11 фреймворков Micro Frontend, которые вы должны знать
Webpack5 Module Federation
- Module Federation | webpack
- Webpack 5 Federation. A Game-changer to Javascript architecture. - inDepthDev
- Интенсивное чтение «Новые возможности Webpack5 — федерация модулей»
- Исследования трех приложений Исследование, углубленный анализ новой федерации функциональной модуля WebPack - Alibaba Cloud Community
- Как код, упакованный webpack, работает в браузере? Я не понимаю, почему я проигрываю
Никакой песочницы, только упаковка и повторное использование кода
Qiankun
- официальный сайт документации qiankun / umijs/qiankun Github
- @umijs/plugin-qiankun
- umijs/umi-plugin-qiankun examples
- Стремится стать наиболее полным решением для микроинтерфейса — qiankun 2.0
- Основная ценность микроинтерфейса · Yuque
- Как спроектировать и внедрить микроинтерфейсную коробку QianKun - Fang Huan
- Fliggy Micro Front-end Practice: Решение для Unified Operation Workbench
- Внедрение в песочнице решения Alibaba Cloud Open Platform Micro Front-end
- Click event not firing when React Component in a Shadow DOM
qiankun — это контейнер среды выполнения, загрузчик, но оставшиеся без ответа инженерные и платформенные вопросы
Magic microservices
Идея состоит в том, чтобы изолировать веб-компоненты, которые представляют собой слой чистого контейнера фреймворка, не включая платформу управления.
Puzzle
Bit.dev
Alfa
- Alfa | Alibaba Cloud Alfa
- GitHub.com/Alibaba Cloud/Alibaba…
- Как «обмануть» реализовать песочницу микро-фронтенда? -Сообщество разработчиков Alibaba Cloud
изоляция песочницы
- Разговор о механизме реализации песочницы js в области микроинтерфейса — лекторий Tencent
- Как «обмануть» реализовать песочницу микро-фронтенда? - Виртуальная машина облачного браузера Alibaba
- Краткий обзор веб-воркеров и песочниц JavaScript
- alibabacloud-alfa/browser-vm/src/Context.js | Основной код реализации песочницы браузера VM
Figma
- How to build a plugin system on the web and also sleep well at night
- How Plugins Run · Figma Developers
- GitHub.com/Job39/предложения…
В блоге Figma подробно рассказывается, как развивалась изоляция песочницы их системы плагинов; Figma используетRealmsи iframe того же происхождения + iframe нулевого происхождения для создания контекста для кода в песочнице.
Добро пожаловать в "Byte Front End ByteFE" Контактный адрес электронной почты для доставки резюме "tech@bytedance.com"