前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 2026 年前端面经
    • 2026 前端面试题分类
    • JavaScript 与浏览器
      • 微任务为什么可能让页面“卡死”?
      • React 中的闭包为什么会读到旧状态?
      • 如何实现可取消、不会串结果的搜索防抖?
    • React 19 与 Next.js
      • Hooks 为什么不能写在条件分支里?
      • Server Component 和 Client Component 边界怎么划?
      • Next.js 缓存导致数据旧了,怎么定位?
    • 性能与安全
      • INP 高但接口很快,前端怎么排查?
      • AI 返回的 Markdown 怎么防 XSS?
      • 大计算放进 Web Worker 为什么页面仍可能卡?
    • AI 前端高频题
      • 为什么大模型流式输出常用 SSE,不用 WebSocket?
      • AI 流式输出如何避免每个 token 都触发一次渲染?
      • 面试中如何证明你会审查 AI 生成的代码?
    • CSS 与现代布局
      • 容器查询和媒体查询怎么选?
      • z-index: 9999 为什么仍然被遮住?
    • Vue 3
      • ref 和 reactive 在 Vue 3 中怎么选?
      • computed、watch、watchEffect 的边界是什么?
      • Vue 3 的 Diff 为什么需要稳定 key?
    • React 19 深入题
      • useOptimistic 解决什么问题,失败时怎么回滚?
      • React 19 的 Action 与普通事件请求有什么差别?
      • React Compiler 出现后还要手写 useMemo 吗?
    • Webpack
      • Webpack 的 Loader 和 Plugin 本质区别是什么?
      • Webpack 的长期缓存为什么会失效?
    • Vite
      • Vite 开发环境为什么快,生产为什么还要打包?
      • Vite HMR 为什么有时退化成整页刷新?
    • 服务端渲染与同构
      • SSR、SSG、流式 SSR 应该怎么选?
      • Hydration mismatch 怎么系统定位?
    • Electron
      • Electron 主进程、渲染进程和 preload 怎么分工?
      • Electron 自动更新如何做到安全和可回滚?
    • React Native
      • React Native 新架构解决了旧 Bridge 的什么问题?
      • React Native 列表如何避免白屏和掉帧?
    • Flutter
      • Flutter 的 Widget、Element、RenderObject 分别负责什么?
      • Flutter 的布局约束为什么会出现 overflow?
    • Node.js 与服务端 JavaScript
      • Node.js 的 process.nextTick 为什么可能饿死 I/O?
      • Node.js 流的背压是什么?
    • TypeScript
      • unknown、any、never 在工程里怎么用?
      • 泛型为什么不是“把 any 换成 T”?
    • AI 应用工程
      • Tool Calling 的前端状态机怎么设计?
      • RAG 引用如何在前端做到可验证?
    • 浏览器与网络进阶
      • HTTP 缓存的 no-cache 和 no-store 有什么区别?
      • CORS 预检怎样减少但不能乱省?
    • Angular、Svelte 与 Nuxt
      • Angular Signals 与 RxJS 怎么分工?
      • Svelte 编译式响应和 React 运行时更新有什么差异?
      • Nuxt 的 useAsyncData 为什么可能重复请求?
    • 小程序、Taro 与跨端
      • 小程序 setData 为什么是性能关键点?
      • Taro 一套代码多端运行,抽象边界怎么守?
    • 微前端与模块联邦
      • 微前端解决什么问题,什么时候不该用?
      • Module Federation 共享 React 为什么会出现 Invalid Hook Call?
    • Monorepo 与包工程
      • Monorepo 的任务缓存为什么会命中错误?
      • peerDependencies 什么时候必须用?
    • 测试与质量
      • React/Vue 组件测试为什么优先按角色查询?
      • Playwright 如何减少 E2E flaky?
    • 无障碍与设计系统
      • 自定义 Dialog 要满足哪些键盘与焦点规则?
      • 设计 Token 为什么不能只是颜色变量表?
    • PWA、Web Components 与新平台能力
      • Service Worker 更新为什么让用户一直用旧版本?
      • Web Component 的 Shadow DOM 解决了什么,没解决什么?
      • WebAssembly 适合把哪些前端任务搬过去?
    • 图形、实时通信与数据层
      • Canvas 大场景如何做拾取与局部更新?
      • WebSocket 断线重连怎样避免消息重复和雪崩?
      • GraphQL 的 N+1 和前端 overfetch 是一回事吗?
      • 前端状态应该放 URL、服务端缓存还是全局 Store?
    • 高频补充题库
      • 安全与网络补充
        • cookie 如何防范 XSS 攻击
    • 跨站请求伪造CSRF
      • 浏览器同源策略与ajax
    • 跨域资源共享 CORS
      • CORS 与 cookie
    • 密码安全
      • 性能与 HTTP 补充
        • Object.freeze优化长列表
    • 卡顿问题解决
    • 编码优化
    • 如何根据chrome的timing优化
      • 前端指标
    • Vue性能优化
      • HTTP 与监控
        • 如何捕获CDN上的js运行时导致的详细错误信息?
    • 强缓存命中发生了什么?
      • 默认的强制缓存时间是多少?
    • CORS跨域的原理
      • 设计模式与架构
        • 抽象工厂模式
    • 创建型-单例模式
      • 实现一个全局的模态框
    • 结构型-装饰器模式
      • 使用装饰器改写 Redux connect
    • 结构型-适配器模式
      • 生产实践:axios中的适配器
    • 结构型-代理模式
      • 缓存代理
    • 行为型-策略模式
      • 实现一个迭代器生成函数
    • 中介者模式
    • 享元模式
      • 数据结构与算法
        • 栈
        • 队列
        • 链表
        • 树
        • 堆
    • 算法
      • 位运算
      • 排序
      • 链表
      • 树
      • JavaScript 深入
        • async原理
    • 内存泄露
      • 动态原型模式
    • 数组相关
      • JS中flat—数组扁平化
    • 操作DOM
      • 操作DOM节点方法
    • Ajax总结
      • 使用XMLHttpRequest封装一个get和post请求
    • 定时器
      • requestAnimationFrame对比setTimeout
    • 谈谈你对for in/for of的理解
    • JavaScript 实现对上传图片的压缩?
      • 浏览器原理补充
        • Cookie 和 Session 的区别
    • 内存泄露
    • 浏览器API
      • requestAnimationFrame用法
      • 页面可见
      • 动画帧请求回调函数列表
      • 屏幕刷新频率
      • 动画原理
      • requestAnimationFrame用法
      • 与setTimeout对比
      • 优雅降级
    • 页面加载执行
      • 什么是 CRP,即关键渲染路径? 如何优化
    • history路由和hash路由
    • performance相关
      • React 补充
        • 非受控组件
    • 组件生命周期
      • fiber 架构
    • React18新增了哪些特性
      • useDeferredValue
    • React19新增了哪些特性
      • Vue 3 补充
        • 怎么缓存当前的组件?缓存后怎么更新
    • Vue路由相关
      • Node.js 补充
        • V8 的内存分代和回收算法请简单讲一讲
    • Buffer 模块
      • Buffer 乱码问题
    • webSocket
      • webSocket 协议升级简述一下
    • https
      • 工程化补充
        • 实现一个编译结束退出命令的插件
    • webpack编译优化
      • 性能工程补充
        • Gzip 压缩原理
    • 网络篇 2:图片优化——质量与性能的博弈
      • CDN 优化细节
    • 渲染篇 1:服务端渲染的探索与实践
      • 几棵重要的“树”
    • 不做无用功:基于渲染流程的 CSS 优化建议
