🔥 面试新趋势:别再只背八股文了
++CSDN------------郭 wes 代码++
根据2026年最新大厂面经,70%的面试官已不再单纯考察记忆性知识,而是聚焦场景化实战、AI协作能力和架构思维。以下是核心考点整理。
一、框架原理与底层(拒绝表面功夫)
1. React 19 Actions 如何解决竞态问题?
考察点:最新框架特性、异步状态管理
++高分回答:以前用useEffect监听状态发请求,用户快速点击会出现"旧数据覆盖新数据"的竞态问题。React 19的Actions把提交逻辑封装成"动作",天然支持乐观更新------用户点击提交,界面立刻变"成功态",后台自动发请求;失败时自动回滚UI,从根本上杜绝中间状态导致的竞态。++
2. Vue 响应式系统升级到Proxy后如何优化?
考察点:响应式原理、性能优化
高分回答:Proxy能直接监听数组索引变化,不用Vue2的$set。对于超大列表,结合effectScope做组件级依赖收集------为每一行创建独立的effectScope,让它只盯这一行的数据变化,数据变动时只有对应行重新渲染,从源头切断不必要的更新。
3. 虚拟列表如何支持动态高度?
考察点:DOM性能优化、算法设计
核心代码:
```javascript
class VirtualList {
constructor(container, options) {
this.visibleCount = Math.ceil(container.clientHeight / options.itemHeight);
this.startIndex = 0;
}
render() {
const items = [];
for (let i = 0; i < this.visibleCount; i++) {
const index = this.startIndex + i;
items.push(<Item key={index} data={this.data[index]} />);
}
return items;
}
handleScroll() {
// 根据滚动位置计算新的startIndex
}
}
```
二、性能优化(决定薪资上限)
4. 弱网环境下首屏加载慢,有什么杀手锏?
考察点:极端场景应对、边缘计算
高分回答:常规压缩图片和代码分割外,还有三板斧:
· 边缘渲染:把SSR服务部署到Cloudflare Workers,用户请求直接在最近的节点返回HTML,减少回源延迟
· 流式传输:利用React Suspense,先返回骨架屏,数据块好了再一块块"流"进去
· 离线优先:用Service Worker缓存核心资源,弱网下直接读本地缓存
5. 用户交互时卡顿(FPS低),如何排查优化?
考察点:主线程阻塞、渲染管线
高分回答:先用Performance面板录制,看是JS执行时间长还是布局太频。如果是长任务阻塞,用requestIdleCallback拆碎或丢到Web Worker;如果是渲染问题,检查是否频繁触发重排,用transform代替位置属性;React项目用useTransition标记非紧急更新。
三、架构设计(考的是权衡能力)
6. 微前端架构:老jQuery项目如何迁移到React?
考察点:遗留系统重构、沙箱隔离
高分回答:采用"绞杀者模式":
· 基座选wujie(无界),沙箱隔离更强
· 新旧应用通过CustomEvent通信,老项目只引入轻量SDK
· 网关层做路由分发,新业务走React子应用
· 按业务模块(用户中心、订单页)逐个剥离重写,让新老系统长期共存直到自然消亡
7. 实时协作文档(类似腾讯文档)如何设计前端架构?
考察点:技术选型权衡
高分回答:
· 通信用WebSocket
· 数据同步引入CRDT算法(如Yjs库),解决多端操作冲突
· 采用"离线优先"策略,本地用IndexedDB缓存
· 渲染层若内容量大,用Canvas方案避开DOM瓶颈
8. RSC和SSR普及后,前后端分离架构要消亡吗?
考察点:架构视野
高分回答:不是消亡,是进化。以前前后端分离是后端吐JSON、前端全渲染(CSR),牺牲了性能。RSC是"按需分配":静态组件在服务端渲染成HTML片段,动态组件留客户端运行。前端工程师必须懂后端思维,知道哪些逻辑放服务器、哪些放浏览器。
四、AI协作与工程化(2026年必考)
9. 如何用AI生成复杂表单系统?如何审查AI代码的安全隐患?
考察点:Prompt工程、代码审查、安全意识
高分回答:把AI当"初级实习生",Prompt结构:角色设定(资深前端架构师)+ 业务场景 + 约束条件(禁止dangerouslySetInnerHTML)。审查重点关注:
· 依赖投毒:检查package.json是否有不存在的包
· 敏感信息泄露:API Key不能硬编码
· 权限绕过:重点审查鉴权逻辑是否每层都生效
10. 项目构建速度从2分钟优化到20秒,如何入手?
考察点:构建工具原理、性能优化
高分回答:诊断→减负→换引擎三步走:
++· 用webpack-bundle-analyzer看谁慢++
++· 去掉无用polyfill,开启持久缓存++
++· 换Turbopack/Rspack,注意生态兼容性------Loader/Plugin可能跑不通,先在非核心业务灰度测试++
五、软技能与行为面试(STAR法则)
面试常用模板(STAR)
· Situation:项目背景("千万级日活电商系统重构")
· Task:技术挑战("解决移动端首屏加载慢问题")
· Action:解决方案("Webpack代码分割+预加载策略")
· Result:量化成果("首屏渲染时间从3.2s降至1.1s")
高频行为问题
· 如何与设计师/后端协作?
· 遇到生产bug如何处理?
· 如何向非技术人员解释技术方案?
六、简历优化建议
· 项目描述用STAR模型,避免技术名词堆砌
· "熟练度+应用场景"格式:React(熟练):通过自定义Hooks实现表单逻辑复用,减少30%重复代码
· 避坑:不要写"熟悉XX框架",避免"精通所有前端技术",项目时间线保持逻辑自洽
七、核心考点自查清单
· 浏览器渲染流程与关键优化点
· 事件循环(宏任务/微任务执行顺序)
· Promise实现原理(状态机+观察者模式)
· XSS/CSRF防御策略
· TypeScript泛型与类型体操(如DeepPartial<T>)
· React/Vue源码级理解
· 性能优化全链路方案
· 微前端/跨端技术选型
一、手写代码(别背,得能跑)
- 实现一个防抖/节流(必考)
```javascript
// 防抖:用户停止操作后再执行
function debounce(fn, delay) {
let timer = null;
return function(...args) {
if (timer) clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, args), delay);
};
}
// 节流:固定时间执行一次(滚动、拖拽)
function throttle(fn, delay) {
let last = 0;
return function(...args) {
const now = Date.now();
if (now - last >= delay) {
last = now;
fn.apply(this, args);
}
};
}
```
面试官常问:如果用户一直点,最后一次必须执行吗?防抖的立即执行版本怎么改?节流最后一次漏掉怎么办?(用时间戳+定时器双保险)
2. 模拟实现 Promise.al
function myPromiseAll(promises) {
return new Promise((resolve, reject) => {
if (!Array.isArray(promises)) {
return reject(new TypeError('Argument is not iterable'));
}
let results = [];
let completed = 0;
if (promises.length === 0) return resolve(results);
promises.forEach((p, idx) => {
Promise.resolve(p).then(val => {
results[idx] = val;
completed++;
if (completed === promises.length) resolve(results);
}).catch(err => reject(err));
实战坑:遇到非 Promise 值直接包裹;空数组立即返回;捕获错误时 reject。
- 深拷贝(考虑循环引用、特殊类型)
```javascript
function deepClone(obj, hash = new WeakMap()) {
if (obj === null || typeof obj !== 'object') return obj;
if (hash.has(obj)) return hash.get(obj);
let clone = Array.isArray(obj) ? [] : {};
hash.set(obj, clone);
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key], hash);
}
}
return clone;
}
```
面试官追问:Date/RegExp/函数怎么处理?怎么支持 Symbol 键?------增加类型判断分支。
二、实战场景题(都是血泪史)
- 一个后台管理页面,列表数据多,每次点查询都卡死,怎么办?
真实原因:你后端返回了全量数据,前端直接渲染,页面 DOM 节点上万。
实战方案:
· 先找后端加 page size 参数,换分页(最简单)
· 如果必须前端分页,用虚拟列表(只渲染可视区)
· 如果只是数据量大、渲染慢,用 requestAnimationFrame 分帧渲染,避免主线程长时间阻塞
- 用户反馈:手机 H5 页面点了没反应,咋排查?
真实场景:移动端 300ms 延迟?或者页面有透明层挡住了?
排查步骤:
-
手机连接电脑,打开 Chrome DevTools → Remote Devices 查看元素是否被覆盖
-
检查 touch 和 click 是否混用,是否忘记 preventDefault
-
检查 CSS pointer-events: none 有没有误设
-
如果用了 FastClick 库,确认版本兼容
-
上线后,发现某个 JS 文件报错,但本地无法复现,怎么快速定位?
实战流程:
-
查看错误监控平台(Sentry/ 自己写的)报错堆栈,定位到文件行号
-
去线上 CDN 下载对应版本的 sourcemap(上线时一定要上传),通过 sourcemap 映射回源码
-
如果没 sourcemap,用 console 埋点 + 用户设备信息(浏览器、系统、网络环境)猜测复现场景
-
实在不行,加 debug 日志,灰度发布给一小部分用户,看日志输出
-
某个 React 组件频繁重渲染,怎么定位?
真实案例:父组件状态更新,所有子组件都跟着重绘,页面卡。
定位:
· 安装 React DevTools → 勾选 Highlight updates,看哪些组件变黄
· 检查子组件是否用 React.memo 包裹
· 父组件传 props 时,是否每次都新创建对象/函数,用 useCallback 缓存
· 如果用了 Redux,确认 selector 是否每次返回新对象(用 reselect 做缓存)
三、性能优化(不只是压缩图片)
- 首屏时间从 3s 优化到 1s 的实操
真实优化项(按优先级):
· 代码分割:路由懒加载,React.lazy + Suspense
· 预加载:<link rel="preload" href="main.css" as="style"> 关键资源提前加载
· 图片:WebP + 响应式图片 <picture> + 懒加载
· 字体:用 font-display: swap 避免白屏
· 服务端渲染:如果是内容型网站,上 SSR 或静态生成(Next.js)
· CDN 预热:将核心资源提前推到边缘节点
- 首屏出现大面积白屏,怎么抢救?
真实场景:移动端弱网下,JS 没加载完,页面啥也没有。
方案:
· 内联关键 CSS(首屏样式)
· 加骨架屏(Skeleton),用户看到占位,心理上觉得快了
· 把首屏需要的数据请求提前,放在 head 里 <link rel="preload"> 数据接口
· 用 async/defer 控制 JS 加载顺序,不让它阻塞渲染
四、工程化与构建(Webpack/Rspack)
- 线上代码压缩后,报错如何还原?
必备技能:
· 确保构建时生成 .map 文件,但不要部署到线上(防止源码泄露)
· 上传到错误监控平台(Sentry/ 自建),平台会自动用 sourcemap 解析
· 手动还原:用 source-map 包或 Chrome 的 "Add Source Map" 功能
- Webpack 构建慢,从哪里下手?
实战排查:
· 用 speed-measure-webpack-plugin 看哪个 loader/plugin 耗时
· 排除不必要文件的解析(exclude: /node_modules/)
· 用 thread-loader 多进程
· 缓存:cache: { type: 'filesystem' }
· 换 Rspack,兼容 Webpack 大部分配置,速度能快 5-10 倍
五、算法(面试必考)
- 翻转二叉树(考察递归/迭代)
```javascript
function invertTree(root) {
if (!root) return null;
[root.left, root.right] = [invertTree(root.right), invertTree(root.left)];
return root;
}
```
- 实现一个 URL 解析函数
```javascript
function parseQuery(url) {
const search = url.split('?')[1];
if (!search) return {};
const params = new URLSearchParams(search);
const result = {};
for (let [key, val] of params.entries()) {
if (result[key]) {
result[key] = Array.isArray(result[key]) ? [...result[key], val] : [result[key], val];
} else {
result[key] = val;
}
}
return result;
}
```
注意:处理重复参数(?a=1&a=2)和中文编码(decodeURIComponent)
六、综合大厂真题(场景)
- 设计一个多端适配的登录弹窗组件
考察点:组件封装、样式适配、状态管理
思路:
· 用 Portal 渲染到 body
· 支持函数式调用:Modal.confirm({ title, content, onOk })
· 移动端和 PC 端样式不同(通过媒体查询或 React 检测 UA 切换)
· 关闭时销毁 DOM,避免内存泄露
- 扫码登录的原理与前端实现
回答框架:
· 生成唯一二维码(包含 ticket/token)
· 前端轮询后端接口,询问该 ticket 是否已扫码确认
· 移动端扫码后,调用后端确认接口,后端标记 ticket 已使用
· 前端轮询到确认,获取登录态 token,跳转
· 优化:用 WebSocket 代替轮询,但长连接开销大,看场景