逻辑隔离
单体应用软隔离
与硬隔离相对的,笔者称为单体应用软隔离,其更多地依赖于应用框架或者开发构建流程,来实现容错与样式、

Application Composition | 应用组合
典型的应用组合方式分为构建时

构建时组合的优势在于能够进行较好地依赖管理,抽取公共模块,减少最终的包体大小,不过其最终的产出仍是单体应用,各个应用模块无法进行独立部署。与之相对的,运行时组合能够保障真正地独立开发与独立部署:

运行时组合中,我们可以选择在使用
📎 完整代码参考 fe-boilerplate/micro-frontend
window.customElements.define(
'react-app',
class ReactApp extends HTMLElement {
...
render() {
render(<App title={this.title} />, this);
}
...
}
);
然后在前端中直接使用该自定义元素:
<react-app title="React Separate Running App" />
在单体应用中,框架将路由指定到对应的组件或者内部服务中;而微前端中,我们需要将应用内的组件调用变成了更细粒度的应用间组件调用,即原先我们只是将路由分发到应用的组件执行,现在则需要根据路由来找到对应的应用,再由应用分发到对应的组件上。具体的实践中,可能宿主应用使用
应用隔离与治理
在
const subConnect = (subAppName) => (mapStateToProps, mapDispatchToProps) =>
connect(
(state) => mapStateToProps({ ...state[subAppName] }, state),
mapDispatchToProps
);
对于
`app/service-name/action`;
而对于应用治理方面,single-spa 或者 ueact-component 都定义了跨框架的组件生命周期,譬如在
const reactLifecycles = singleSpaReact({
React,
ReactDOM,
rootComponent,
domElementGetter: () => document.getElementById("main-content"),
});
export const bootstrap = [reactLifecycles.bootstrap];
export const mount = [reactLifecycles.mount];
export const unmount = [reactLifecycles.unmount];
然后将其导出为单一应用并且异步加载:
// src/index.js
import { registerApplication, start } from "single-spa";
registerApplication(
// Name of our single-spa application
"root",
// Our loading function
() => import("./root.app.js"),
// Our activity function
() => true
);
start();