задний план
Во внешнем интерфейсе команда внешнего интерфейса часто создает и поддерживает веб-приложение, которое использует REST API для извлечения данных из внутренних служб. Этот подход, если все сделано правильно, может обеспечить отличный пользовательский опыт. Но главный недостаток заключается в том, что одностраничные приложения (SPA) плохо масштабируются и развертываются. В связи с длительным жизненным циклом (3+ года) промежуточных и фоновых приложений, увеличением и изменением участвующих сотрудников и команд и другими характеристиками, после того, как приложение превратилось из обычного приложения в монолит внешнего интерфейса, сопутствующее приложение неподдерживаемая проблема. Этот тип проблем особенно распространен в корпоративных веб-приложениях.
В крупной компании одна-единственная фронтенд-команда может стать узким местом.
Что такое архитектура микрофронтенда?
Прежде всего, вы должны сначала понять, что такое архитектура микро-фронтенда. Архитектура микроинтерфейса — это архитектура, аналогичная микросервисам, которая применяет концепцию микросервисов к стороне браузера, то есть преобразует веб-приложение из единого монолитного приложения в приложение, объединяющее несколько небольших интерфейсных приложений в одно.
Один спа что?
single spa — это библиотека javascript, которая позволяет множеству небольших приложений сосуществовать в одностраничном приложении. Это https://single-spa.surge.sh/ Веб-сайт представляет собой демонстрационное приложение, которое показывает, что такое отдельное приложение. Идея спа состоит в том, чтобы иметь независимые автономные приложения, составляющие полную страницу. Вместо долгосрочных зависимостей от одной платформы и каждой функции единый спа-центр поможет вам адаптировать их при разработке новых платформ. Короче говоря, это универсальный клей.Использование этой библиотеки позволяет вашему приложению использовать несколько различных технологических стеков (vue, react, angular и т. д.) для синхронной разработки и, наконец, использовать общий маршрут для достижения идеального переключения. Конечно, вы также можете использовать один и тот же стек технологий для разработки в разных командах, вам нужно только использовать эту библиотеку, чтобы интегрировать их вместе и задать разные имена маршрутов.
Как запустить элемент Single spa, создать родительский проект
Первый шаг, создайте новый проект
Измените файл app.vue, чтобы добавить
<div id=“vue”></div>контейнер
Импорт файла установочного пакета
npm install single-spa --save –d
Main.js представляет файл конфигурации
import './single-spa-config.js’
- Создать дочерний проект vue-child
Введение в файл пакета
npm install single-spa-vue --save -d
Второй шаг, файл single-spa-config родительского компонента
Во-первых, давайте взглянем на основной API singleSpa.
- регистрацияЗаявка определение:
registerApplication — это самый важный API, который будет использоваться вашей корневой конфигурацией. Используйте эту функцию для регистрации любого приложения в single-spa. --- Метод для регистрации подпроектов.
appName: имя подпроекта
applicationOrLoadingFn: функция регистрации подпроекта, пользователь должен вернуть Объект жизненного цикла для single-spa. Позже мы познакомимся с механизмом жизненного цикла single-spa.
ActivityFn: функция обратного вызова принимает объект местоположения в качестве параметра, и вы можете написать собственные правила загрузки соответствующих маршрутов. метод вызова
singleSpa.registerApplication('appName’,
() => System.import('appName’),
location => location.pathname.startsWith('appName’)
)
- singleSpa.start: функция запуска
Измените файл single-spa-config родительского контейнера.
// single-spa-config.js
import * as singleSpa from 'single-spa'; //导入single-spa
import axios from 'axios’
/*runScript:一个promise同步方法。可以代替创建一个script标签,然后加载服务*/
const runScript = async (url) => {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.src = url;
script.onload = resolve;
script.onerror = reject;
const firstScript = document.getElementsByTagName('script')[0];
firstScript.parentNode.insertBefore(script, firstScript);
});
};
singleSpa.registerApplication( //注册微前端服务
'singleDemo',
async () => {
await runScript('http://127.0.0.1:3000/js/chunk-vendors.js');
await runScript('http://127.0.0.1:3000/js/app.js');
return window.singleVue;
},
location => location.pathname.startsWith('/vue-antd') // 配置微前端模块前缀
);
singleSpa.start(); // 启动
Третий шаг, регистрация субкомпонента
Измените main.js родительского проекта.
import Vue from 'vue'
import App from './App.vue'
import singleSpaVue from "single-spa-vue"
const vueOptions = {
el: "#vue",
render: h => h(App),
}
// new Vue().$mount('#app')
// singleSpaVue包装一个vue微前端服务对象
const vueLifecycles = singleSpaVue({
Vue,
appOptions: vueOptions
});
// 导出生命周期对象
export const bootstrap = vueLifecycles.bootstrap; // 启动时
export const mount = vueLifecycles.mount; // 挂载时
export const unmount = vueLifecycles.unmount; // 卸载时
export default vueLifecycles;
жизненный цикл одного спа
Существует четыре функции жизненного цикла: начальная загрузка, монтирование, размонтирование и обновление. Жизненный цикл можно передать функции, которая возвращает Promise, или массиву, который возвращает функцию Promise.
export default {
// app启动
Bootstrap: [() => Promise.resolve()],
// app挂载
Mount: [() => Promise.resolve()],
// app卸载
Unmount: [() => Promise.resolve()],
// service更新,只有service才可用
update: [() => Promise.resolve()]
}
Шаг 5. Автоматически загружать бандл и chunk.vendor
В приведенном выше коде, где родительский проект загружает дочерний проект, мы видим это. Мы хотим зарегистрировать подсервис и нам нужно загрузить сразу 2 файла JS. Если нужно загрузить больше JS, и даже бандл в рабочей среде имеет уникальный хэш, можем ли мы все же написать имя файла и список? Наша идея реализации состоит в том, чтобы позволить подпроектам использовать плагин stats-webpack-plugin и выводить файл manifest.json, содержащий только важную информацию, после каждого пакета. Родительский проект сначала ajax запрашивает файл json, считывает каталог js для загрузки из него, а затем синхронно загружает его.
Добавьте vue.config.js в подпроект и внесите следующие изменения, чтобы сгенерировать файл manifest.json.
const StatsPlugin = require('stats-webpack-plugin');
module.exports = {
….
output: {
library: "singleVue", // 导出名称
libraryTarget: "window", //挂载目标
},
/**** 添加开头 ****/
plugins: [
new StatsPlugin('manifest.json', {
chunkModules: false,
entrypoints: true,
source: false,
chunks: false,
modules: false,
assets: false,
children: false,
exclude: [/node_modules/]
})
]
/**** 添加结尾 ****/
….
};
Конечно, единственный runScript в родительском проекте уже нельзя использовать, напишите метод getManifest и разберитесь с ним.
const getManifest = (url, bundle) => new Promise(async (resolve) => {
const { data } = await axios.get(url);
// eslint-disable-next-line no-console
const { entrypoints, publicPath } = data;
const assets = entrypoints[bundle].assets;
for (let i = 0; i < assets.length; i++) {
await runScript(publicPath + assets[i]).then(() => {
if (i === assets.length - 1) {
resolve()
}
})
}
});
Сначала мы обращаемся к файлу manifest.json, деконструируем поле publicPath точек входа внутри, проходим по реальному пути js, а затем загружаем его по порядку.
async () => {
let singleVue = null;
await getManifest('http://127.0.0.1:3000/manifest.json', 'app').then(() => {
singleVue = window.singleVue;
});
return singleVue;
},
Шаг 6. Добавьте еще один новый элемент
Vue-child представляет интерфейс ant Vue-child-two представляет элемент
Также возможно использовать несколько различных технологических стеков (vue, react, angular и т. д.) для синхронной разработки.
Преимущества Единого СПА
- Agility — независимая разработка и более быстрые циклы развертывания: Команда разработчиков может выбирать собственную технологию и своевременно обновлять стек технологий. Разверните, как только один из них будет выполнен, не дожидаясь завершения всего.
- Уменьшите риск ошибок и проблем с регрессией, а взаимозависимости резко сократятся.
- Более простое и быстрое тестирование, каждое небольшое изменение больше не должно касаться всего приложения.
- Быстрее предоставляйте ценность для клиентов, упрощайте непрерывную интеграцию, непрерывное развертывание и непрерывную поставку.
Справочная статья
Это, вероятно, самое полное решение для микроинтерфейса, которое вы когда-либо видели!
Полный адрес проекта:GitHub.com/summary должен/петь…