less than 1 minute read

基于 single-spa 来搭建一个 react 的微前端应用,主应用以及子应用都在同一个个目录下,即下方的 micro-front

Step 1 新建一个目录,并初始化

mkdir mirco-front && cd micro-front
npm init -y

Step 2 增加 webpack 配置

怎么简单怎么来,因为后面我们是用的 react,并且是用 CRA 来创建的子应用,所以这个 webpack 的基本配置需要支持 react、svg、css 等,入口文件对应的是我们下一步创建的 single-spa.config.js 文件

Step 3 增加 single-spa.config 文件

这个文件是我们微前端应用的根文件,是总的一个配置文件,文件配置看着官网的来就行,这里注册了 app1 和 app2,这两个都是用 CRA 创建的

import * as singleSpa from "single-spa"

singleSpa.registerApplication(
    "app1",
    () => import("./app1/src"),
    () => location.pathname.startsWith("/app1"),
    {}
)
singleSpa.registerApplication(
    "app2",
    () => import("./app2/src"),
    () => location.pathname.startsWith("/app2"),
    {}
)

singleSpa.start()

Step 4 创建子应用

npx create-react-app app1 app2

Step 5 改造两个子应用

目前这两个子应用还是独立的,并没有通过 single-spa 的处理,也就无法直接成为子应用,在子应用中安装 single-spa-react 这是 single-spa 提供的专门用来处理 react。的一个库,我们把我们的子应用如下处理,自行调整一下显示效果就行,用作区分就行

import React from "react"
import ReactDOM from "react-dom"
import singleSpaReact from "single-spa-react"
import App from "./App.js"

function domElementGetter() {
    return document.getElementById("app1")
}

const reactLifecycles = singleSpaReact({
    React,
    ReactDOM,
    rootComponent: App,
    domElementGetter,
})

export const bootstrap = [reactLifecycles.bootstrap]
export const mount = [reactLifecycles.mount]
export const unmount = [reactLifecycles.unmount]

⚠️ 需要注意的一点:不同的子应用有不同的容器来进行渲染,比如 app1 渲染到 id 为 app1 的标签中去,同理 app2

Step 6 新建一个 index.html 页面

就像我们原先的 SPA ,都会有一个 html 页面来进行渲染,一般里面会有一个 id = root 的容器,这里同理,不过这里是有两个容器,一个 id = app1,另一个是 app2,为了方便演示可以加两个 a 标签来做路由跳转

Step 7 启动项目

最后我们通过 webpack-dev-server 的方式启动项目,就可以看到最终的效果了

Updated: