React & Vue 资深工程师面试题
React & Vue 资深工程师面试题(附详细解答)
以下题目聚焦核心原理、性能优化、工程化、进阶特性等资深工程师考察维度,覆盖 React(含 React 18)和 Vue3 核心考点,解答兼顾原理与实践。
一、React 资深面试题
1. React Fiber 架构的设计原理及解决的核心问题
解答:
Fiber 是 React 16 重构的核心协调(Reconciliation)引擎,解决了传统 Stack Reconciler 的核心痛点:
- 旧架构问题:递归遍历虚拟 DOM 树,更新过程不可中断,长任务(如复杂列表渲染)会阻塞主线程(UI 渲染、事件响应),导致页面卡顿。
- Fiber 核心设计:
- 数据结构:将递归的树结构改为链表结构(Fiber 节点包含
child/sibling/return指针),支持“中断-恢复”遍历; - 可中断调度:基于时间切片(Time Slicing,React 18 内置),每次只执行一个小任务,剩余时间交还主线程,超过 5ms 则暂停;
- 优先级调度:通过 Lane 模型(React 18 替代旧的 expirationTime)区分任务优先级(如用户输入 > 动画 > 数据请求 > 低优渲染),高优任务可抢占低优任务;
- 双缓存 Fiber 树:当前渲染的
current Fiber树 + 待更新的workInProgress Fiber树,更新完成后切换,避免中间状态。
- 数据结构:将递归的树结构改为链表结构(Fiber 节点包含
- 执行流程:
- 调度阶段(Scheduler):接收任务,按优先级分配时间片;
- 协调阶段(Reconciliation):遍历 Fiber 树,对比虚拟 DOM,标记更新(可中断);
- 提交阶段(Commit):将协调阶段的更新应用到真实 DOM(不可中断)。
2. React Hooks 闭包陷阱的成因及解决方案
解答:
- 成因:函数式组件每次渲染都是独立闭包,Hooks 会“捕获”当前渲染周期的变量/状态;若异步操作(定时器、网络请求)引用了旧状态,会导致读取到过期值。
示例:1
2
3
4
5
6
7
8
9
10function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
const timer = setTimeout(() => {
console.log(count); // 点击按钮后,定时器仍输出 0(旧值)
}, 1000);
return () => clearTimeout(timer);
}, []); // 依赖为空,闭包捕获初始 count
return <button onClick={() => setCount(count + 1)}>点击</button>;
} - 解决方案:
- useRef 保存最新值:ref 的
.current不受闭包影响,始终指向最新值; - useCallback/useMemo 缓存依赖:补全 useEffect 依赖项,结合 useCallback 缓存回调;
- 函数式更新:useState 的更新函数接收旧状态,避免直接引用闭包变量;
- useEvent(React 18+):封装异步回调,自动绑定最新状态(替代自定义 ref 方案)。
- useRef 保存最新值:ref 的
3. React 18 并发渲染(Concurrent Rendering)的核心思想及应用场景
解答:
- 核心思想:“渲染可中断”,React 可在渲染过程中暂停、放弃、恢复渲染,优先处理高优先级任务(如用户输入、动画),而非一次性完成所有渲染,提升交互流畅度。
- 核心特性:
startTransition:标记低优先级更新(如搜索结果渲染),不阻塞高优操作;useDeferredValue:延迟更新值,为高优任务让路;Suspense增强:支持数据请求 Suspense(结合 React Query/SWR)、流式 SSR;- 自动批处理(Automatic Batching):合并多个 setState,减少渲染次数。
- 应用场景:
- 搜索框输入:输入(高优)即时响应,搜索结果(低优)延迟渲染;
- 大数据列表:滚动加载时,列表渲染不阻塞滚动事件;
- 模态框/弹窗:弹窗渲染不阻塞页面交互。
4. React SSR(服务端渲染)与 Next.js 核心实现原理
解答:
- SSR 对比 CSR:
维度 SSR(服务端渲染) CSR(客户端渲染) 首屏加载 快(服务端返回完整 HTML) 慢(需下载 JS 后渲染) SEO 友好(HTML 含完整内容) 差(初始 HTML 为空) 交互体验 需 hydrate 注水后交互 交互流畅(客户端渲染) 服务端压力 大(每次请求生成 HTML) 小(仅提供静态资源) - Next.js 核心原理:
- 文件路由:基于
pages/app目录自动生成路由,无需手动配置; - 数据获取:
getServerSideProps:每次请求时服务端获取数据,纯 SSR;getStaticProps+getStaticPaths:构建时预渲染(SSG),适合静态页面;ISR(增量静态再生):缓存 SSG 页面,定时/按需更新,兼顾性能与实时性;
- 渲染流程:
- 服务端:
ReactDOMServer.renderToString生成 HTML 字符串,返回给客户端; - 客户端:
ReactDOM.hydrate复用服务端 HTML,绑定事件(注水),完成交互激活。
- 服务端:
- 文件路由:基于
二、Vue 资深面试题
1. Vue3 响应式系统重构原理(对比 Vue2)
解答:
- Vue2 响应式:基于
Object.defineProperty,存在天然缺陷:- 只能监听对象属性,无法监听数组下标/长度、新增/删除属性(需
$set/$delete); - 需递归遍历对象所有属性,初始化性能差;
- 无法监听嵌套对象的新增属性。
- 只能监听对象属性,无法监听数组下标/长度、新增/删除属性(需
- Vue3 响应式:基于
Proxy + Reflect,重构后优势显著:- 代理整个对象:无需遍历属性,支持数组(下标/长度)、新增/删除属性的监听;
- 懒监听:嵌套对象仅在访问时才递归代理,初始化性能提升;
- 类型友好:兼容 ES6 语法,更好支持 TypeScript;
- 原始值处理:通过
ref包裹原始值(value访问),弥补 Proxy 无法代理原始值的缺陷。
- 核心流程:
- 依赖收集(track):组件渲染时访问响应式数据,触发
get拦截,收集当前组件的effect(副作用函数); - 触发更新(trigger):数据修改时触发
set拦截,执行收集的effect,重新渲染组件。
- 依赖收集(track):组件渲染时访问响应式数据,触发
2. Vue3 Composition API 设计初衷及与 Options API 的对比
解答:
- 设计初衷:解决 Options API 的核心痛点:
- 复杂组件逻辑分散(data/methods/computed/watch),难以维护;
- 逻辑复用只能通过 mixin(命名冲突、来源不清晰);
- 对 TypeScript 支持差(Options API 无法精准推导类型)。
- 核心对比:
维度 Options API Composition API 逻辑组织 按选项分类,分散 按功能聚合,可抽离 Composables 逻辑复用 mixin(易冲突、难溯源) 组合函数(Composables,无冲突) TS 支持 弱(需手动类型标注) 强(自动类型推导) 学习成本 低(新手友好) 稍高(需理解闭包/响应式) - 最佳实践:
- 抽离通用逻辑为 Composables(如
useRequest、usePagination); - 避免 setup 函数过于臃肿,拆分多个组合函数;
- 优先使用
ref(原始值)/shallowRef(浅层引用),减少不必要的深层响应式。
- 抽离通用逻辑为 Composables(如
3. Vue3 虚拟 DOM 与 diff 算法的优化点
解答:
Vue3 重写了虚拟 DOM 模块,核心优化围绕“减少不必要的对比”:
- 静态提升(hoistStatic):
- 静态节点(如
<div>文本</div>)被提升到渲染函数外,避免每次渲染重新创建 VNode; - 静态属性(如
class="btn")同样被缓存,减少内存占用。
- 静态节点(如
- PatchFlags(补丁标记):
- 为动态 VNode 标记更新类型(如
TEXT/CLASS/STYLE/PROPS),diff 时仅对比标记的属性,无需全量对比; - 示例:
<div :text="msg">文本</div>会被标记为TEXT,仅对比文本内容。
- 为动态 VNode 标记更新类型(如
- 缓存事件处理函数(cacheHandlers):
- 避免每次渲染重新创建事件回调(如
@click="handleClick"),减少 VNode 差异。
- 避免每次渲染重新创建事件回调(如
- 双端对比优化:
- 延续 Vue2 的双端 diff 算法,新增“最长递增子序列”优化,减少节点移动次数(针对列表渲染)。
4. Nuxt3 核心特性及 SSR 实现原理
解答:
- Nuxt3 核心特性:
- 基于 Vue3 + Vite,构建速度大幅提升;
- 自动导入:组件、Composables、API 无需手动 import;
- 服务器组件(Server Components):组件逻辑运行在服务端,减少客户端 JS 体积;
- 孤岛架构(Island Architecture):仅交互组件在客户端激活,静态组件保持服务端渲染状态;
- 数据获取:
useAsyncData/useFetch统一处理异步数据,支持 SSR/CSR 兼容。
- SSR 实现原理:
- 客户端请求 → Nuxt 服务端执行
useAsyncData获取数据; - 通过
vue/server-renderer的renderToString生成 HTML 字符串; - 服务端返回 HTML + 数据(序列化到
window.__NUXT__); - 客户端执行
hydrate注水,复用服务端 HTML,绑定事件,完成激活。
- 客户端请求 → Nuxt 服务端执行
三、通用进阶考点(React/Vue 均会考察)
1. 前端性能优化(全维度)
- 渲染层:虚拟列表(react-window/vue-virtual-scroller)、避免重渲染(memo/useMemo/keep-alive)、骨架屏;
- 网络层:接口缓存(SWR/React Query/useRequest)、HTTP/2、预加载(preload/prefetch)、接口合并;
- 构建层:代码分割(Code Splitting)、Tree Shaking、Vite 按需编译、压缩混淆(Terser);
- 运行层:防抖节流、懒加载(图片/组件)、Web Worker 处理耗时计算。
2. 跨端方案对比(React Native vs Vue3 + UniApp)
- React Native:基于 JSX,原生组件渲染,生态丰富,性能接近原生,但需适配多端;
- UniApp:基于 Vue3,一次编写多端编译(小程序/APP/H5),开发效率高,但复杂场景性能略逊于 RN。
React & Vue 资深工程师面试题
https://zjw93615.github.io/2025/12/06/React_Vue/React & Vue 资深工程师面试题/