jitu 面试记录

2025-01-01
jitu
前端开发

jitu 面试记录

面试日期:2025-01-01
面试公司:jitu
应聘职位:前端开发

面试关键词

微前端架构 | 依赖管理 | 状态管理 | 技术难点 | 异常监控 | 监控优化


🏗️ 微前端架构

为什么使用微前端?

当前部门只是一个业务部,所在的部门是物流部,还有其他部门,负责的业务是物流相关的业务,前端代码量上百万行时,多人开发,耦合度很高,改动一个模块容易影响全局,测试、构建、部署都很慢。

qiankun 微前端方案的优势:

  • 业务模块划分:可以将寻源、物流、订单、支付等模块拆分,每个子应用可以独立开发、测试、发布,不会影响其他模块
  • 技术栈渐进升级:老项目 jQuery、AngularJS 迁移到 Vue/React 重构成本太高,可以采用微前端,新项目使用新的技术栈,老项目保持原来的技术栈,新老功能共存
  • 容错能力强:每个子模块相互独立,某个模块崩溃都不会影响整体
  • 按需加载:支持按需加载,减少首屏体积,提升性能

📦 依赖管理

全局 CDN 插件、工具库,版本挂载到主应用 window 上,怎么去做统一的升级?

方案一:Window 对象挂载

  • 将工具或者组件挂载在主应用 window 上,子应用可以通过 window 来访问组件或者库

方案二:映射表管理

  • 主应用维护一个组件或者工具的映射表挂在 window 上,主应用在启动的时候加载这些依赖,子应用再去相应的检测、加载

方案三:CDN 软链/别名

  • 自建 CDN 或者 OSS 的话,通过软链/别名实现灰度发布升级,主应用子应用代码都不改变

方案四:模块联邦

  • 模块联邦依赖共享(缺点:主子应用都必须使用 webpack5)

🔄 状态管理

两个系统的状态管理怎么做,比如登录后将信息共享到所有子应用?

方案一:Props 传递

  • 主应用加载子应用时,通过 props 传递数据给子应用

方案二:共享 Storage

  • 使用 LocalStorage + StorageEvent 实现跨应用状态共享

⚙️ 技术难点

微前端有没有遇到印象深刻的技术难点,怎么解决?

难点一:公共依赖版本冲突

问题描述:

  • 例如主应用 React 18,子应用是 React 16 以下,打包时 React 加载了两份

解决方案:

  • 使用 externals 配置公共依赖,主应用通过 CDN 统一引入 React/Vue
  • 子应用通过 webpack 配置 externals,不再打包这些依赖

难点二:主应用统一登录,但进入子应用时状态丢失

问题描述:

  • 子应用无法访问主应用的 store

解决方案:

  • 通过 props 传递注入给子应用
  • 或者使用 BroadcastChannel 进行跨应用通信

难点三:样式污染

解决方案:

  • 使用 CSS Module,加上 module 配置
  • 使用 createShadowRoot() 包裹子应用根节点,实现样式隔离
  • 使用 qiankun 沙箱样式隔离功能

难点四:每次切换都要重新加载 bundle.js,加载慢

解决方案:

  • 采用预加载策略,使用首屏加载(Service Worker)技术

难点五:非父子间通信

解决方案:

  • 使用全局事件总线
  • 基于 Shared Worker 或 BroadcastChannel 实现跨应用通信

🔍 异常监控

如何优化线上异常日志监控?

1. 框架级捕获

  • React 使用 ErrorBoundary 组件进行错误边界处理
  • Vue 使用 app.config.errorHandler 进行全局错误处理

2. Source Map 上报

  • 部署前将 sourcemap 上传到监控平台 Sentry 上去,开启堆栈反解码,便于定位生产环境的错误代码位置

🛠️ 监控优化

监控平台误报怎么处理,U1库的源码报错怎么忽略?

方案一:Sentry 配置规则

  • 在 Sentry 后台配置过滤规则:Project Settings → Inbound Filters(或 Issue Stream → Ignore)

方案二:代码层过滤

  • 在 Sentry.init() 中使用 beforeSend 回调,可以在上报前过滤掉特定类型的报错,例如第三方库的错误

总结

本次面试主要围绕微前端架构展开,涉及的核心问题包括:

  • 架构设计:微前端的价值、qiankun 方案的优势
  • 工程化:CDN 依赖管理、版本升级策略
  • 状态管理:跨应用状态共享方案
  • 问题解决:依赖冲突、状态丢失、样式污染、性能优化等
  • 监控体系:异常捕获、Source Map、误报过滤

通过这次面试,深入了解了微前端在大型项目中的实际应用场景和解决方案。