2025 大厂前端面经:12 道高频题 + 避坑解析,看完直接冲 offer!
2025 年的前端面试卷到什么程度?字节一面问 RSC 原理,阿里二面考 Tauri 打包配置,美团三面让手写 AI 协作的性能优化方案 —— 不是我卷,是面试官的问题已经更新到 “2025 特供版” 了。
整理了近期亲历 + 社群汇总的 12 道大厂高频面试题,覆盖框架新特性、工程化、性能优化、场景编程四大核心模块。每道题都附 “考点拆解 + 标准答案 + 避坑指南”,还有实际项目案例,看完不用死记硬背,直接能应对 80% 的大厂面试场景~
🚀 框架新特性篇:2025 必问,不懂直接挂一面
框架题早已不是 “Vue 和 React 区别” 这种基础题,2025 年大厂重点盯新特性落地能力,这 3 道题几乎家家都问:
1. 什么是 React Server Components(RSC)?和 Client Components 的核心区别是什么?
-
面试官想考察:是否跟进 React 最新生态,能否落地 Next.js 13 + 项目。
-
标准答案:RSC 是 React 18 + 推出的组件类型,在服务器端渲染,无需打包到客户端 bundle 中。核心区别有 3 点:
- 渲染位置:RSC 在服务端渲染,Client Components 在客户端渲染;
- 功能限制:RSC 不能用 useState、useEffect 等客户端钩子,也不能访问 window/document;
- 数据获取:RSC 可直接异步请求数据(无需 SWR/React Query),Client Components 需通过 API 获取。
-
代码示例(Next.js 14) :
jsx
// Server Component(默认,无需标注) export default async function BlogPage() { // 服务端直接请求数据,无需异步钩子 const posts = await fetch('https://api.example.com/posts').then(res => res.json()); return ( <div> {posts.map(post => <PostCard key={post.id} post={post} />)} </div> ); } // Client Component(需标注'use client') 'use client' import { useState } from 'react'; export default function PostCard({ post }) { const [liked, setLiked] = useState(false); // 可使用状态钩子 return ( <div onClick={() => setLiked(!liked)}> <h3>{post.title}</h3> <p>{liked ? '❤️ 已点赞' : '🤍 点赞'}</p> </div> ); } -
避坑点:不要说 “RSC 是 SSR”,SSR 是将组件渲染为 HTML 字符串,RSC 是组件本身在服务端执行,能减少客户端 JS 体积。
2. Vue3 为什么用 Proxy 替代 Vue2 的 defineProperty?编译阶段做了哪些优化?
-
面试官想考察:Vue 底层原理理解,不是只停留在 API 使用。
-
标准答案:
-
Proxy 替代 defineProperty 的原因:
- defineProperty 只能监听单个属性,Proxy 可监听整个对象,包括新增属性、删除属性;
- defineProperty 需递归遍历对象所有属性,Proxy 在 getter 中惰性递归,性能更优;
- Proxy 支持数组索引、length 属性的监听,defineProperty 不支持。
-
编译优化:
- 生成 Block Tree:按动态节点切割模板,只追踪动态节点,渲染效率与动态节点数量正相关;
- 静态标记(PatchFlag):给动态节点打标记,diff 时只对比带标记的节点;
- 静态提升:将静态节点提升到渲染函数外部,避免每次渲染重新创建。
-
3. Vue3 的 Composition API 和 React Hooks 有什么异同?实际项目中怎么选?
-
面试官想考察:框架横向对比能力,技术选型思维。
-
标准答案:相同点:都是为了逻辑复用,摆脱选项式 API 的限制。不同点:
维度 Composition API React Hooks 依赖追踪 基于 Proxy 自动追踪 基于依赖数组手动声明 生命周期 可直接使用 onMounted 等 需 useEffect 模拟 逻辑拆分 可按功能拆分多个函数 需按 Hooks 拆分 -
选型建议:
- 团队熟悉 Vue 生态,追求开发效率选 Composition API;
- 项目复杂、需深度定制化,选 React Hooks(灵活性更高);
- 跨端项目:用 Vue3+UniApp 选 Composition API,用 React Native 选 React Hooks。
🔧 工程化 & 跨端篇:大厂进阶必备,二面高频
工程化是区分初级和中级前端的关键,2025 年还加入了跨端新工具考点:
4. Vite 比 Webpack 快的核心原因是什么?生产环境下需要做哪些优化配置?
-
面试官想考察:工程化工具实战经验,不是只会用默认配置。
-
标准答案:
-
快的核心原因:
- 开发环境:基于 ES Module 原生支持,无需打包,启动时只编译入口文件;
- 热更新:基于原生 ESM 的热模块替换(HMR),只更新修改的模块,不刷新页面;
- 依赖预构建:用 Esbuild(Go 编写)预构建第三方依赖,比 Webpack 的 Terser 快 10-100 倍。
-
生产环境优化配置:
javascript
// vite.config.js export default defineConfig({ build: { target: 'es2015', // 兼容低版本浏览器 minify: 'terser', // 比esbuild压缩更彻底 chunkSizeWarningLimit: 1000, // 拆分大文件 rollupOptions: { output: { // 按模块拆分chunk manualChunks: { react: ['react', 'react-dom'], utils: ['lodash-es', 'date-fns'] } } } }, esbuild: { drop: ['console', 'debugger'] // 移除console和debugger } });
-
5. Tauri 和 Electron 的核心区别是什么?如何打包一个 Tauri 应用?
-
面试官想考察:跨端技术视野,是否跟进轻量跨端趋势。
-
标准答案:
-
核心区别:
- 内核:Tauri 用系统原生 Webview,Electron 内置 Chromium;
- 体积:Tauri 应用体积 5-20MB,Electron 通常 200MB+;
- 性能:Tauri 内存占用比 Electron 低 85%,启动速度快 3 倍;
- 安全:Tauri 基于 Rust,Electron 基于 Node.js,Rust 类型系统更安全。
-
打包步骤:
bash
# 1. 安装依赖 npm install @tauri-apps/cli -D # 2. 配置tauri.conf.json { "build": { "distDir": "../dist", "devPath": "http://localhost:3000" }, "windows": { "iconPath": "icons/windows/icon.ico" }, "macOS": { "iconPath": "icons/mac/icon.icns" } } # 3. 打包命令 npx tauri build
-
6. 如何设计一个前端工程化体系?包含哪些核心模块?
-
面试官想考察:架构设计能力,团队协作经验。
-
标准答案:核心模块包含 5 部分:
- 构建工具:Vite/Webpack(打包构建);
- 代码规范:ESLint(代码检查)+ Prettier(格式美化)+ Husky(Git Hooks);
- 测试体系:Jest(单元测试)+ Cypress(E2E 测试)+ Vitest(快速单元测试);
- 部署流程:CI/CD(GitHub Actions/GitLab CI)+ 环境隔离(dev/test/prod);
- 监控告警:性能监控(Lighthouse)+ 错误监控(Sentry)+ 用户行为分析(百度统计)。
-
避坑点:不要只说工具名称,要说明每个模块的作用和选型理由。
⚡ 性能优化篇:大厂必问,能拉开差距
性能优化是面试 “加分项”,2025 年考点更偏向 “AI + 性能” 结合:
7. 如何用 RSC + 边缘计算优化首屏加载速度?实际项目中能提升多少?
-
面试官想考察:新技术落地性能优化的能力。
-
标准答案:
-
优化方案:
- RSC 负责服务端渲染核心内容,减少客户端 JS 体积,首屏 JS 加载量减少 40%-60%;
- 边缘计算(Cloudflare Workers/Vercel Edge Functions)将服务端渲染节点部署在离用户最近的边缘节点,TTFB(首字节时间)从 300ms 降至 50ms 内;
- 静态资源(图片 / CSS)用 CDN 分发,配合懒加载和 WebP 格式。
-
实际效果:我负责的电商项目用这套方案后,首屏加载时间从 2.8s 降至 0.9s,用户留存率提升 15%。
-
8. 如何检测和优化页面的 Long Task?有哪些工具可以用?
-
面试官想考察:性能问题排查实战能力。
-
标准答案:
-
Long Task 检测:
- 定义:执行时间超过 50ms 的任务,会导致页面卡顿;
- 工具:Chrome DevTools(Performance 面板)、PerformanceObserver API、Lighthouse。
-
优化方案:
javascript
// 用PerformanceObserver监听Long Task const observer = new PerformanceObserver((entries) => { entries.forEach(entry => { if (entry.duration > 50) { console.warn('Long Task detected:', entry); } }); }); observer.observe({ entryTypes: ['longtask'] }); // 优化:拆分长任务为微任务 function splitLongTask(taskList) { const chunkSize = 10; // 每次处理10个任务 let index = 0; function processChunk() { for (let i = 0; i < chunkSize && index < taskList.length; i++) { taskList[index](); index++; } if (index < taskList.length) { requestIdleCallback(processChunk); // 空闲时继续处理 } } processChunk(); }
-
9. AI 工具(如 Copilot)生成的代码,如何做性能优化?
-
面试官想考察:AI 协作时代的代码质量控制能力。
-
标准答案:
-
常见问题:AI 生成的代码冗余、没有考虑性能(如重复渲染、不必要的循环);
-
优化步骤:
- 去冗余:删除未使用的变量和函数,合并重复逻辑;
- 性能优化:React 组件加 memo 缓存,列表渲染加 key,避免闭包陷阱;
- 安全校验:检查是否有 XSS 风险(如直接插入 HTML)、内存泄漏(如未清除定时器)。
-
-
示例:AI 生成的未优化代码 vs 优化后代码:
jsx
// AI生成(未优化) function UserList({ users }) { return ( <div> {users.map(user => ( <div onClick={() => console.log(user.id)}> {user.name} - {new Date(user.createTime).toLocaleString()} </div> ))} </div> ); } // 优化后 const UserItem = React.memo(({ user, onLog }) => ( <div onClick={onLog}> {user.name} - {user.formattedTime} {/* 提前格式化时间,避免每次渲染计算 */} </div> )); function UserList({ users }) { // 格式化时间缓存 const formattedUsers = useMemo(() => users.map(user => ({ ...user, formattedTime: new Date(user.createTime).toLocaleString() })), [users] ); const handleLog = useCallback((id) => console.log(id), []); return ( <div> {formattedUsers.map(user => ( <UserItem key={user.id} user={user} onLog={() => handleLog(user.id)} /> ))} </div> ); }
🧩 场景编程题:手写代码,三面决胜
大厂三面必选手写题,考察编码能力和边界处理:
10. 手写限制并发请求数的函数(如最多同时发起 3 个请求)
-
面试官想考察:异步编程、队列管理能力。
-
标准答案:
javascript
function limitRequest(urls, limit) { return new Promise((resolve) => { if (!urls.length) { resolve([]); return; } const results = []; // 存储结果 let currentIndex = 0; // 当前请求索引 let completed = 0; // 已完成请求数 // 发起单个请求 async function request() { const index = currentIndex++; const url = urls[index]; try { const response = await fetch(url); results[index] = await response.json(); } catch (error) { results[index] = error; } finally { completed++; // 完成后继续发起下一个请求 if (currentIndex < urls.length) { request(); } else if (completed === urls.length) { resolve(results); } } } // 初始化limit个并发请求 const startCount = Math.min(limit, urls.length); for (let i = 0; i < startCount; i++) { request(); } }); } // 用法:最多3个并发请求 limitRequest(['url1', 'url2', 'url3', 'url4', 'url5'], 3).then(results => console.log(results));
11. 手写数组扁平化和去重的组合函数(支持任意深度)
-
面试官想考察:数组操作、递归 / 迭代能力。
-
标准答案:
javascript
// 方法1:递归+Set function flattenAndUnique(arr) { return [...new Set( arr.reduce((acc, item) => acc.concat(Array.isArray(item) ? flattenAndUnique(item) : item), []) )]; } // 方法2:迭代(避免栈溢出)+ Set function flattenAndUnique(arr) { const stack = [...arr]; const result = []; while (stack.length) { const item = stack.pop(); if (Array.isArray(item)) { stack.push(...item); // 数组元素压入栈 } else { result.push(item); } } return [...new Set(result)]; } // 测试:flattenAndUnique([1, [2, [3, 3], 4], 5, 2]) → [1,2,3,4,5]
12. 手写防抖函数(支持立即执行和取消功能)
-
面试官想考察:闭包、定时器、边界处理能力。
-
标准答案:
javascript
function debounce(fn, delay, immediate = false) { let timer = null; let isImmediate = false; const debounced = function(...args) { const context = this; // 清除之前的定时器 if (timer) clearTimeout(timer); // 立即执行 if (immediate && !isImmediate) { fn.apply(context, args); isImmediate = true; return; } // 延迟执行 timer = setTimeout(() => { fn.apply(context, args); isImmediate = false; timer = null; }, delay); }; // 取消功能 debounced.cancel = function() { clearTimeout(timer); timer = null; isImmediate = false; }; return debounced; } // 用法 const handleSearch = debounce((key) => console.log('搜索:', key), 500, true); // 取消防抖 // handleSearch.cancel();
📌 面试避坑 & 加分技巧
- 回答原理题时,不要只背概念,要结合 “是什么 + 为什么 + 怎么用 + 项目案例”;
- 手写代码时,先问清边界条件(如是否允许用原生 API、是否需要处理错误);
- 被问到不会的问题,不要直接说 “不会”,可以说 “我没深入研究过,但我了解类似的 XX 技术,思路可能是 XXX”;
- 准备 1-2 个自己做过的性能优化或工程化项目,用 STAR 法则(场景 - 任务 - 行动 - 结果)阐述,突出数据成果。
2025 年的前端面试,不再是 “背八股文就能过” 的时代,更看重技术落地能力和持续学习能力。这些题都是大厂近期高频考察的核心,把每道题的原理和代码吃透,面试时就能从容应对~