模块五 · AI 协作与表达
面试表达:把 Vue 知识讲成三分钟
面试不是背 API,而是展示判断。这一节给出"结论—机制—取舍—验证"的表达骨架,以及五个高频题的答法与追问应对。
读完这一节,你能做到
- 用四步结构回答任何原理类问题。
- 把响应式、diff、nextTick、组件通信、性能五个高频题讲到点上。
- 用一个项目案例讲清自己的判断与代价。
- 应对"如果重来/为什么不用 XX"这类追问。
一、四步表达骨架
结论(一句话判断)
→ 机制(底层怎么实现)
→ 取舍(为什么这样设计,代价是什么)
→ 验证(怎么证明你说的对)
示例:问"为什么 Vue3 用 Proxy"。
- 结论:为了完整的拦截能力与更好的嵌套处理。
- 机制:Proxy 能拦截新增、删除、数组索引;嵌套对象惰性代理。
- 取舍:放弃 IE 兼容,换来语义完整;每次读写有陷阱开销。
- 验证:对比 defineProperty 无法监听
obj.newKey = 1,Proxy 可以。
二、五个高频题
1. 响应式原理
"渲染时读取数据,track 把当前 effect 记入依赖集合;数据变化时 trigger 取出依赖,交给调度器批量更新。Vue3 用 Proxy 做读写拦截,嵌套对象惰性代理。"
2. diff 为什么快
"同层比较 + 双端复用 + key 匹配;编译期用补丁标记告诉 diff 只比较哪类属性,Block Tree 把动态节点收集成扁平数组,避免遍历整棵树。"
3. nextTick 是什么
"把回调放到更新队列刷新之后执行。Vue 的更新是异步批量的,改完数据立刻读 DOM 拿到的是旧值,所以要等 nextTick。"
4. 组件通信怎么选
"props/emit 优先,跨层级用 provide/inject,结构可变用插槽,跨页面用 Pinia。选择标准是依赖是否清晰,而不是哪个方便。"
5. 性能怎么优化
"先测量,再按渲染、响应式、加载、运行时四层定位。常用手段是拆组件、v-memo、虚拟滚动、shallowRef、路由懒加载;每一项都要有前后对比。"
三、项目案例模板
背景:业务、规模、你的角色
问题:具体指标(首屏 4.2s、列表滚动 20fps)
动作:为什么选这个方案,排除了哪些
结果:指标变化 + 代价
反思:如果重做会怎么改
不要只说"用了虚拟滚动",要说"列表 2,000 行、滚动 18fps,虚拟滚动后稳定 55fps,代价是不定高需要额外测量"。
四、追问应对
| 追问 | 回答骨架 |
|---|---|
| 为什么不用 React? | 团队栈、生态、开发效率,讲取舍不拉踩 |
| 如果数据量再大 10 倍? | 分页/虚拟滚动/服务端聚合,先算瓶颈 |
| 这个优化真的有效吗? | 基线、单变量、前后对比 |
| 失败过什么? | 假设 → 动作 → 结果 → 复盘 |
| 看过源码吗? | 讲一个具体模块(如 effect、patch),不要泛泛而谈 |
五、五个追问的完整答法
问:Proxy 一定比 defineProperty 好吗? 答:不是。Proxy 语义完整,但有兼容性与陷阱开销;defineProperty 在只监听已有属性、且需要兼容旧环境时仍有价值。选型看约束,不看潮流。
问:为什么 diff 不能做到 O(1)? 答:因为列表顺序可能任意变化,最少移动次数需要计算最长递增子序列;不做这一步也能更新,但会产生多余 DOM 操作。
问:computed 能不能替代 watch? 答:不能。computed 是派生值,要求纯函数;watch 是副作用,可以发请求、操作 DOM、写日志。用 computed 做副作用会让缓存失效逻辑变得不可预测。
问:Pinia 和 Vuex 的区别? 答:Pinia 去掉 mutation,action 可直接改 state,TypeScript 推导更好,模块天然扁平。Vuex 的 mutation 是为了 devtools 追踪,Pinia 用订阅机制替代。
问:你项目里最难的技术问题是什么? 答:讲一个具体的、有你判断的过程:现象、排查、假设、验证、结果、代价。不要讲“用了什么框架”。
六、如何讲源码而不翻车
- 只讲你真正读过的模块,比如
effect的 track/trigger、patch的同层比较。 - 先讲设计意图,再讲实现细节,最后讲边界。
- 不确定的地方直接说“这块我没读到”,比编造更加分。
- 用“我记得大概是……”开头,给出可验证的线索,而不是绝对化结论。
七、面试前的准备
准备三个案例:一个性能、一个架构、一个失败。每个都按“背景—问题—动作—结果—反思”写成一页纸,比临时回忆更可靠。
表达节奏:原理题控制在 2-3 分钟,项目题 3-5 分钟,留出被打断的空间。面试官打断不是坏事,说明他想深挖,顺着他的问题往下讲,不要硬把准备好的稿子念完。
反问环节问两个有价值的问题:团队目前最大的技术痛点是什么、这个岗位前三个月最重要的目标是什么。不要问“加不加班”“用什么框架”这类可以在网上查到的信息。
面试的本质是降低对方的判断成本:清晰的结论比完整的背景更重要,把“我做了什么”换成“我为什么这么做”,把“结果很好”换成“指标从多少到多少”。结论先行,细节随后;讲得清,比讲得多重要。
八、常见坑
- 只背结论,讲不出机制。
- 把"响应式"说成"监听数据变化的事件"。
- 案例只有动作,没有指标与代价。
- 遇到不会的硬编,不如说"这块我没深挖,我的理解是……"。
- 贬低其他框架来抬高自己。
九、动手任务:自写 → AI 写 → 对比 → 取舍
四步不跳:① 自己写(限时,关掉补全)→ ② 让 AI 写同一题 → ③ 逐条比对 → ④ 说出保留谁的写法。 完整动作与记录模板见《AI 协作与代码评审》。
① 自己写
选一个你做过的页面,用四步结构讲清一次性能优化,要求:
- 至少两个指标的前后对比。
- 至少一个"代价"或"没做好的地方"。
- 结尾给出"如果重做会怎么改"。
② 让 AI 写同一题
把同一道题交给 AI:用三分钟讲清 Vue 的响应式原理,要求机制、取舍、验证三段,并给出具体数字。
③ 对比要盯的点
- 它有没有具体项目与数字?还是“大幅提升”“明显变快”。
- 机制讲到哪一层?停在“Proxy 拦截”还是能说到依赖图与调度时机。
- 追问一层会不会断?比如“为什么数组下标赋值在 Vue 3 里能触发、Vue 2 里不能”。
④ 一句话取舍
它哪一句是正确的空话,一追问就塌?
十、自测
- 四步表达骨架是什么?
- diff 快的两个关键原因是什么?
- 为什么改完数据要等 nextTick 才能读 DOM?
- 组件通信的选择标准是什么?
- 项目案例最容易被追问什么?
参考答案要点:结论/机制/取舍/验证;同层比较与补丁标记;更新是异步批量;依赖清晰;指标与代价。
配套题目
★ 越多越该先背;点题目可看完整答案与深入版。
提示:读完可以顺手做几道对应题目,检验是否真的理解