
1. 先说背景两年经验面中大厂到底面什么我在上一家公司待了快两年做的是偏中后台的业务React 和 Vue 都写过日常无非是列表、表单、权限、图表偶尔碰一碰性能优化和工程配置。说实话最初投中大厂纯粹是抱着“试试水”的心态结果面了几轮之后发现两年经验这个节点其实非常微妙面试官既不会像面应届生那样只考基础也不会像面高级岗那样上来就聊架构和团队管理他们更想看的是——你有没有完整的项目落地能力能不能讲清楚一个功能从需求到上线的全链路思考以及你的技术深度到底停留在“会用”还是“理解原理”。这篇文章我想把整个面试过程按阶段拆开聊从简历准备、基础八股、框架原理、手写题、工程化、性能优化到最后的踩坑心得尽量还原真实的提问方式和回答思路。需要提前说明的是不同厂的面试风格差异很大有的喜欢连环追问有的喜欢让你白板写代码有的业务面聊得极细有的交叉面偏重设计能力但底层考察的能力模型是相通的。先给结论两年经验面中大厂重点不是“刷了多少题”而是“能不能证明你做过的事有技术含量”。很多人栽跟头不是栽在不会而是栽在讲不清楚。这篇先聊到工程化和性能优化部分手写题和具体公司轮次会放进下篇避免一篇塞太满反而读不下去。1.1 我自己的情况与面试时间线简单交代一下背景。我普通二本非科班第一份工作是在一家小厂做内部系统团队不大前端就我和另外一个同事所以从项目搭建、组件封装、构建配置到线上运维都摸过一遍。从简历投出去到最终收到 offer前后大概一个半月总共面了四家中厂、两家大厂实际进入完整面试流程的有三家拿到的结果是一家中厂 offer 和一家大厂的意向书另一家中厂二面挂还有几家在 hr 筛选或者一面结束后就没有下文了。时间线大概是这样的前期花了两周整理简历和复盘项目第一周只约了两家不太想去的公司练手目的是找面试节奏第二周开始集中约重点目标公司之后就是一面、二面、三面穿插着来。这个节奏我比较推荐尤其是对面试容易紧张的人先拿非目标公司练手能明显降低正式面试时的慌乱感。两年经验还有一个特点就是很多公司其实默认你应该具备“独立负责一个模块甚至一个项目”的能力所以面试中“项目深挖”占了非常大的比重。如果你过去两年做的都是零散的页面切片没有完整负责过一件事这个时候会比较吃亏。如果还有时间建议在面试前主动把手上某个项目的前后端交互、权限设计、缓存方案、异常处理这些环节重新梳理一遍哪怕这些不是你写的也要能讲清楚为什么这么做。1.2 两年经验在面试中的定位我后来复盘发现两年经验在面试官眼里和三五年经验最大的区别是他们不会默认你什么都懂但也不会容忍你一问三不知。换句话说你可以承认某个方向没有深入研究但你不能在“基础 自己项目相关的原理”上含糊。具体来说中大厂面试官对两年经验的预期大概有三层。第一层是基础必须扎实JS、CSS、网络、浏览器渲染这些属于送分题答不上来基本等于直接淘汰。第二层是框架要能讲到原理级别不只是会用 api而是要知道虚拟 DOM 为什么存在、diff 大概怎么运行、响应式数据是怎么收集依赖的。第三层是工程化意识和性能优化思路这个对应的是两年经验应该经历过的“线上问题处理”比如首屏太慢了怎么排查、打包体积太大了怎么优化、线上 js 报错怎么定位。这三层不是每个公司都会全部考到但准备的时候建议按这个优先级来分配精力。我当时花的时间大概是这样基础复盘 30%框架原理 30%项目和场景题 30%工程化和性能优化 10%。后面实际面试也印证了只要项目讲得足够细工程化和性能优化的问题很多都会被融入项目场景里问反而不太会单独出一道很偏的题目。2. 简历准备面试官看到的第一张脸简历这事两年经验的写法和应届生完全不一样。应届生可以写“熟悉 HTML/CSS/JavaScript”因为没得办法但如果你已经工作了两年简历上还只写熟悉这些基础三件套面试官的第一反应会是这人过去两年是不是没干什么正事我当时改简历花了很长时间主要做了三件事把项目经历重写了一遍、把技术栈的描述具体化、给自己准备了一份“可追问清单”。特别是第三件事很多人完全没意识到面试官追问的问题大概率是从你简历里的某个措辞开始的。比如你写了“使用 webpack 优化构建速度”他接下来必问“怎么优化的优化前后差多少”你写了“封装了通用表单组件”他大概率问“组件设计的思路是什么怎么处理复杂联动”。所以简历上的每一个字都得是你真能接得住的话。2.1 项目经历怎么写才不像流水账最常见的错误写法是“负责XX系统开发使用 Vue Element UI 完成页面使用 axios 请求数据通过 git 管理代码”。这种描述的问题在于它只说了“做了什么”完全没体现“结果是什么”和“难点是什么”。我当时用的结构是项目背景 我的角色 核心难点 具体方案 量化结果。比如写一个后台权限系统我不会说“实现了登录和权限”而是写“基于 Vue Router 的全局守卫和动态路由注册实现了按钮级权限控制将新增一个权限点的开发成本从半小时降低到五分钟”然后后面再补一行“负责权限模块的设计与落地主导了前端拦截与后端返回权限码的联调方案”。这个方法的核心逻辑是让面试官在看你简历的三十秒里就能找到后面想要深挖的点。如果你写“动态路由”他大概率会问动态路由怎么实现的、刷新后路由怎么恢复的如果你写“性能优化”他会问优化手段、前后数值对比如果你写“组件封装”他会问设计思路和适用边界。把自己想被问到的问题提前写进简历面试的节奏就会掌握在你手里而不是被面试官带着走。2.2 技术栈描述别给自己挖坑简历上的技术栈列表建议只写自己真实用过的、能在面试中展开聊五分钟以上的。不要为了显得厉害写“精通 webpack”结果面试官问你 loader 和 plugin 的区别时支支吾吾反而减分。宁可写“熟悉 webpack 常见配置和优化手段”把范围缩小一点至少在面试官追问时你能接得住。我个人的做法是把技术栈按“熟练使用”“了解原理”“有实践项目”三个层次来分。比如 Vue 和 React 我会写“熟练使用 Vue 2/3了解响应式原理与 diff 流程掌握 React 函数组件与 Hooks 的开发方式了解 Fiber 基本调度思路”然后把我实际做过的项目对应的技术明确标出来。这样面试官心里会有一个预期问的时候也会挑“你写的这个方向”去问而不是随便甩一个冷门 api。另外简历上千万不要写“熟悉 Node.js”这种话除非你真的用它写过完整服务比如一个接口转发中间层或者一个脚本工具。因为“熟悉 Node.js”在面试官那里约等于“准备被问 Node 的事件循环、Stream、Buffer、Cluster”你稍微答不上来整个简历可信度都会受影响。2.3 准备一份“可追问清单”这是一个对我帮助最大的方法。改完简历后我另开了一个文档把简历里每个可能被追问的点拆出来然后提前写出回答。比如写了“动态路由”就问自己为什么要用动态路由不用行不行刷新后动态路由怎么恢复和后端返回的权限码怎么配合子路由的鉴权怎么做被直接访问某个无权限 URL 时怎么处理类似这种自己给自己当面试官。还有一个反向操作我特别推荐把你简历里每一句话里的名词都圈出来问自己“这个词我真的懂吗”。比如写了“首屏优化”那你要能说清楚首屏时间是怎么统计的是 performance.timing 里的哪个指标还是用 PerformanceObserver 拿的 FP/FCP/LCP写了“按需加载”那你要能说清楚路由懒加载的原理是什么webpack 是怎么把动态 import 拆成单独 chunk 的。这一步做完你对项目的理解会比原来深入很多。3. 基础八股怎么答从背答案到讲原理基础这块两年经验的面试基本不会考“闭包是什么”这种概念题而是会结合场景来问。比如闭包他可能不是直接问“什么是闭包”而是给你一段代码让你说出输出结果然后追问为什么。这种题本质上还是考你对作用域链、执行上下文、变量提升这些底层机制的理解只是换了一种考法。我的建议是八股文一定要背但不能只背表面要去逼自己理解背后的机制。这一节我把当时被问到频率最高、也最容易翻车的几类题整理出来每个我都尽量还原现场的追问方式而不是只列一个标准答案。3.1 JS 核心闭包、原型链、事件循环闭包在两年经验的面试里几乎是必考的但考法比较活。最常见的是给一个 for 循环加 setTimeout 的题问输出什么、怎么改能输出正确结果。这个题本身不难但面试官会沿着这条路往下追问let 和 var 有什么区别let 解决了什么问题如果不用 let用 var 怎么实现闭包会造成内存泄漏吗怎么泄漏的第二个高频考点是原型链。问法通常不是直接问“原型链是什么”而是给出一个对象或者函数的例子问你 a 的原型是谁、a 的 constructor 是谁、a instanceof Object 和 a instanceof Function 的区别是什么。这里最关键的坑是 Function 和 Object 的鸡生蛋关系很多人在这一步被绕晕了需要提前把Function instanceof Object和Object instanceof Function都捋一遍。事件循环这个考点两年经验一般不会考太深但考的话基本都是综合题。比如给你一段包含 Promise、async/await、setTimeout、requestAnimationFrame 的代码让你按顺序写出输出。这类题刷几道就能掌握规律核心点是记住微任务优先于宏任务async/await 的本质是 Promiseawait 后面的代码只有在 Promise resolve 之后才会继续执行。我踩过的一个坑是只背了“微任务先于宏任务”但没搞明白两个微任务之间谁先谁后。后来我重新啃了一遍规范才搞清楚每执行完一个宏任务会清空整个微任务队列而微任务队列中新加入的微任务也会被一起执行。这个点讲清楚了面试官对你的印象会明显不一样因为这已经不是背答案而是真理解了执行机制。3.2 浏览器与网络缓存、渲染、安全浏览器缓存是必考项而且一定会往深里问。面试官通常会先问“浏览器缓存有哪些”你答强缓存和协商缓存然后他追问“强缓存有哪些字段”“Cache-Control 和 Expires 的区别”“协商缓存用的是什么头”“服务端是怎么判断资源有没有变化的”“ETag 和 Last-Modified 的优先级”。这里没有太多技巧只能把字段和优先级记牢同时最好能结合你先前的项目说明“我在打包部署时会给 hash 资源设置长缓存给 index.html 设置 no-cache”这样就把基础知识和项目经验串起来了。浏览器的渲染过程也是高频题。常见的问法是“从输入 URL 到页面展示发生了什么”这个题比较长建议先按大框架分阶段DNS 解析、TCP 连接、发送 HTTP 请求、服务端返回、解析 HTML 构建 DOM 树、解析 CSS 构建 CSSOM 树、合成渲染树、布局、绘制、合成。面试官一般会在中间截断挑其中一个细节往下问比如“什么是重排和重绘”“如果 JavaScript 放在 body 底部页面会怎样”“CSS 会阻塞 DOM 解析吗”。安全方面两年经验面中大厂大概率会问 XSS 和 CSRF。这个一定要结合项目来讲比如你的后台系统在提交表单时做了哪些转义、在渲染富文本时用了哪里的白名单、登录态是怎么存储的、和第三方系统对接时有没有校验 referer。只答“XSS 是脚本注入CSRF 是跨站请求伪造”是不够的面试官想听的是“你在真实项目里怎么防的”。3.3 CSS 与布局BFC、层叠上下文、新特性CSS 在两年经验的面试里占的比重没有 JS 那么高但出现了基本就是考察你有没有真正理解布局原理。BFC 几乎是必考的概念本身不难关键是能说出来它解决什么问题。常见的场景是“父元素包不住子元素的 margin”或者“子元素 float 撑不开父元素高度”然后你答创建 BFC 的几种方式比如 overflow: hidden、display: flow-root、position: absolute 等。层叠上下文也是容易被绕晕的点面试官可能会给你一个嵌套结构问哪个元素盖在哪个元素上面。这里的关键是记住 z-index 只有在同一层叠上下文中才有比较意义而 transform、opacity、filter 这些属性都会创建层叠上下文。我面试时被问过一道题“父元素 z-index 是 1子元素 z-index 是 999和另一个 z-index 是 2 的元素谁在上面”答案是——看父元素的 z-index因为子元素的 z-index 只能在父级层叠上下文内部生效。新特性方面这两年面试开始更关注 layout 这块比如 flex 和 grid 的区别、grid 的 fr 单位、subgrid、容器查询。准备的时候不用全部深挖但至少 flex: 1 的完整写法flex-grow、flex-shrink、flex-basis要能说清楚grid 的基本使用和比 flex 更强大的布局能力也要能讲明白。4. 框架原理两年经验必须跨过的分水岭如果基础题答得还行面试官基本会开始发难框架原理。框架这部分是两年经验面试的分水岭能不能过很大程度上就看这里。我自己见过不少候选人项目里 Vue 用得遛得飞起但被问到“Vue 3 的响应式为什么比 Vue 2 好”时只能回一句“用了 Proxy”再往下问就没了这种基本就没戏了。框架原理的准备最有效的方式是读源码但不是从头到尾读而是按问题去读。我在准备时列了一堆“为什么”的问题然后带着问题去看对应源码。比如React 的 setState 为什么是异步的Fiber 是怎么做到可中断的diff 的 key 到底有什么用Vue 的 computed 为什么能缓存Vue3 的 effect 和 dep 怎么关联每弄懂一个问题面试时的底气就多一分。4.1 ReactFiber、diff、Hooks如果你主攻 React那 Fiber 和 diff 是绕不开的两座大山。面试官不会指望你把 Fiber 架构背得多完整但至少要知道React 15 的递归渲染为什么会导致页面卡顿、Fiber 是怎么把递归改成可中断的链表遍历的、优先级调度大概是什么思路。我当时的回答思路是先用一句话概括“Fiber 是把组件树变成链表切分了渲染任务配合 requestIdleCallback 让浏览器在空闲时继续工作”然后补充“所以渲染可以被打断这就是并发模式的基础”基本上就能满足面试官的预期。diff 的考点集中在“同级比较”和“key 的作用”。要能说清楚 diff 是深度优先、同级比较的遇到不同类型的元素直接替换遇到同类型元素就复用 DOM 只更新属性列表渲染时用 key 来减少无意义的销毁重建。如果能再补一句“key 不要用 index因为列表中间插入元素会导致后面的组件全部被复用错乱产生隐藏的 bug”面试官基本会点头。Hooks 相关的题这两年问得非常多因为太多人用了但不知道原理。最容易被追问的三个点为什么 Hook 不能放在条件语句里、useEffect 的依赖数组是怎么判断变化的、useState 的初始值为什么只在第一次渲染生效。这几个问题追到最后的答案都指向同一个机制函数组件每次渲染都会执行整个函数体Hook 内部是按调用顺序保存状态的所以顺序不能变。4.2 Vue响应式、diff、编译如果是 Vue 岗响应式原理必须讲到源码级别。Vue 2 用的是 Object.definePropertyVue 3 用的是 Proxy这个大家都知道但你要能说清楚 Vue 2 的缺陷到底是什么只能拦截属性读写新增和删除属性无法感知数组的方法需要单独 hack对嵌套对象需要递归遍历初始化性能差。而 Proxy 可以拦截整个对象的操作包括属性新增、删除、in 操作符而且由于是惰性代理性能上也更好。Vue 的 diff 和 React 的 diff 不太一样面试官可能会问“Vue3 为什么比 Vue2 快”这里除了响应式的优势还有一个关键点是编译阶段的优化静态节点标记和动态节点收集。Vue3 在编译时会分析模板把动态绑定的节点标记为动态diff 时就只比较这些动态节点而不是整个虚拟 DOM 树。能把这个点讲出来和只会背虚拟 DOM 的人立刻就拉开了差距。Vue 相关还有一个高频题是 computed 和 watch 的区别。这个不能只答“computed 有缓存watch 没有”要往原理上说computed 会基于响应式依赖建立惰性求值的 effect依赖没变就直接返回缓存值watch 是主动注册一个 effect依赖变化时执行回调。答案里有这几个关键词面试官基本就满意了。4.3 状态管理与组件通信的追问方向状态管理的题面试官更看重思路而不是背 api。比如问 Vuex 和 Pinia 的区别你不能只说“Pinia 是新的”要说清楚 Vuex 的 mutation 为什么是同步的为了让 devtools 能追踪状态变化、Pinia 直接修改 state 为什么是可行的、Pinia 是怎么把 setup store 和 option store 统一起来的。组件通信的题比较细但本质就是“数据从哪来、到哪去”。无论是 React 还是 Vue面试官都希望你脑子里有一张通信方式地图父子用 props 传参和事件回调、跨层级用 context 或 provide/inject、全局状态用 store。如果能额外提一句“组件通信方案的选择依赖于数据的生命周期”比如“服务端数据用请求去拿不做全局缓存用户状态用 store 统一管理”这几句话会显得你对工程有思考。5. 手写题与场景题实战环节怎么不翻车到了这个环节面试基本上已经过半。手写题和场景题是很多人的噩梦因为现场写代码和平时写代码完全不是一回事有人盯着你你手心冒汗时间又紧很容易写出平时不会犯的低级错误。我的经验是手写题准备要分两层第一层是高频题必须练到肌肉记忆第二层是遇到没见过的题要能边说思路边写让面试官看到你的思考过程。大部分面试官并不是真的在乎你最后代码跑不跑得通而是想通过这个过程看你遇到问题时的拆解能力。5.1 高频手写题清单与思路两年经验的面试手写题范围其实相对固定。防抖节流、深拷贝、Promise.all、手写 call/apply/bind、发布订阅、数组去重、对象扁平化这些属于出镜率最高的。防抖节流要能写出基本版还要能说出应用场景以及带不带立即执行参数的区别。深拷贝要注意处理循环引用、Date、RegExp、Map、Set、Symbol 这些特殊类型如果面试官说“就写个普通版”你也要能口头说出完整版要处理哪些边界。Promise 相关的手写题这两年越来越多尤其是手写 Promise.all 和手写 Promise 的链式调用。我的建议是把 Promise 的完整实现过一遍尤其是 resolve 和 then 的内部逻辑因为很多题看似在考 Promise.all实际考的是你对 Promise 内部状态流转的理解。如果时间有限我推荐按这个优先级来练防抖节流、深拷贝、Promise.all、自定义事件总线、call/apply/bind、数组扁平化与去重、柯里化、reduce 实现 map、new 操作符、发布订阅。后面的几个优先级略低但练过之后思路会通很多。我当时在面试中真被问到的是防抖节流、深拷贝、Promise.all 和手写一个简单的事件总线其他的都是作为追问出现。5.2 场景题从需求到方案的完整表达场景题考的不是你有多强的 coding 能力而是你面对一个真实需求时能不能先理清约束再给方案。举个例子面试官问“让你设计一个前端大文件上传的功能你会怎么设计”如果上来就写代码基本就凉了。要先问清楚约束条件文件一般多大、网络环境怎么样、要不要断点续传、后端支不支持分片、有没有考虑并发限制。我当时的回答框架是先拆功能点包括文件校验、分片、上传并发控制、进度展示、暂停继续、失败重试、后端合并校验再针对每个点给出方案。比如分片用 Blob.slice并发控制用 Promise 池加最大并发数断点续传先算文件 hash 把已上传的分片列表请求回来跳过。如果还能提到“用 Web Worker 计算 hash 避免主线程卡顿”这个答案的层次就已经超过大部分人。另一个高频场景题是“设计一个前端监控系统”。这里不要急着说用什么库要先定义监控什么JS 错误、资源加载错误、接口请求异常、白屏检测、用户行为链路。然后说怎么采集、怎么上报、上报失败怎么兜底、怎么聚合展示。如果能把“错误堆栈怎么解析”“sourcemap 怎么定位源码”“上报频率怎么控制”这些都带出来面试官会认为你确实考虑过线上问题。5.3 我当时被卡住的题目复盘有一个题我印象特别深面试官让我手写Array.prototype.reduce的实现并且要求支持第二个参数缺省的情况。我平时减重用得多但真让我写 reduce 的源码实现反而在“初始值缺省时需要把数组第一个元素作为初始值并从第二个元素开始遍历”这个细节上卡了一下花了半分多钟才理顺。这也说明一个问题不要觉得自己每天在用就在复习时候跳过手写题必须一个一个亲手写一遍。另一道让我翻车的是 CSS 场景题实现一个三栏布局左右固定宽度中间自适应并且要求中间列优先渲染。我第一反应是 flex但面试官补了一句“优先渲染”其实就是考圣杯/双飞翼布局。这个我确实没准备到硬是靠 float 加 margin 挤出来了但紧张之下代码写得比较糙。后来复盘的时候我专门把圣杯布局和双飞翼布局手写了三遍把负 margin 的原理彻底搞明白了。这道题也提醒我高频基础题里所谓“过时”的内容面试中依然会出现。6. 工程化与性能优化中大厂面试的差异化题到了这个部分面试基本进入中后段了。基础题是及格线框架原理是分水岭工程化和性能优化则是让你在同批候选人里亮起来的点。两年经验面中大厂面试官会默认你经历过至少一个生产项目所以“你在项目里怎么处理资源体积、怎么排查线上问题、怎么提升页面加载速度”这类题基本跑不掉。我遇到的情况是工程化和性能优化很少单独考基本都会挂在项目深挖里。你讲到一个优化点他就顺势往下问。所以最好的准备方式不是背“大厂性能优化清单”而是把你自己的项目里做过的优化动作一个个整理成“背景-方案-结果”的小故事。6.1 webpack/vite 必须掌握的原理webpack 相关的问题最常考的是 loader 和 plugin 的区别。这个题不能只答“loader 处理文件plugin 做额外事情”要说清楚 webpack 的构建流程从入口开始解析依赖、构建模块、生成 chunk、最后输出文件loader 是在模块解析和转换阶段介入的plugin 则是通过 tapable 钩子在构建的生命周期里介入的。如果能答出“loader 是文件到文件的转换plugin 是一个拥有 apply 方法的类里面通过 compiler 和 compilation 去订阅钩子”这个回答已经很完整了。Vite 的题也越来越多尤其是这两年新项目基本都切到 Vite 了。要能说清楚 Vite 开发环境为什么快它基于浏览器原生的 ES Module开发时不需要打包而是利用浏览器请求时按需编译生产环境用 Rollup 打包所以构建速度也好。如果被追问“Vite 开发时依赖预构建优化做了什么”以及“为什么生产环境不直接用原生 ESM”能答上来的人会很少答上来就是加分项。6.2 性能优化从首屏到监控性能优化的问题我建议用一个总框架来答前端性能优化的核心是“更快地拿到资源”和“更少地渲染无关内容”。从这个框架引申出去可以做 CDN 加速、HTTP 缓存、资源压缩、代码分割、懒加载、预加载、SSR/静态化、图片优化再到减少重排重绘、使用 requestIdleCallback、长任务拆分、Web Worker 处理计算。面试官通常会结合具体场景来问“页面首屏太慢你怎么排查”。这时候不要说“用 Lighthouse”而是给一个排查思路先看是网络层面的问题还是渲染层面的问题。网络慢就看资源的体积、数量、缓存命中情况渲染慢就看 JS 执行时间、DOM 规模、是否有长任务阻塞。然后给一条路径按 F12 打开 Performance录一段加载过程看主线程上有没有超过 500ms 的长任务看 Network 面板里最大的资源是不是首屏不需要的考虑把它延后加载。这套思路说下来面试官就会觉得你是真排查过问题而不是背稿子。6.3 线上问题排查的真实案例工程化面试里还有一类题是“如果线上出现了问题你怎么定位”。这类题考的是监控和排查能力。我当时的回答是先看监控平台有没有对应的报警比如 JS error、接口成功率、白屏率再看具体报错堆栈用 sourcemap 定位到源码如果是偶发问题在代码里加上可上报的上下文信息把用户操作路径和关键参数带出来方便复现。这里有一个容易被忽略的细节前端 error 上报堆栈通常是压缩混淆后的必须配合 sourcemap 才能还原源码位置。面试官如果问“sourcemap 为什么要线上关闭”你可以回答“保护源码不被泄露同时减小体积”但如果你能补一句“可以单独把 sourcemap 上传到监控平台不上传到 CDN在监控平台内部映射”这个答案的质量会高很多。7. 面试过程中的踩坑与心得写到这里这篇面经的主干部分差不多讲完了最后再聊几点面试过程中的真实感受和踩过的坑。这一段可能没有前面那么多硬核知识点但我个人觉得对面试结果的影响甚至比知识点本身还要大。首先是对着镜子练表达。我一开始面试时脑子里知道答案但一张嘴就变成“就是那个……它其实就是……嗯……”这种非常减分。后来我改用了一个方法把每个高频问题的回答写成逐字稿然后朗读几遍不是背而是让嘴巴熟悉这种表达节奏。练过之后面试时虽然不能说完全流利但至少不会频繁卡壳。第二点是关于不会的题。面试时一定会遇到不会的题这不丢人丢人的是直接说“不知道”然后沉默。我后来养成的习惯是先把这个题相关的部分讲一讲然后明确告诉面试官“再往深我就没有研究过了这是目前我的边界”。这样做的好处是面试官能看到你会不会思考也愿意给你提示。这比自己慌乱地编造答案要强太多。第三点是时间安排。我建议每家公司的面试轮次尽量集中在一到两周内完成不要拖太久不然状态很难保持。同时每面完一家当天晚上就做复盘把被问到的问题记下来哪道题没答好就当天补上。我的记录里很多二面、三面遇到的问题恰恰是一家公司一面时的追问或者延伸这种即时的复盘补全真的很有效。7.1 我犯过的错和复盘我最大的一个失误是在某家中厂的二面面试官问“如果让你设计一个前端权限系统你会怎么设计”我竟然花了将近十分钟在讲 RBAC 的概念和数据库字段设计结果面试官说“我想听的是前端这边的路由和按钮权限怎么控制”。这一下就把我打懵了后面节奏全乱。后来我总结出一条原则面试官问什么方向就先锁定什么方向的边界不要上来就铺太大尤其不要越界去讲后端的东西。场景题的答案要“有边界地深挖”而不是“无边界地铺开”。另一个值得记录的失误是在一次现场手写场景题时面试官让我设计一个“前端导出大量数据的方案”我第一反应就是“用懒加载分批导出”但面试官提示说“如果数据是后端准备好了直接返回一个很大的 JSON 让你在前端生成 CSV 并且不能卡死页面呢”我立刻意识到他把问题设定在“前端拿到全量数据之后”。这道题最终我在他提示下才说出用 Web Worker 处理数据拼接、用 Blob 下载、用 requestAnimationFrame 或分片的方式避免阻塞主线程。这个经历让我明白场景题的“需求澄清”环节非常重要先确认场景边界再往下拆。7.2 时间安排与心态调整面试周期拉长之后心态非常容易崩。我中间有一周因为连续两家公司挂掉一度怀疑自己是不是能力不行甚至想退掉后面几家的面试。后来是和一个前同事聊他的一句话点醒了我“面试是匹配不是考试挂掉只能说明不太匹配不代表你不行。”这句话虽然有点鸡汤但确实让我放下了很多心理包袱。后来的几场面试我心态放松了很多反而发挥更稳定很多问题都能顺着思路答下去。如果你也在准备面试我想说把面试当成一次“技术交流”“聊聊我做过的项目”而不是“去接受审判”。这个心态的转变比任何技巧都重要。另外建议保留一个自己的复盘文档把每次遇到的问题都记录下来每场面试结束之后简单标注“答得好/一般/崩了”以及原因这会让你在后面的面试里越来越少犯错。7.3 关于“下篇”的内容预告这篇写到这里已经比较长了所以暂时先停在工程化和性能优化这部分。框架原理、手写题、场景题以及具体的公司轮次对比我会放在下篇继续聊。下篇重点会写我实际遇到的一些真题还原、完整的答题思路、以及不同厂面试风格的差异比如一面偏重基础、二面偏重项目和场景、三面偏重综合和软素质这类规律。如果你正在准备中大厂前端面试可以等下篇出来之后一起看两篇结合着对照自己目前的薄弱点来补。