完整面试题地址:
作者:程序员poetry
扫码关注作者公众号:「前端进阶之旅」 每天分享技术干货
前端进阶之旅公众号二维码

2026 前端面试题大全:100+ 最新面经与框架真题

# 2026 前端面试题大全:100+ 最新面经与框架真题

这份 2026 前端面试题与面经按技术方向持续更新,目前收录 100+ 道题。每道题都提供 30 秒速记、真实示例代码、可交互 DEMO 和面试官追问,适合校招、社招以及中高级前端面试前集中复习。

2026 年的前端面试没有放弃 JavaScript、CSS、浏览器和网络基础,但更强调把原理放进真实项目:排查 React 闭包与渲染性能、解释 Vue 3 响应式、选择 Webpack 或 Vite、划分 Next.js Server Component,以及处理大模型流式输出和审查 AI 生成代码。

# 2026 前端面试题分类

  • 基础核心: JavaScript 与浏览器、 CSS 与现代布局、 TypeScript、 浏览器与网络进阶
  • 主流框架: React 19 与 Next.js、 Vue 3、 Angular、Svelte 与 Nuxt
  • 工程化: Webpack、 Vite、 Monorepo 与包工程、 测试与质量
  • 渲染与架构: 服务端渲染与同构、 微前端与模块联邦、 性能与安全
  • 跨端开发: Electron、 React Native、 Flutter、 小程序、Taro 与跨端
  • AI 与服务端: AI 前端高频题、 AI 应用工程、 Node.js 与服务端 JavaScript

