知

模块五 · AI 协作与表达

第 17 / 17 节16 分钟阅读型

面试表达:把 Vue 知识讲成三分钟

面试不是背 API,而是展示判断。这一节给出"结论—机制—取舍—验证"的表达骨架,以及五个高频题的答法与追问应对。

读完这一节,你能做到

  1. 用四步结构回答任何原理类问题。
  2. 把响应式、diff、nextTick、组件通信、性能五个高频题讲到点上。
  3. 用一个项目案例讲清自己的判断与代价。
  4. 应对"如果重来/为什么不用 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 分钟,留出被打断的空间。面试官打断不是坏事,说明他想深挖,顺着他的问题往下讲,不要硬把准备好的稿子念完。

反问环节问两个有价值的问题:团队目前最大的技术痛点是什么、这个岗位前三个月最重要的目标是什么。不要问“加不加班”“用什么框架”这类可以在网上查到的信息。

面试的本质是降低对方的判断成本:清晰的结论比完整的背景更重要,把“我做了什么”换成“我为什么这么做”,把“结果很好”换成“指标从多少到多少”。结论先行,细节随后;讲得清,比讲得多重要。

八、常见坑

  1. 只背结论,讲不出机制。
  2. 把"响应式"说成"监听数据变化的事件"。
  3. 案例只有动作,没有指标与代价。
  4. 遇到不会的硬编,不如说"这块我没深挖,我的理解是……"。
  5. 贬低其他框架来抬高自己。

九、动手任务:自写 → AI 写 → 对比 → 取舍

四步不跳:① 自己写(限时,关掉补全)→ ② 让 AI 写同一题 → ③ 逐条比对 → ④ 说出保留谁的写法。 完整动作与记录模板见《AI 协作与代码评审》。

① 自己写

选一个你做过的页面,用四步结构讲清一次性能优化,要求:

  • 至少两个指标的前后对比。
  • 至少一个"代价"或"没做好的地方"。
  • 结尾给出"如果重做会怎么改"。

② 让 AI 写同一题

把同一道题交给 AI:用三分钟讲清 Vue 的响应式原理,要求机制、取舍、验证三段,并给出具体数字。

③ 对比要盯的点

  • 它有没有具体项目与数字?还是“大幅提升”“明显变快”。
  • 机制讲到哪一层?停在“Proxy 拦截”还是能说到依赖图与调度时机。
  • 追问一层会不会断?比如“为什么数组下标赋值在 Vue 3 里能触发、Vue 2 里不能”。

④ 一句话取舍

它哪一句是正确的空话,一追问就塌?

十、自测

  1. 四步表达骨架是什么?
  2. diff 快的两个关键原因是什么?
  3. 为什么改完数据要等 nextTick 才能读 DOM?
  4. 组件通信的选择标准是什么?
  5. 项目案例最容易被追问什么?

参考答案要点:结论/机制/取舍/验证;同层比较与补丁标记;更新是异步批量;依赖清晰;指标与代价。

配套题目

★ 越多越该先背;点题目可看完整答案与深入版。

提示:读完可以顺手做几道对应题目,检验是否真的理解