面试题答案
一键面试面临的挑战
- 路由冲突:不同微前端应用可能使用相同的路由路径,导致路由匹配冲突。例如,主应用和子应用都定义了
/home
路由。 - 资源加载协调:各个微前端应用独立进行懒加载和代码分割,可能出现重复加载相同模块的情况,浪费资源。比如多个子应用都依赖同一个工具库,各自加载一份。
- 全局状态管理:React Router 懒加载组件可能在不同微前端应用间切换时,难以保持全局状态的一致性。例如,用户登录状态在切换路由时丢失。
- 样式隔离:懒加载的组件样式可能与其他微前端应用的样式产生冲突。如某个子应用的按钮样式影响到主应用的按钮。
解决方案
- 路由命名空间
- 方案:为每个微前端应用定义一个唯一的路由前缀作为命名空间。例如,主应用路由为
/main/*
,子应用 A 路由为/sub - a/*
,子应用 B 路由为/sub - b/*
。 - 场景:假设电商平台主应用管理全局页面,商品子应用管理商品展示。主应用路由为
/shop
,商品子应用路由为/shop/products
,这样避免了路由冲突。
- 方案:为每个微前端应用定义一个唯一的路由前缀作为命名空间。例如,主应用路由为
- 共享资源管理
- 方案:使用一个共享的资源加载器,将多个微前端应用共用的模块提取出来,统一加载。可以通过 Webpack 的
externals
配置,将共用库(如 React、Redux)设置为外部依赖,由主应用或一个统一的入口加载。 - 场景:多个微前端应用都使用
lodash
工具库,主应用先加载lodash
,子应用通过共享方式使用,避免重复加载。
- 方案:使用一个共享的资源加载器,将多个微前端应用共用的模块提取出来,统一加载。可以通过 Webpack 的
- 全局状态共享
- 方案:采用全局状态管理工具,如 Redux 或 MobX。在主应用中创建一个全局状态仓库,各个微前端应用通过订阅和派发操作来更新和获取状态。在 React Router 懒加载组件切换时,通过状态管理工具保持状态一致性。
- 场景:用户登录后,登录状态存储在全局 Redux 仓库中,无论在主应用还是子应用中切换路由,都能从仓库获取到登录状态。
- 样式模块化与隔离
- 方案:使用 CSS Modules 或 Shadow DOM 来实现样式的模块化和隔离。CSS Modules 为每个组件生成唯一的类名,Shadow DOM 将组件的样式和结构封装起来,不与外部样式冲突。
- 场景:在一个微前端应用的按钮组件中使用 CSS Modules,生成类似
.button_abc123
的唯一类名,不会影响其他应用的按钮样式。