如果复习时间有限,可以先按 前端面试题复习路线补基础,再用本页做 2026 高频场景自测;临近面试时再结合 真实公司前端面经模拟追问。

# JavaScript 与浏览器

# 微任务为什么可能让页面“卡死”?

30 秒速记

  • 一轮同步任务结束后,浏览器会清空微任务队列,再决定是否渲染和执行下一个宏任务
  • 微任务执行时继续递归追加微任务,队列就可能一直清不完,定时器、输入和绘制都被饿死
  • Promise.then、queueMicrotask 都能制造这种问题;关键不是单次任务长,而是队列没有让出控制权
  • 修复要把长工作切片并主动让到新的任务,生产中还应设置批量上限和取消条件

微任务可能让页面“卡死”,是因为浏览器通常要清空当前微任务队列后,才有机会继续渲染或处理后续任务。 如果微任务执行时不断用 Promise.then 或 queueMicrotask 追加新微任务,队列就迟迟无法清空,绘制、输入和定时器都会等待。问题不一定是单次计算很慢,而是代码始终没有让出控制权。长工作应分批执行,并设置处理上限或取消条件,必要时切换到新的任务再继续。

# React 中的闭包为什么会读到旧状态?

30 秒速记

  • 每次渲染都会创建一套新的变量与函数,旧回调闭包捕获的是那次渲染的状态快照
  • setInterval、异步请求和事件订阅寿命较长,最容易暴露旧闭包
  • 只依赖前值时用函数式更新;需要读取最新值时可用 ref,但不要用它绕过正常渲染
  • useEffectEvent 适合“读取最新值但不希望它触发 Effect 重连”的事件逻辑,使用时要遵守当前 React 版本约束

React 每次渲染都会创建新的变量和函数,旧回调闭包保存的是当次渲染的状态快照,所以会读到旧状态。 这个问题常见于 setInterval、异步请求和事件订阅,因为它们可能在后续渲染完成后才执行。只根据前值更新时,我一般用函数式更新;确实要读取最新值时可以用 ref,但不应借它绕过正常渲染。若事件逻辑要读最新值、又不希望触发 Effect 重连,可考虑 useEffectEvent,同时遵守当前 React 版本的约束。

计数器只需要前值,函数式更新最直接;它接收提交时的最新状态,因此 Effect 不必依赖 count,也不会每次重建定时器。

import { useEffect, useState } from 'react'

export function Counter() {
  const [count, setCount] = useState(0)

  useEffect(() => {
    const timer = window.setInterval(() => {
      setCount((current) => current + 1)
    }, 1000)
    return () => window.clearInterval(timer)
  }, [])

  return <output>{count}</output>
}
@前端进阶之旅: 代码已经复制到剪贴板

不要机械地把每个值塞进依赖数组。先判断 Effect 是否应该随它重新同步;如果只是回调内部要读最新值,拆分事件逻辑比反复退订、重订更准确。

面试官追问

追问 1计数器页面的 setInterval 每秒执行 setCount(count + 1),界面却一直停在 1;既然回调持续运行,为什么它没有读到新的 count?
参考回答

定时器回调捕获的是创建该 Effect 时那次渲染中的 count,持续执行不等于闭包会自动切换到后续渲染。这里只依赖前值,应写成 setCount(current => current + 1),让 React 在提交更新时提供最新状态。

追问 2监控面板有十几个计数器,如果把 count 加进依赖数组也能递增,为什么代码评审仍可能要求改成函数式更新?
参考回答

把 count 加入依赖会在每次变化后清理并重建定时器,行为虽正确,却把“读取前值”误建模成了“重新同步外部系统”。函数式更新可让 Effect 保持空依赖,减少计时器重建及时间漂移风险。

追问 3聊天页连接只由 roomId 决定,但收到消息时要按最新 theme 显示通知;把 theme 放进依赖后每次换肤都会重连,边界该怎么拆?
参考回答

连接 Effect 应只依赖真正决定连接生命周期的 roomId,主题只属于消息回调中的展示逻辑。应把读取最新主题的事件逻辑与订阅过程拆开,避免为了更新通知样式而反复退订、重订。

