尽可能减少更改代码量,对各个项目进行整合,各项目间仍然能保证代码相互独立,减少依赖交互。无论怎么合并,我们最终的需求始终是希望通过一个入口来完成所有项目应用之间的交互工作。
a)首先需要进行用户数据同步清洗,对所有用户进行整合,统一主入口登录页面(其余各类框架项目均不保留登录页),登录如下图所示,sso服务返回对应的token信息,把token存储在sso前端授权页面(授权即登录页)。

b)不同的应用进入页面时应该检查本地是否有对应的token令牌,否则执行以下步骤,拿上自身的clientId加回调网址,前往sso授权页,此时sso如果在登录期存在cookie,则直接分配一个code并按照回调地址返回。不同应用拿上code向自身服务端发起请求获取令牌和用户信息。
各应用间的请求拦截,UI也是相互独立的,比如当全局的token过期,则不是退出到自身的登录路由,而是我们多应用公用的sso前端授权登录页


做完以上步骤的改动,一个项目的整合基本初步完成,各应用之间发布互不影响,部署也是毫无影响
a)用户数据进行整合,接口统一,开发一套基座主应用,用来承载不同应用(不同框架),主应用的功能主要包含登录、顶部header等公共区域。
b)基座应用的作用就是处理各系统通用事件,如定义好公共的交互方式,让其他应用来配合接入(如:获取token、退出、loading、提示等),再如新增角色、授权,菜单分配等
c)在部署时,主项目应用通过路由的匹配规则加载了各个其他应用(框架)的js代码片段,渲染到主应用预留的dom节点。
暂时无法在飞书文档外展示此内容
function render(props: any) {
const { container } = props
ReactDOM.render(
<React.StrictMode>
<Provider store={store}>
<PersistGate loading={null} persistor={persistor}>
<BrowserRouter basename="/dvp">
<ConfigProvider virtual={true} locale={zhCN}>
<App />
</ConfigProvider>
</BrowserRouter>
</PersistGate>
</Provider>
</React.StrictMode>,
container ? container.querySelector('#root') : document.getElementById('root')
)
}
declare global {
interface Window {
__POWERED_BY_QIANKUN__: boolean
__webpack_public_path__: string
__INJECTED_PUBLIC_PATH_BY_QIANKUN__: string
qiankunLifecycle: any
}
}
declare var __webpack_public_path__: any
if (!window.__POWERED_BY_QIANKUN__) {
render({})
}
if (window.__POWERED_BY_QIANKUN__) {
__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__
}
export async function bootstrap() {
console.log(' react app bootstraped')
}
export async function mount(props: any) {
console.log('props from main framework', props)
render(props)
}
export async function unmount(props: any) {
const { container } = props
ReactDOM.unmountComponentAtNode(container ? container.querySelector('#root') : document.querySelector('root'))
}
if (process.env.NODE_ENV === 'development') {
window.qiankunLifecycle = {
bootstrap,
mount,
unmount
}
然后在html中添加以下代码在底部
<% if(process.env.NODE_ENV==='development' ) { %>
<script entry>
if (window.__POWERED_BY_QIANKUN__) {
window.purehtml = window.qiankunLifecycle;
}
script>
<% } %>
| sso单点登录 | 微前端应用整合 | ||
|---|---|---|---|
| 难度/复杂度 | ⭐️ | ⭐️⭐️⭐️ | |
| 改动点 | ⭐️ | ⭐️⭐️⭐️⭐️ | |
| 易维护 | ⭐️⭐️⭐️⭐️⭐️ | ⭐️⭐️⭐️⭐️ | |
| 代码隔离程度 | ⭐️⭐️⭐️⭐️⭐️ | ⭐️⭐️⭐️⭐️⭐️⭐️ | |
| 用户体验 | ⭐️⭐️⭐️ | ⭐️⭐️⭐️⭐️⭐️ | 前者切换应用、授权会刷新,应用内部切换菜单不会刷新,后者则都不刷新;不同框架之间的系统消息提示、loading前者会有所差距 |
| 跨应用灵活度 | ⭐️ | ⭐️⭐️⭐️⭐️ | 前者要求应用相对独立,后者可以将不同应用的菜单无感知整合到一起;如果迭代需要整合各系统的菜单,则微前端会更适合。 |