Qiankun — это микро-фронтенд фреймворк, построенный на основе single-spa, который позволяет объединять несколько независимых фронтенд-приложений в одно целое. Основная цель Qiankun — облегчить масштабирование крупных проектов и позволить отдельным командам работать автономно над различными модулями. В контексте Vue.js Qiankun предоставляет простой способ интеграции Vue-приложений в архитектуру микро-фронтендов.
Для работы с Qiankun необходимо установить основной пакет:
npm install qiankun --save
Кроме того, потребуется базовая настройка Vue CLI для каждого микроприложения, чтобы оно корректно экспортировалось и могло работать в контейнере.
Пример структуры проекта:
root-project/
│
├─ main-app/ # Контейнерное приложение
├─ vue-app1/ # Микроприложение 1
└─ vue-app2/ # Микроприложение 2
Каждое микроприложение Vue должно экспортировать life cycle
hooks для Qiankun: bootstrap, mount,
unmount.
// vue-app1/src/main.js
import { createApp } from 'vue';
import App from './App.vue';
let app = null;
function render() {
app = createApp(App);
app.mount('#app');
}
export async function bootstrap() {
console.log('vue-app1 bootstrap');
}
export async function mount() {
console.log('vue-app1 mount');
render();
}
export async function unmount() {
console.log('vue-app1 unmount');
app.unmount();
}
Контейнерное приложение управляет всеми микроприложениями. Для
регистрации и запуска микроприложений используется функция
registerMicroApps:
import { registerMicroApps, start } from 'qiankun';
registerMicroApps([
{
name: 'vue-app1',
entry: '//localhost:7100',
container: '#container',
activeRule: '/app1',
},
{
name: 'vue-app2',
entry: '//localhost:7200',
container: '#container',
activeRule: '/app2',
},
]);
start();
Ключевые моменты:
entry — URL микроприложения. Qiankun автоматически
загружает его скрипты и стили.container — DOM-элемент в контейнерном приложении, куда
будет монтироваться микроприложение.activeRule — правило маршрутизации, при котором
приложение активируется.Qiankun требует отдельной настройки роутинга и состояния для микроприложений:
import { createRouter, createWebHistory } from 'vue-router';
import Home from './views/Home.vue';
export const router = createRouter({
history: createWebHistory('/app1/'),
routes: [
{ path: '/', component: Home },
],
});
// В контейнере
const globalState = {
user: null
};
function setGlobalState(state) {
Object.assign(globalState, state);
window.dispatchEvent(new CustomEvent('globalStateChange', { detail: globalState }));
}
// В микроприложении
window.addEventListener('globalStateChange', (e) => {
console.log('Новое состояние', e.detail);
});
Qiankun обеспечивает CSS isolation, предотвращая конфликт стилей между микроприложениями. Это достигается с помощью Shadow DOM или ограниченного CSS prefixing. Для Vue это особенно важно, чтобы стили компонентов не влияли на контейнер или другие микроприложения.
// В конфигурации webpack микроприложения
module.exports = {
css: {
extract: false
}
};
Qiankun поддерживает четыре ключевых этапа жизненного цикла:
bootstrap — однократная инициализация, выполняется
перед первым монтированием.mount — монтирование микроприложения в контейнер.unmount — размонтирование приложения, очистка
ресурсов.update — опциональный хук, вызывается при обновлении
состояния или пропсов.Эти хуки позволяют Vue-приложениям корректно работать внутри Qiankun без утечек памяти и конфликтов событий.
Qiankun поддерживает lazy loading микроприложений, что снижает время начальной загрузки контейнера:
registerMicroApps([
{
name: 'vue-app1',
entry: () => fetch('//localhost:7100/asset-manifest.json').then(res => res.json()),
container: '#container',
activeRule: '/app1',
},
]);
Также возможно динамическое подключение CSS и JS через
import() и CDN, что облегчает версионирование и обновление
микроприложений.
Для обмена данными между микроприложениями и контейнером Qiankun предоставляет global state API. Через него можно реализовать уведомления, синхронизацию пользователя или общие данные:
import { initGlobalState } from 'qiankun';
const state = initGlobalState({ user: null });
state.onGlobalStateChange((newState, prev) => {
console.log('Состояние изменилось', newState, prev);
});
state.setGlobalState({ user: { name: 'Alice' } });
Vue 3 и Composition API хорошо сочетаются с Qiankun благодаря
модульной архитектуре. Использование setup() позволяет
изолировать логику компонентов, что упрощает их загрузку и
размонтирование в контейнере. Рекомендуется использовать
ref и reactive для локального состояния, а
глобальные события Qiankun — только для синхронизации между
микроприложениями.
Qiankun обеспечивает структурированное, масштабируемое решение для организации крупных фронтенд-проектов, позволяя Vue.js-приложениям работать автономно и эффективно в составе единого контейнера.