追问 4线上偶发出现同一房间收到两份消息,你怀疑是为解决旧闭包而频繁重建订阅,会怎样验证?
参考回答

先记录 Effect 建立、清理时的 roomId 和订阅实例标识,再核对依赖变化与服务端连接日志,确认清理是否与重订一一对应。若把非生命周期值塞进依赖,任何主题或展示状态变化都可能扩大重复订阅窗口。

追问 5团队想规定所有异步回调都通过 ref.current 读取状态,避免再讨论依赖数组,这个约定是否合理?
参考回答

不合理,ref.current 虽能提供最新快照,却绕开响应式数据流,修改它也不会触发渲染。仅在命令式集成或确实需要最新快照时使用;状态只基于前值更新时,函数式更新更清晰、更受 React 调度语义约束。

# 如何实现可取消、不会串结果的搜索防抖?

30 秒速记

  • 防抖只减少触发频率,不能自动取消已经发出的旧请求
  • 输入变化时既要清定时器,也要 abort 上一次请求,避免旧响应覆盖新关键词
  • 用本次请求的 AbortController 绑定信号;卸载时执行同一套清理
  • AbortError 是预期控制流,不应当成线上异常上报

搜索防抖要同时清理定时器和取消旧请求,因为防抖只能减少触发次数,不能阻止已发出的旧响应覆盖新结果。 每次输入变化时,先 clearTimeout,再调用上一个 AbortController.abort(),并为新请求绑定新的 signal;组件卸载时也复用这套清理逻辑。AbortError 属于预期的取消流程,不需要当作线上异常上报。还要处理空关键词和组合输入法;如果服务端无法真正中断请求,就比较请求序号,只让最新请求更新界面。

export function createSearch(search: (q: string, signal: AbortSignal) => Promise<void>) {
  let timer: ReturnType<typeof setTimeout> | undefined
  let controller: AbortController | undefined

  return (query: string) => {
    if (timer) clearTimeout(timer)
    controller?.abort()
    controller = new AbortController()
    const signal = controller.signal

    timer = setTimeout(async () => {
      try {
        await search(query, signal)
      } catch (error) {
        if (!(error instanceof DOMException && error.name === 'AbortError')) throw error
      }
    }, 300)
  }
}
@前端进阶之旅: 代码已经复制到剪贴板

生产代码还要处理空关键词、组合输入法和服务端不支持中断的情况。即使网络层无法真正取消,也应比较请求序号,只允许最新请求提交 UI。

面试官追问

追问 1商品搜索页先输入 rea,请求较慢,随后输入 react,后一个请求先返回;已经做了 300ms 防抖,为什么列表仍可能被旧结果覆盖?
参考回答

防抖只减少请求次数,不能保证已发请求按输入顺序返回,因此 rea 仍可能最后提交 UI。每次新输入应清除定时器并中止旧请求;即使无法真正中断网络,也要比较请求序号,只接纳最新结果。

追问 2封装 createSearch 时,新关键词到来应在定时器回调里再创建 AbortController,还是输入发生时就创建并取消旧控制器?
参考回答

应在新输入发生时立即清除旧定时器、取消旧控制器,再为本次查询创建 AbortController。这样既取消尚未执行的任务,也尽早通知已经执行的搜索停止;捕获异常时只吞掉明确的 AbortError,其他错误仍需上报。

追问 3中文用户输入“北京”时,搜索框在拼音组合阶段连续触发 input,产品又要求最终文字出现后尽快搜索,事件层怎么处理?
参考回答

在 compositionstart 后暂停触发搜索,在 compositionend 取得最终文本,再进入同一套防抖流程。不要把组合期间的字母当成有效查询,否则既浪费请求,也可能让中间结果在最终中文结果之后覆盖页面。

追问 4用户清空关键词后列表仍显示上一轮结果,同时开发者工具里旧请求显示已取消,你会优先检查哪些状态转换?
参考回答

先确认空字符串分支是否同步清除定时器、调用 abort() 并重置列表与加载态,再检查旧 Promise 的完成逻辑是否仍会写入 UI。仅让网络请求显示取消并不够,空关键词也必须成为一次明确的最新状态。

追问 5搜索接口在服务端不支持中断,前端调用 abort() 后后台仍完成计算;这时可取消方案还能保证什么,不能保证什么?
参考回答

