前端高级面试通关包(P7+/架构向/AI 方向,完整版)
适用人群:高级前端、前端负责人、架构向候选人、带项目/带团队角色
使用方式:把每道题练到可以连续输出 3~5 分钟,并能接住追问。
目标:体现"架构视角、工程判断、业务抽象、技术取舍"。
一、架构设计类高频题
1. 如何设计一个大型前端应用架构?
面试回答
大型前端应用的难点不只是"页面多",而是随着业务复杂度上升,代码会出现:
- 模块耦合严重
- 状态混乱
- 构建慢
- 交付风险高
- 团队协作成本高
所以设计大型前端架构,本质是在解决可维护性、可扩展性、协作效率、稳定性这几个问题。
我会从五层去设计
1)表现层(UI Layer)
负责页面展示和交互,不直接堆业务逻辑。
目标是让组件尽量:
- 职责单一
- 可复用
- 易测试
通常会拆成:
- 页面组件
- 业务组件
- 通用组件
- 基础组件库
2)状态层(State Layer)
统一管理页面状态、业务状态、缓存状态。
这里要区分:
- 局部状态:组件内部即可
- 页面状态:页面级共享
- 全局状态:用户信息、权限、主题、全局配置等
- 服务端状态:接口数据缓存、同步策略
高级面试里要体现一种判断:
不是所有状态都要放到全局。
3)服务层(Service Layer)
统一封装 API 请求、鉴权、重试、错误处理、埋点、缓存策略。
这样做的好处是:
- 业务不直接散落调用 request
- 便于切换接口版本
- 便于做统一拦截和监控
4)领域层(Domain Layer)
当业务足够复杂时,要把"业务规则"从组件中抽离出来。
例如:
- 权限判断
- 订单状态流转
- 表单引擎规则
- AI 对话上下文管理
高级工程师和普通工程师的一个差别,就是是否会把"业务规则"抽象成领域能力,而不是堆在页面里。
5)基础设施层(Infra Layer)
包括:
- 构建系统
- 路由系统
- 权限系统
- 国际化
- 监控告警
- CI/CD
- 发布体系
- 灰度策略
组织方式
根据团队规模和业务复杂度,可以选:
- 单仓多模块
- Monorepo
- 微前端
结论
大型前端架构的关键不是上什么名词,而是让系统在业务增长、团队扩大、需求变化时仍然可控。
常见追问
- 什么情况下考虑微前端?
- Monorepo 的收益和成本是什么?
- 如何避免组件库变成"超级垃圾场"?
2. 如何设计一个前端监控系统?
面试回答
前端监控系统不是简单"上报报错",而是要回答三个问题:
- 用户到底遇到了什么问题?
- 问题有多严重、影响了多少人?
- 如何快速定位和闭环?
一个完整监控系统一般包括四部分
1)采集层
采集的数据通常包括:
- JS 运行时错误
- Promise 未捕获错误
- 资源加载失败
- 接口异常
- 页面性能指标
- 用户行为路径
- 白屏、卡顿、崩溃信号
2)上报层
上报要考虑:
- 何时上报:实时 / 批量 / 空闲时
- 如何减小性能影响:节流、采样、队列
- 失败重试策略
- 离线缓存策略
3)处理分析层
服务端要做:
- 去重聚合
- sourcemap 还原
- 错误分类
- 用户影响面分析
- 版本维度分析
- 页面维度分析
4)告警与闭环层
不是所有错误都要报警。
要建立分级机制:
- P0:核心链路不可用
- P1:高频异常
- P2:普通错误或低影响问题
同时要把监控和发布版本、负责人、值班人关联起来。
面试加分点
你可以补充下面这些高级思路:
- 监控要和业务指标结合,而不只是技术错误
- 需要建立发布前后对比
- 需要结合 Session 重放或用户路径还原
- 需要考虑采样和隐私合规
常见追问
window.onerror和unhandledrejection分别能抓什么?- 跨域脚本错误为什么有时只有
Script error.? - 性能监控怎么和真实用户体验挂钩?
3. 如何建立一套性能优化体系,而不是零散优化点?
面试回答
高级岗位更看重"体系化治理",而不是背几个优化技巧。
一套完整性能体系至少包括四步
1)定义目标
先明确优化目标,不然会陷入"感觉优化"。
常见目标:
- 首屏时间
- LCP / INP / CLS
- 接口成功率
- 包体大小
- 页面可交互时间
- 卡顿率
2)建立监控
没有数据就没有治理。
需要:
- 实验室数据:Lighthouse、压测
- 真实用户数据:RUM
- 按页面、设备、地区、版本拆分
3)定位瓶颈
常见瓶颈分三类:
- 资源加载问题
- 渲染问题
- 主线程执行问题
4)制定优化策略
例如:
- 构建层:拆包、压缩、按需加载
- 请求层:缓存、预加载、CDN、接口合并
- 渲染层:虚拟列表、减少重排重绘、骨架屏
- 执行层:长任务拆分、Web Worker、延迟非关键逻辑
高级表达方式
不要说"我们做了性能优化"。
更好的说法是:
我们先建立核心页面的性能基线,再通过真实用户监控拆出低端机、高延迟网络、首访用户等场景,最后针对资源加载、主线程长任务和接口瀑布流分别治理,形成持续可追踪的性能看板和发布门禁。
常见追问
- 如何做性能回归拦截?
- 骨架屏为什么不一定等于性能好?
- 如何平衡可维护性和极致性能?
二、源码与底层原理
4. Vue3 的 reactive / effect / trigger 大致是怎么工作的?
面试回答
Vue3 响应式系统的核心链路可以概括为三步:
- 读取时收集依赖
- 修改时触发依赖
- 调度更新而不是无脑立刻重跑
1)reactive
reactive 会返回一个 Proxy 代理对象。
当你读取属性时,会进入 get 拦截;
当你修改属性时,会进入 set 拦截。
2)track(依赖收集)
在 get 阶段,如果当前存在激活中的副作用函数 activeEffect,就把这个 effect 收集到对应属性的依赖集合中。
可以理解为:
- 哪个 effect 读取了哪个属性
- 就建立一条订阅关系
3)trigger(触发更新)
当属性被 set 修改后,会找到这个属性对应的依赖集合,把相关 effect 重新执行或交给调度器处理。
4)scheduler(调度)
真正成熟的响应式系统不会每改一次都立刻同步执行所有副作用,因为那样会导致大量重复计算。
所以 Vue 会做:
- 去重
- 批量更新
- 异步刷新队列
面试里可以这样总结
Vue3 响应式的本质就是:
通过 Proxy 拦截对象访问,在读取阶段建立属性到副作用的映射关系,在写入阶段按映射关系触发更新,再通过调度器做批量和去重优化。
常见追问
- 为什么要用 WeakMap -> Map -> Set 这类结构?
- computed 和 watch 本质上也是 effect 吗?
- 为什么修改同一个属性多次最终只更新一次视图?
5. React Fiber 架构解决了什么问题?
面试回答
React Fiber 的核心价值不是"更快"这一个点,而是让 React 拥有了可中断、可恢复、可分优先级调度的更新能力。
在早期同步递归渲染模型里,一旦开始更新,就要一路执行到底。
如果组件树很大,主线程会被长期占用,页面可能卡顿,用户输入也得不到及时响应。
Fiber 解决的问题
- 把更新拆成更小的工作单元
- 允许任务被中断
- 支持不同优先级
- 让渲染阶段和提交阶段分离
两个关键阶段
Render 阶段
- 可中断
- 可暂停
- 可恢复
- 主要做 diff,生成变更结果
Commit 阶段
- 不可中断
- 把变更真正应用到 DOM
为什么重要
这让 React 可以更好地平衡:
- 用户交互响应
- 大量 UI 更新
- 动画与渲染流畅度
面试总结版
Fiber 的本质是把 React 的更新过程从"一口气做完"改造成"可调度的工作流"。
常见追问
- Fiber 节点里通常存什么信息?
- Concurrent Rendering 和 Fiber 是什么关系?
- 为什么 Commit 阶段不能随便中断?
6. React Hooks 的底层为什么和链表、调用顺序有关?
面试回答
React 函数组件每次渲染都会重新执行函数体。
那么问题来了:useState 的状态到底存在哪?
答案是:React 不把状态存在函数局部变量里,而是存在 Fiber 对应的 Hook 结构中,并依赖调用顺序依次读取。
为什么要顺序稳定
React 在渲染组件时,会按顺序处理:
- 第一个 Hook
- 第二个 Hook
- 第三个 Hook
如果某次渲染少了一个,后面所有 Hook 都会错位。
所以 Hook 不能写在条件、循环、嵌套函数里。
链表的意义
在实现层面,多个 Hook 会组织成链表或类似顺序结构,便于在渲染过程中依次读取和更新。
这也是为什么"顺序"比"名字"更重要。
高级回答方式
不要只说"因为 React 规定不能写在 if 里"。
更好的是说明:
Hooks 的调用顺序是 React 将状态槽位和当前组件实例对应起来的关键。如果顺序不稳定,状态就会发生错配。
三、复杂场景设计题
7. 百万级大数据列表如何优化?
面试回答
这种题不能只答"上虚拟列表",要体现分层治理能力。
第一层:渲染层优化
- 虚拟滚动
- 分段渲染
- 固定高度优先
- 节点复用
- 避免复杂嵌套 DOM
第二层:数据层优化
- 分页 / 游标加载
- 增量拉取
- 按需缓存
- 数据结构扁平化
第三层:计算层优化
- 昂贵计算提前预处理
- Web Worker 做重计算
- memo / 缓存结果
- 避免重复排序过滤
第四层:交互层优化
- 滚动事件节流
- 惰性渲染图片
- 预加载临近区数据
- 保留滚动位置与选中态
面试加分点
如果是表格类场景,还要考虑:
- 横向虚拟滚动
- 固定列
- 可编辑单元格
- 行高不一致
- 动态展开收起
常见追问
- 不定高虚拟列表怎么做?
- 为什么有些场景仍会分页而不是全虚拟化?
- 虚拟列表如何兼顾 SEO 和首屏?
8. 如果要设计一个低代码平台,你会怎么做?
面试回答
低代码平台本质上不是"拖拽页面"这么简单,而是把页面构建能力产品化、配置化、可扩展化。
我会拆成四个核心部分
1)Schema 设计
用结构化 JSON 描述页面:
- 组件类型
- 属性
- 样式
- 布局
- 事件
- 数据源
- 权限
- 联动规则
Schema 是平台的核心资产,决定后续扩展能力。
2)渲染引擎
根据 Schema 渲染实际页面。
这里要处理:
- 组件映射
- 生命周期
- 状态同步
- 事件分发
- 表达式执行
3)编辑器能力
可视化搭建通常包括:
- 拖拽
- 选中
- 右侧属性面板
- 图层树
- 撤销/重做
- 复制/粘贴
- 吸附对齐
4)扩展机制
平台一定要支持:
- 自定义组件
- 自定义数据源
- 自定义物料
- 插件机制
否则很快会被业务复杂度打爆。
高级风险点
- Schema 向后兼容
- 发布与回滚
- 权限隔离
- 表达式安全
- 性能
- 调试能力
常见追问
- 低代码和表单引擎有何不同?
- 怎么做物料市场?
- 如何避免平台越来越臃肿?
9. 设计一个前端权限系统,你会怎么做?
面试回答
权限系统不能只停留在"按钮隐藏"。
我一般会分三层:
1)路由级权限
控制哪些页面能进。
通常根据:
- 角色
- 权限点
- 组织身份
- 资源范围
2)组件级权限
控制按钮、菜单、操作项、字段是否可见、可编辑、可点击。
3)数据级权限
这是最关键的一层。
前端只能做展示限制,真正的数据范围控制必须由后端兜底。
例如:
- 只能看自己部门数据
- 只能编辑自己创建的记录
- 不同角色看到不同字段
架构建议
- 前端维护统一权限指令/Hook/组件封装
- 路由 meta 上配置权限点
- 按钮级权限不要散落硬编码
- 后端返回权限集和资源范围
- 前后端共同兜底
易错点
只做前端隐藏,不做后端校验,是不安全的。
四、工程化与交付能力
10. Monorepo 适合什么场景?优缺点是什么?
面试回答
Monorepo 指把多个相关项目、包、工具放在同一个仓库里管理。
它适合:
- 多个前端应用共享基础包
- 有设计系统 / 组件库 / 工具库
- 团队希望统一工程规范
- 需要原子化变更和联动升级
优点
- 代码共享方便
- 依赖版本更统一
- 跨包修改更容易原子化提交
- 统一 lint/test/build 体系
- 适合平台型团队
成本
- 仓库体积可能变大
- 构建和测试范围控制更复杂
- 权限和边界容易模糊
- 团队需要更强的工程纪律
结论
Monorepo 不是银弹。
如果团队很小、项目耦合不强、共享资产也不多,拆多个仓库可能更简单。
常见追问
- pnpm workspace、Turborepo、Nx 分别解决什么问题?
- 如何控制只构建受影响的包?
11. 微前端什么时候值得上?什么时候不值得?
面试回答
微前端适合解决"多个相对独立的前端子系统,需要在组织和技术上拆分治理"的问题。
它真正解决的是团队协作边界 和独立交付能力,而不只是技术炫技。
适合场景
- 多业务线长期并行开发
- 多团队独立发布诉求强
- 技术栈历史包袱大
- 主应用只是容器和导航入口
不适合场景
- 只是中小型单体应用
- 团队人数不多
- 业务耦合很强
- 没有独立部署的真实需求
风险
- 运行时成本增加
- 通信复杂
- 样式隔离麻烦
- 性能与调试复杂度上升
- 基础设施成本更高
面试结论
微前端的关键词不是"高级",而是"边界清晰、发布解耦、治理可控"。
没有这些前提,微前端往往得不偿失。
12. CI/CD 在前端团队里除了自动发布,还应该解决什么问题?
面试回答
高级岗位谈 CI/CD,不能只说"push 代码自动发布"。
CI/CD 的价值至少包括:
-
质量门禁
- lint
- test
- build
- 类型检查
- 包体积阈值
- 性能基线
-
稳定发布
- 多环境发布
- 灰度发布
- 回滚机制
- 版本记录
-
交付效率
- 自动化脚本
- 环境一致性
- 减少手工发布失误
-
安全合规
- 依赖漏洞扫描
- 密钥管理
- 审计记录
高级加分点
把 CI/CD 和以下内容串起来:
- 发布监控
- 发布后指标对比
- 异常自动告警
- 回滚自动化
这样就不是"流水线",而是"交付体系"。
五、AI + 前端系统设计
13. 如何从工程角度设计一个 ChatGPT 类前端产品?
面试回答
这个题不是考你能不能调通接口,而是看你有没有产品化和系统化思维。
前端核心模块
- 会话列表
- 消息流渲染
- 输入框与快捷操作
- 停止生成 / 重新生成
- markdown / 代码块渲染
- 引用来源展示
- 附件、图片、文件处理
- 权限与配额展示
状态设计
我通常会把状态拆为:
- 会话状态
- 当前输入状态
- 生成状态
- 流式消息状态
- 错误状态
- 配置状态(模型、温度、工具开关等)
关键工程点
1)流式传输
需要支持 chunk 级别更新,而不是整段替换。
2)中断能力
用 AbortController 或连接级中止。
3)上下文裁剪
历史消息不能无限叠加,需要按 token 或业务规则裁剪。
4)错误恢复
- 网络重试
- 断流兜底
- 消息去重
- 重连提示
5)性能
- 长消息渲染优化
- 代码块懒高亮
- 历史消息虚拟滚动
高级表达
可以补一句:
AI 产品前端的难点已经不只是"把结果展示出来",而是如何围绕流式生成、上下文控制、长消息渲染和失败恢复,建立一套稳定的交互系统。
14. RAG 系统在前端侧有哪些关键设计点?
面试回答
很多人以为 RAG 都是后端和算法的事,其实前端也有不少关键职责。
前端要处理的点
-
检索状态展示
- 正在检索
- 检索成功
- 无结果
- 来源列表
-
引用内容展示
- 来源文档
- 段落高亮
- 跳转原文
- 多来源合并展示
-
可信度表达
- 哪句话来自引用
- 哪句话是模型生成补充
- 用户是否能溯源
-
交互设计
- 用户追问
- 切换知识库
- 筛选来源
- 切换"仅依据资料回答"模式
-
异常与兜底
- 检索失败
- 检索为空
- 引用内容和回答不一致
高级理解
RAG 前端的核心不是"把几条来源列出来",而是帮助用户判断:
- 这个回答靠不靠谱
- 依据来自哪里
- 我还能怎么继续追问
15. Prompt 工程在前端产品设计里怎么体现?
面试回答
前端不会直接"训练模型",但很多 AI 产品里,Prompt 本身就是一种产品配置和工程资产。
前端视角下的 Prompt 工程
-
结构化配置
- system prompt
- 用户输入
- 上下文
- 检索结果
- 工具输出
-
模板管理
- 不同场景对应不同模板
- 便于灰度、AB、配置化调整
-
输入约束
- 长度限制
- 敏感内容过滤
- 指令注入防护提示
-
输出约束
- JSON 模式
- 固定格式
- 多语言格式要求
- 引用样式要求
高级面试回答方式
你可以说:
Prompt 在产品层其实类似"行为策略配置"。好的前端架构不会把 Prompt 直接写死在组件里,而是会通过模板层、策略层或配置中心管理,让不同业务场景可迭代、可灰度、可追踪。
六、手写与实现思维
16. 如果让你手写一个简单响应式系统,你会怎么讲思路?
面试回答
手写时不要只给代码,要先讲结构:
核心目标
当读取一个属性时收集依赖;
当修改这个属性时,自动重新执行依赖它的副作用函数。
关键数据结构
可以用:
WeakMap存 targetMap存 keySet存 effect
结构类似:
WeakMap -> Map -> Set
为什么这样设计
- 一个对象有多个属性
- 一个属性可能被多个 effect 依赖
- Set 可以去重
基本流程
- 执行
effect(fn) - 设置
activeEffect = fn - 读取响应式对象属性时触发
track - 修改属性时触发
trigger - 找到相关 effect 重跑
高级补充
真实框架里还会处理:
- 嵌套 effect
- 清理旧依赖
- scheduler
- computed
- watch
- 批量更新
面试加分点
你不是在"背 Vue 源码",而是在展示你能把一个复杂系统抽成最小可运行模型。
七、管理与协作向问题
17. 高级前端如何做技术方案评审?
面试回答
技术方案评审不只是"选技术栈",而是要评估:
- 目标是否清晰
- 边界是否明确
- 风险是否可控
- 成本是否合理
- 上线后是否可观测
我通常会看这些维度
- 业务目标
- 约束条件
- 技术方案选型
- 性能影响
- 安全风险
- 兼容性
- 迁移成本
- 发布方案
- 回滚方案
- 监控方案
高级表达
好的技术评审不是证明"我方案最先进",而是证明"这个方案在当前业务和团队条件下最合适"。
18. 如何带团队提升代码质量,而不是只靠 Code Review?
面试回答
代码质量不能只靠某个资深同学兜底 Review,否则人一忙系统就失效。
更有效的方式是建立"工具 + 规范 + 流程 + 文化"的组合机制。
常见做法
- 统一 lint / format / type check
- 关键模块补测试
- PR 模板和评审清单
- 架构分层约束
- 组件和接口文档
- 线上问题复盘反哺规范
高级理解
Code Review 解决的是"发现问题",
架构治理和工程门禁解决的是"减少问题出现"。
八、面试实战建议
19. 高级面试回答时,如何体现"技术判断力"?
建议回答方式
不要只说"能做什么",而要说清:
- 为什么这样做
- 不这样做会有什么问题
- 这个方案的成本是什么
- 在什么边界下它不适合
- 如果业务变化,方案怎么演进
示例
不要只说:
我们用了微前端。
更好的说法是:
我们当时上微前端不是为了追新,而是因为三个子业务由三个团队独立开发、发布节奏不同,而且技术栈历史包袱较重。我们评估了统一重构成本后,最终选择在壳应用层统一权限、导航和埋点,子应用独立部署,以换取组织协作效率,但也接受了运行时复杂度上升的代价。
20. 高级前端在 2026 年面试中,AI 相关内容通常问到什么深度?
面试回答
通常不会要求你会训练模型,但会越来越看重这三类能力:
-
AI 产品工程化能力
- 流式响应
- 会话状态
- Prompt 策略
- 错误恢复
- 引用展示
-
AI 系统理解能力
- RAG
- embedding
- 上下文窗口
- 工具调用
- 幻觉与评测
-
AI 提效落地能力
- 如何把 AI 用到业务流程
- 如何设计 Copilot / 助手类功能
- 如何评估 AI 方案收益和风险
结论
对高级前端来说,AI 已经不是"可选加分项",而是在很多团队里开始变成"你是否具备下一代产品能力"的信号项。
九、最后的练习方式
建议你这样训练
- 每题先用自己的话讲 2 分钟
- 再补上一个真实项目案例
- 再准备两个取舍点和一个失败经验
- 最后练习"面试官追问"
你最终要达到的状态
不是只会回答"是什么",而是能稳定回答:
- 为什么这样设计
- 为什么不是别的方案
- 这个方案带来了什么收益
- 它的成本和边界是什么
这就是高级岗位真正的分水岭。