比特鹰秋招一面:React 原理 + 职业规划
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 自我介绍。
- 介绍实习。
- 介绍项目。
- 为什么选择前端?
- 你是怎么学习前端的?
- 推荐一下你关注的技术博主?
- 人生最有成就感的事情是什么?
- 介绍一下 React 里的 Fiber 架构?
- 介绍一下 React 的更新流程?
- 介绍 React 19 新特性?
- 介绍一下 Vue 和 React 两个框架的区别?
- 了解过我们公司的业务吗?公司单休能接受吗?
- 未来的职业规划?
- 薪资预期多少?
- 反问。
原帖补充:面试官说是 HR 面,但实际问了技术;公司看起来做 Web3 和教培相关业务。
《参考解析》
React Fiber 架构
Fiber 是 React 16 重写的协调引擎,目的只有一个:把原来「递归往下走、一旦开始就不能停」的渲染过程,改成可中断、可恢复、可排优先级的工作循环。
- 数据结构:每个组件/元素对应一个 Fiber 节点,节点之间用
child(第一个子节点)、sibling(下一个兄弟)、return(父节点)三个指针连成链表树。递归变成了「从根开始,有 child 往下、没 child 找 sibling、都没有就 return」的遍历——每一步都是一个可暂停的工作单元。 - 双缓存树:内存里同时存在
current树(当前屏幕上的)和workInProgress树(正在构建的)。构建完成后一次性切换指针,保证用户永远看到完整界面,不会看到「渲染了一半」的状态。 - 时间切片与调度:Scheduler 按优先级(
Immediate、UserBlocking、Normal、Low、Idle,React 18 起用 lanes 模型)分配时间片,每个工作单元执行前检查是否该让出主线程(默认 5ms),让出去后等浏览器空闲再继续,从而不阻塞用户输入和动画。 - 两阶段划分:render 阶段(构建 workInProgress)可以被打断、可重复执行,所以必须是无副作用的纯计算;commit 阶段(真正改 DOM)同步执行、不可中断。
React 的更新流程
从 setState 到屏幕更新,可以拆成四步:
- 触发更新:
setState/dispatchSetState把 update 挂到对应 Fiber 的更新队列上,并计算 lane 优先级,从当前 Fiber 一路标记到根(scheduleUpdateOnFiber),然后交给 Scheduler。 - render 阶段(可中断):从根开始构建 workInProgress 树,执行
beginWork(调用函数组件、计算新的 props/state、做 diff 决定复用还是新建子 Fiber)和completeWork(创建/更新 DOM 实例、收集副作用)。diff 用同层比较 +key来判定节点复用,这也是「列表里 key 不能用 index」的根因。 - commit 阶段(同步不可中断):分三个子阶段——
before mutation(读取 DOM 快照,getSnapshotBeforeUpdate)、mutation(真正插入/更新/删除 DOM,执行componentWillUnmount、ref 解绑、useLayoutEffect的清理)、layout(执行componentDidMount/Update、useLayoutEffect回调、ref 绑定)。 - 异步副作用:
useEffect的清理与执行被放到 commit 之后由 Scheduler 以普通优先级异步调度,useLayoutEffect则在 layout 阶段同步跑完,这就是「要读布局、要避免闪烁就用 useLayoutEffect」的原因。
React 19 新特性
挑几个有工程影响的讲:
- Actions 与表单相关 hooks:
useActionState、useFormStatus、useOptimistic,配合 Server Actions 把「提交表单 → pending → 错误 → 乐观更新」这套模板代码收进框架,<form action={fn}>原生支持异步函数。 use()API:可以在渲染中读取 Promise 或 Context,配合 Suspense 使用(注意它与 hooks 规则不同,可以条件调用)。- ref 作为普通 prop:函数组件不再需要
forwardRef,ref直接写在 props 里;同时支持 ref 清理函数。 - 文档元数据原生支持:
<title>、<meta>、<link>直接写在组件里,React 自动提升到<head>,不再依赖 react-helmet 这类库。 - Server Components / Server Actions 走向稳定,以及新的
useDeferredValue初始值、更好的 hydration 错误提示、以及对自定义元素(Web Components)的属性支持。
Vue 和 React 的区别
从三个层面答,比只讲「一个是模板一个是 JSX」有说服力:
- 更新机制:Vue 3 用
Proxy做细粒度依赖追踪,组件内哪块数据变了就精确触发那块的更新,配合编译期的静态提升、patchFlag、Block Tree跳过多余 diff;React 是「状态变了就自顶向下重新执行组件函数」,靠memo、useMemo、useCallback手动阻断,key与不可变数据是正确性前提。结果是 Vue 的「默认性能」更好,React 把优化权交给开发者。 - 编程范式:Vue 模板 + 指令(
v-if、v-for)更接近 HTML,上手快,逻辑复用靠 Composables;React 全量 JSX + 函数式,逻辑即 JavaScript,灵活度和类型推导更强(TSX)。 - 生态与工程:React 生态更大(Native、海量状态库),但选型分散;Vue 官方全家桶(Vue Router、Pinia、Vite)更统一,跨端有 uni-app。
选型时给一句结论:团队熟悉度、招人难度、生态需求比性能差异更能决定选谁。
「能否接受单休」「薪资预期」这类问题怎么答
面试官在这两题上做的是期望管理与筛人,不是想听漂亮话。
- 单休 / 加班:先问清楚事实(固定单休还是项目期、调休还是补贴、平均下班时间),再表态。可以接受就明确说;不能接受就说明你的边界和你的效率承诺(比如「项目上线期可以,但常态化单休我坚持不了」),别嘴上答应心里打退堂鼓——入职后崩得很快。含糊地回答「都可以」既不真诚也不加分。
- 薪资预期:不要报一个模糊区间就完事。做法是先做功课(同城同岗位校招水平、公司往年开价),给一个有依据的区间并说明构成(月薪 × 月数、是否有签字费/补贴),态度是「可谈但需要合理」。被问「最低多少」时不要自曝底价,可以说「更看重岗位和成长,具体希望参考公司同岗位标准」。
- 职业规划:1 年内(把工程能力做扎实、能独立负责模块)、3 年内(在某个方向深入、能带小项目),落到具体能力和岗位职责上,避免「想成为技术专家」这种空话。