它仍可阻止客户端继续消费旧响应,并配合请求序号避免旧数据提交 UI,但不能保证服务端停止计算。若操作带有写入副作用,还需服务端幂等键或版本校验,不能把客户端取消当成事务回滚。

# React 19 与 Next.js

# Hooks 为什么不能写在条件分支里?

30 秒速记

  • React 用调用顺序把每次 Hook 与组件内部的状态槽位对应,不靠变量名匹配
  • 条件分支让下一次渲染的调用序列变化,后续状态会错位
  • 条件应放进 Hook 内部,或拆成条件渲染的子组件
  • 自定义 Hook 仍然要遵守同一规则,因为它最终会展开成一串 Hook 调用

Hooks 不能写在条件分支里,因为 React 是按调用顺序把每个 Hook 对应到组件内部状态槽位的。 某次渲染跳过一个 Hook 后,后面的调用位置就会变化,状态和副作用可能因此错位。通常把条件作为参数传进 Hook,例如用 null 表示暂不请求;也可以由父组件条件渲染子组件,让它整体挂载或卸载。自定义 Hook 也不能例外,因为它执行后仍是一串有固定顺序的 Hook 调用。

fe
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 2026 年前端面经
    • 2026 前端面试题分类
    • JavaScript 与浏览器
      • 微任务为什么可能让页面“卡死”?
      • React 中的闭包为什么会读到旧状态?
      • 如何实现可取消、不会串结果的搜索防抖?
    • React 19 与 Next.js
      • Hooks 为什么不能写在条件分支里?
      • Server Component 和 Client Component 边界怎么划?
      • Next.js 缓存导致数据旧了,怎么定位?
    • 性能与安全
      • INP 高但接口很快,前端怎么排查?
      • AI 返回的 Markdown 怎么防 XSS?
      • 大计算放进 Web Worker 为什么页面仍可能卡?
    • AI 前端高频题
      • 为什么大模型流式输出常用 SSE,不用 WebSocket?
      • AI 流式输出如何避免每个 token 都触发一次渲染?
      • 面试中如何证明你会审查 AI 生成的代码?
    • CSS 与现代布局
      • 容器查询和媒体查询怎么选?
      • z-index: 9999 为什么仍然被遮住?
    • Vue 3
      • ref 和 reactive 在 Vue 3 中怎么选?
      • computed、watch、watchEffect 的边界是什么?
      • Vue 3 的 Diff 为什么需要稳定 key?
    • React 19 深入题
      • useOptimistic 解决什么问题,失败时怎么回滚?
      • React 19 的 Action 与普通事件请求有什么差别?
      • React Compiler 出现后还要手写 useMemo 吗?
    • Webpack
      • Webpack 的 Loader 和 Plugin 本质区别是什么?
      • Webpack 的长期缓存为什么会失效?
    • Vite
      • Vite 开发环境为什么快,生产为什么还要打包?
      • Vite HMR 为什么有时退化成整页刷新?
    • 服务端渲染与同构
      • SSR、SSG、流式 SSR 应该怎么选?
      • Hydration mismatch 怎么系统定位?
    • Electron
      • Electron 主进程、渲染进程和 preload 怎么分工?
      • Electron 自动更新如何做到安全和可回滚?
    • React Native
      • React Native 新架构解决了旧 Bridge 的什么问题?
      • React Native 列表如何避免白屏和掉帧?
    • Flutter
      • Flutter 的 Widget、Element、RenderObject 分别负责什么?
      • Flutter 的布局约束为什么会出现 overflow?
    • Node.js 与服务端 JavaScript
      • Node.js 的 process.nextTick 为什么可能饿死 I/O?
      • Node.js 流的背压是什么?
    • TypeScript
      • unknown、any、never 在工程里怎么用?
      • 泛型为什么不是“把 any 换成 T”?
    • AI 应用工程
      • Tool Calling 的前端状态机怎么设计?
      • RAG 引用如何在前端做到可验证?
    • 浏览器与网络进阶
      • HTTP 缓存的 no-cache 和 no-store 有什么区别?
      • CORS 预检怎样减少但不能乱省?
    • Angular、Svelte 与 Nuxt
      • Angular Signals 与 RxJS 怎么分工?
      • Svelte 编译式响应和 React 运行时更新有什么差异?
      • Nuxt 的 useAsyncData 为什么可能重复请求?
    • 小程序、Taro 与跨端
      • 小程序 setData 为什么是性能关键点?
      • Taro 一套代码多端运行,抽象边界怎么守?
    • 微前端与模块联邦
      • 微前端解决什么问题,什么时候不该用?
      • Module Federation 共享 React 为什么会出现 Invalid Hook Call?
    • Monorepo 与包工程
      • Monorepo 的任务缓存为什么会命中错误?
      • peerDependencies 什么时候必须用?
    • 测试与质量
      • React/Vue 组件测试为什么优先按角色查询?
      • Playwright 如何减少 E2E flaky?
    • 无障碍与设计系统
      • 自定义 Dialog 要满足哪些键盘与焦点规则?
      • 设计 Token 为什么不能只是颜色变量表?
    • PWA、Web Components 与新平台能力
      • Service Worker 更新为什么让用户一直用旧版本?
      • Web Component 的 Shadow DOM 解决了什么,没解决什么?
      • WebAssembly 适合把哪些前端任务搬过去?
    • 图形、实时通信与数据层
      • Canvas 大场景如何做拾取与局部更新?
      • WebSocket 断线重连怎样避免消息重复和雪崩?
      • GraphQL 的 N+1 和前端 overfetch 是一回事吗?
      • 前端状态应该放 URL、服务端缓存还是全局 Store?
    • 高频补充题库
      • 安全与网络补充
        • cookie 如何防范 XSS 攻击
    • 跨站请求伪造CSRF
      • 浏览器同源策略与ajax
    • 跨域资源共享 CORS
      • CORS 与 cookie
    • 密码安全
      • 性能与 HTTP 补充
        • Object.freeze优化长列表
    • 卡顿问题解决
    • 编码优化
    • 如何根据chrome的timing优化
      • 前端指标
    • Vue性能优化
      • HTTP 与监控
        • 如何捕获CDN上的js运行时导致的详细错误信息?
    • 强缓存命中发生了什么?
      • 默认的强制缓存时间是多少?
    • CORS跨域的原理
      • 设计模式与架构
        • 抽象工厂模式
    • 创建型-单例模式
      • 实现一个全局的模态框
    • 结构型-装饰器模式
      • 使用装饰器改写 Redux connect
    • 结构型-适配器模式
      • 生产实践:axios中的适配器
    • 结构型-代理模式
      • 缓存代理
    • 行为型-策略模式
      • 实现一个迭代器生成函数
    • 中介者模式
    • 享元模式
      • 数据结构与算法
        • 栈
        • 队列
        • 链表
        • 树
        • 堆
    • 算法
      • 位运算
      • 排序
      • 链表
      • 树
      • JavaScript 深入
        • async原理
    • 内存泄露
      • 动态原型模式
    • 数组相关
      • JS中flat—数组扁平化
    • 操作DOM
      • 操作DOM节点方法
    • Ajax总结
      • 使用XMLHttpRequest封装一个get和post请求
    • 定时器
      • requestAnimationFrame对比setTimeout
    • 谈谈你对for in/for of的理解
    • JavaScript 实现对上传图片的压缩?
      • 浏览器原理补充
        • Cookie 和 Session 的区别
    • 内存泄露
    • 浏览器API
      • requestAnimationFrame用法
      • 页面可见
      • 动画帧请求回调函数列表
      • 屏幕刷新频率
      • 动画原理
      • requestAnimationFrame用法
      • 与setTimeout对比
      • 优雅降级
    • 页面加载执行
      • 什么是 CRP,即关键渲染路径? 如何优化
    • history路由和hash路由
    • performance相关
      • React 补充
        • 非受控组件
    • 组件生命周期
      • fiber 架构
    • React18新增了哪些特性
      • useDeferredValue
    • React19新增了哪些特性
      • Vue 3 补充
        • 怎么缓存当前的组件?缓存后怎么更新
    • Vue路由相关
      • Node.js 补充
        • V8 的内存分代和回收算法请简单讲一讲
    • Buffer 模块
      • Buffer 乱码问题
    • webSocket
      • webSocket 协议升级简述一下
    • https
      • 工程化补充
        • 实现一个编译结束退出命令的插件
    • webpack编译优化
      • 性能工程补充
        • Gzip 压缩原理
    • 网络篇 2:图片优化——质量与性能的博弈
      • CDN 优化细节
    • 渲染篇 1:服务端渲染的探索与实践
      • 几棵重要的“树”
    • 不做无用功:基于渲染流程的 CSS 优化建议