2026年前端面试题及干货

🔥 面试新趋势:别再只背八股文了

++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源码级理解

· 性能优化全链路方案

· 微前端/跨端技术选型

一、手写代码(别背,得能跑)

  1. 实现一个防抖/节流(必考)

```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。

  1. 深拷贝(考虑循环引用、特殊类型)

```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 键?------增加类型判断分支。


二、实战场景题(都是血泪史)

  1. 一个后台管理页面,列表数据多,每次点查询都卡死,怎么办?

真实原因:你后端返回了全量数据,前端直接渲染,页面 DOM 节点上万。

实战方案:

· 先找后端加 page size 参数,换分页(最简单)

· 如果必须前端分页,用虚拟列表(只渲染可视区)

· 如果只是数据量大、渲染慢,用 requestAnimationFrame 分帧渲染,避免主线程长时间阻塞

  1. 用户反馈:手机 H5 页面点了没反应,咋排查?

真实场景:移动端 300ms 延迟?或者页面有透明层挡住了?

排查步骤:

  1. 手机连接电脑,打开 Chrome DevTools → Remote Devices 查看元素是否被覆盖

  2. 检查 touch 和 click 是否混用,是否忘记 preventDefault

  3. 检查 CSS pointer-events: none 有没有误设

  4. 如果用了 FastClick 库,确认版本兼容

  5. 上线后,发现某个 JS 文件报错,但本地无法复现,怎么快速定位?

实战流程:

  1. 查看错误监控平台(Sentry/ 自己写的)报错堆栈,定位到文件行号

  2. 去线上 CDN 下载对应版本的 sourcemap(上线时一定要上传),通过 sourcemap 映射回源码

  3. 如果没 sourcemap,用 console 埋点 + 用户设备信息(浏览器、系统、网络环境)猜测复现场景

  4. 实在不行,加 debug 日志,灰度发布给一小部分用户,看日志输出

  5. 某个 React 组件频繁重渲染,怎么定位?

真实案例:父组件状态更新,所有子组件都跟着重绘,页面卡。

定位:

· 安装 React DevTools → 勾选 Highlight updates,看哪些组件变黄

· 检查子组件是否用 React.memo 包裹

· 父组件传 props 时,是否每次都新创建对象/函数,用 useCallback 缓存

· 如果用了 Redux,确认 selector 是否每次返回新对象(用 reselect 做缓存)


三、性能优化(不只是压缩图片)

  1. 首屏时间从 3s 优化到 1s 的实操

真实优化项(按优先级):

· 代码分割:路由懒加载,React.lazy + Suspense

· 预加载:<link rel="preload" href="main.css" as="style"> 关键资源提前加载

· 图片:WebP + 响应式图片 <picture> + 懒加载

· 字体:用 font-display: swap 避免白屏

· 服务端渲染:如果是内容型网站,上 SSR 或静态生成(Next.js)

· CDN 预热:将核心资源提前推到边缘节点

  1. 首屏出现大面积白屏,怎么抢救?

真实场景:移动端弱网下,JS 没加载完,页面啥也没有。

方案:

· 内联关键 CSS(首屏样式)

· 加骨架屏(Skeleton),用户看到占位,心理上觉得快了

· 把首屏需要的数据请求提前,放在 head 里 <link rel="preload"> 数据接口

· 用 async/defer 控制 JS 加载顺序,不让它阻塞渲染


四、工程化与构建(Webpack/Rspack)

  1. 线上代码压缩后,报错如何还原?

必备技能:

· 确保构建时生成 .map 文件,但不要部署到线上(防止源码泄露)

· 上传到错误监控平台(Sentry/ 自建),平台会自动用 sourcemap 解析

· 手动还原:用 source-map 包或 Chrome 的 "Add Source Map" 功能

  1. Webpack 构建慢,从哪里下手?

实战排查:

· 用 speed-measure-webpack-plugin 看哪个 loader/plugin 耗时

· 排除不必要文件的解析(exclude: /node_modules/)

· 用 thread-loader 多进程

· 缓存:cache: { type: 'filesystem' }

· 换 Rspack,兼容 Webpack 大部分配置,速度能快 5-10 倍


五、算法(面试必考)

  1. 翻转二叉树(考察递归/迭代)

```javascript

function invertTree(root) {

if (!root) return null;

[root.left, root.right] = [invertTree(root.right), invertTree(root.left)];

return root;

}

```

  1. 实现一个 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)


六、综合大厂真题(场景)

  1. 设计一个多端适配的登录弹窗组件

考察点:组件封装、样式适配、状态管理

思路:

· 用 Portal 渲染到 body

· 支持函数式调用:Modal.confirm({ title, content, onOk })

· 移动端和 PC 端样式不同(通过媒体查询或 React 检测 UA 切换)

· 关闭时销毁 DOM,避免内存泄露

  1. 扫码登录的原理与前端实现

回答框架:

· 生成唯一二维码(包含 ticket/token)

· 前端轮询后端接口,询问该 ticket 是否已扫码确认

· 移动端扫码后,调用后端确认接口,后端标记 ticket 已使用

· 前端轮询到确认,获取登录态 token,跳转

· 优化:用 WebSocket 代替轮询,但长连接开销大,看场景

相关推荐
时寒的笔记2 小时前
逆向入门05_yi恩网
javascript
晴天162 小时前
【跨桌面应用开发】Neutralinojs快速入门指南
前端·javascript·electron·node.js
爱学习的程序媛3 小时前
【Web前端】深入解析JavaScript异步编程
开发语言·前端·javascript·ecmascript·web
wefly20173 小时前
m3u8live.cn:免安装 HLS 在线播放器,流媒体调试效率神器
开发语言·javascript·python·django·ecmascript·hls.js 原理·m3u8 解析
J_liaty3 小时前
JavaScript 基础知识全解析:从入门到精通
开发语言·javascript
天若有情6733 小时前
前端HTML精讲02:表单高阶用法+原生校验,告别冗余JS,提升开发效率
前端·javascript·html
蜡台3 小时前
Vue 组件通信的 12 种解决方案
前端·javascript·vue.js·props
吴声子夜歌3 小时前
TypeScript——局部类型、联合类型、交叉类型
javascript·git·typescript
wefly20175 小时前
jsontop.cn:一站式 JSON 全能工具集,开发全流程效率神器
前端·javascript·python·django·json·json在线转换