name — имя модуля. Например, "productListing". Его используют, что подключить модуль в другое приложение.filename — имя файла. Это точка входа в микрофронтенд — код, который инициализирует необходимые объекты.exposes — компоненты, которые нужно передать от одного приложения другому. Например, микрофронтенд отвечает за страницу товаров. Здесь нужно передать все компоненты, которые нужны для отображения этой страницы.shared — зависимости, без которых сборка не будет работать. Например, мы работаем с React. Значит, используем в качестве общей библиотеки react.remotes — список подключаемых микрофронтендов. Его пишут только в конфигурации для хоста.// webpack.config.js for Product Listing
module.exports = {
name: "productListing",
filename: "remoteEntry.js",
exposes: {
'./ProductPage': './src/ProductPage',
},
shared: ["react", "react-dom"]
}; // webpack.config.js for Main App
module.exports = {
name: "mainApp",
remotes: {
"productListing": "productListing@http://example.com/productListing/remoteEntry.js",
},
shared: ["react", "react-dom"]
}; ProductPage из микрофронтенда productListing.remoteEntry.js из микрофронтенда productListing. А микрофронтенд включает экспортированный компонент ProductPage.single-spa:registerApplication — регистрирует микрофронтенда.start — запускает приложение.name — имя модуля.app — метод, с помощью которого модуль нужно загрузить по сети.activeWhen — условие, по которому подгружать модуль.// root-config.js
import { registerApplication, start } from 'single-spa';
registerApplication({
name: 'user-profile',
app: () => import('userProfile/userProfile'),
activeWhen: ['/profile']
});
registerApplication({
name: 'task-manager',
app: () => import('taskManager/taskManager'),
activeWhen: ['/tasks']
});
registerApplication({
name: 'statistics-panel',
app: () => import('statisticsPanel/statisticsPanel'),
activeWhen: ['/stats']
});
start(); index.js. С фреймворком Single SPA он выглядит так:import React from 'react';
import ReactDOM from 'react-dom';
import singleSpaReact from 'single-spa-react';
import UserProfile from './UserProfile';
const reactLifecycles = singleSpaReact({
React,
ReactDOM,
rootComponent: UserProfile,
errorBoundary(err, info, props) {
return <div>Error in UserProfile Microfrontend</div>;
},
});
export const { bootstrap, mount, unmount } = reactLifecycles;
main.single-spa.ts.import { enableProdMode, NgZone } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { Router } from '@angular/router';
import { singleSpaAngular, getSingleSpaExtraProviders } from 'single-spa-angular';
import { AppModule } from './app/app.module';
if (environment.production) {
enableProdMode();
}
const lifecycles = singleSpaAngular({
bootstrapFunction: singleSpaProps => {
return platformBrowserDynamic(getSingleSpaExtraProviders()).bootstrapModule(AppModule);
},
template: '<task-manager-root />',
Router,
NgZone: NgZone
});
export const { bootstrap, mount, unmount } = lifecycles; main.js. import Vue from 'vue';
import singleSpaVue from 'single-spa-vue';
import StatisticsPanel from './StatisticsPanel.vue';
const vueLifecycles = singleSpaVue({
Vue,
appOptions: {
render(h) {
return h(StatisticsPanel, {
props: {
// props go here
},
});
},
},
});
export const { bootstrap, mount, unmount } = vueLifecycles;