版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025年高频前端面试题(含答案)1.如何理解Vue3组合式API(CompositionAPI)与选项式API(OptionsAPI)的核心差异?实际项目中如何选择?Vue3组合式API与选项式API的核心差异体现在代码组织方式和逻辑复用能力上。选项式API以data、methods、computed等选项划分代码块,适合小型项目,逻辑按功能类型分散在不同选项中;组合式API通过setup函数和自定义hook(如useFetch、useCounter)将关联逻辑聚合,解决了复杂组件中“逻辑关注点分散”的问题(例如一个组件同时涉及数据请求、表单验证、动画控制时,选项式API会导致同一逻辑的代码分散在data、methods、watch等不同选项里)。选择依据:小型项目或需要快速上手时推荐选项式API,其结构符合直觉;中大型项目或需要高复用性逻辑(如跨组件共享的表单验证逻辑)时,组合式API通过自定义hook实现逻辑抽离更高效。需注意组合式API对TypeScript支持更友好,若项目使用TS,优先选择组合式API。2.React18中Concurrent模式的核心改进是什么?如何影响组件渲染行为?Concurrent模式的核心是“可中断的异步渲染”,通过优先级调度(Lane模型)和时间分片(基于requestIdleCallback优化)实现更平滑的用户体验。传统同步渲染(Legacy模式)中,组件渲染一旦开始就无法中断,若组件树复杂会导致主线程阻塞超过50ms,出现卡顿;Concurrent模式下,渲染过程可根据任务优先级中断,优先处理用户输入(如点击、滚动)等高优先级任务,待空闲时恢复低优先级渲染。具体影响:①组件渲染可能被中断并重新开始(需保证组件纯函数特性,避免副作用在渲染阶段执行);②支持Suspense组件的异步边界(如数据加载时显示加载状态,数据就绪后无缝切换);③自动批处理(Batching)范围扩大,即使在setTimeout、Promise回调中调用setState也会合并更新(React18前仅事件回调内批处理)。3.简述Vite4.x相比Webpack5的核心优势,以及各自适用场景。Vite4.x基于ES模块原生支持(ESModules),开发阶段使用esbuild预构建依赖(速度比Webpack的babel快10-100倍),并通过HTTP服务器直接提供ES模块(无需打包),实现秒级冷启动和即时热更新(HMR耗时<100ms)。生产环境使用Rollup打包,利用Tree-shaking和现代浏览器的原生支持优化产物。Webpack5通过持久化缓存(cache:{type:'filesystem'})、模块联邦(ModuleFederation)、更智能的tree-shaking等特性提升构建性能,但开发阶段需完整打包,冷启动时间随项目增大而增加(大型项目可能超过10秒)。适用场景对比:Vite适合现代框架(Vue/React/Svelte)的中大型前端项目(尤其注重开发体验)、静态网站(SSG)或轻量级应用;Webpack适合需要复杂插件生态(如传统多页应用、需要IE兼容)、微前端(模块联邦跨应用共享组件)或需要深度定制构建流程(如自定义优化器、多环境变量处理)的项目。4.如何实现一个高性能的前端图片加载方案?需考虑哪些关键指标?高性能图片加载方案需结合格式优化、加载策略、懒加载和缓存策略:(1)格式优化:优先使用WebP(比JPEG小25-35%),对不支持的浏览器降级为AVIF(更高压缩率)或JPEGXL;图标类图片使用SVG(矢量无失真)或压缩后的PNG(通过ImageOptim工具压缩)。(2)加载策略:①响应式图片(srcset+sizes):根据设备分辨率和视口宽度加载合适尺寸的图片(如<imgsrcset="small.jpg480w,medium.jpg768w,large.jpg1200w"sizes="(max-width:600px)480px,800px">);②占位图(低质量模糊图LQIP或SVG占位):在图片加载前显示模糊预览,减少白屏时间。(3)懒加载:使用IntersectionObserverAPI监听图片是否进入视口(替代传统的scroll事件监听),仅当图片接近可视区域时加载。注意设置loading="lazy"属性(现代浏览器支持)作为补充。(4)缓存策略:通过HTTP头设置长缓存(Cache-Control:max-age=31536000),图片哈希命名(如image-abc123.jpg)实现内容变化时自动失效;使用ServiceWorker缓存高频访问图片,离线时仍可显示。关键指标:①首屏图片加载时间(需<1.5s);②图片总字节数(建议首屏图片总大小<150KB);③CLS(累积布局偏移):通过aspect-ratio属性或padding-top占位符固定图片容器尺寸,避免加载时布局跳动;④LCP(最大内容ful填充时间):首屏最大图片需优化至<2.5s。5.解释JavaScript事件循环(EventLoop)的执行机制,微任务(Microtask)和宏任务(Macrotask)的执行顺序如何?事件循环是JavaScript处理异步任务的核心机制,主线程执行完同步代码后,会不断循环从任务队列中取出任务执行。具体步骤:(1)执行全局同步代码,创建执行上下文栈。(2)执行完同步代码后,检查微任务队列(MicrotaskQueue),按顺序执行所有微任务(包括Promise.then/catch/finally、MutationObserver回调、queueMicrotask()添加的任务)。(3)微任务队列清空后,进行一次浏览器重渲染(UpdatetheRender),包括重排(Reflow)和重绘(Repaint)。(4)渲染完成后,从宏任务队列(MacrotaskQueue)中取出一个宏任务执行(包括setTimeout、setInterval、setImmediate(Node.js)、I/O操作、UI事件回调)。(5)重复步骤(2)-(4),形成循环。执行顺序示例:```javascriptconsole.log('scriptstart');//同步任务,立即执行setTimeout(()=>{//宏任务console.log('setTimeout');},0);Promise.resolve().then(()=>{//微任务console.log('promise1');}).then(()=>{console.log('promise2');});console.log('scriptend');//同步任务,立即执行//输出顺序://scriptstart→scriptend→promise1→promise2→setTimeout```6.如何实现一个通用的前端错误监控方案?需捕获哪些类型的错误?通用错误监控方案需覆盖运行时错误、资源加载错误、Promise未捕获拒绝、全局未捕获异常,并支持错误上报和上下文信息收集。(1)运行时错误(RuntimeErrors):通过window.addEventListener('error',callback)捕获,可获取错误信息(message)、堆栈(stack)、发生位置(filename、lineno、colno)。注意:该事件也会捕获资源加载错误(如img、script加载失败),需通过event.type区分(资源错误的event.target为具体元素)。(2)Promise未捕获拒绝(UnhandledPromiseRejections):通过window.addEventListener('unhandledrejection',callback)捕获,可获取拒绝原因(reason)和Promise对象。(3)全局未捕获异常(Node环境适用,但前端可通过类似思路):前端主要依赖上述两种事件,配合框架特定错误边界(如React的ErrorBoundary、Vue的errorHandler)捕获组件级错误。(4)上下文信息收集:需记录用户信息(UID、设备类型)、环境信息(浏览器版本、操作系统、屏幕分辨率)、页面信息(URL、路由、Referrer)、错误发生时的DOM状态(如当前点击的元素)、性能指标(如FCP、LCP)。(5)错误上报:通过BeaconAPI(navigator.sendBeacon)或XMLHttpRequest发送到后端,确保页面卸载时仍能成功上报。对高频错误需做防抖(如同一错误5分钟内只上报一次)和采样(如只上报10%的错误),避免服务器压力。7.简述WebAssembly(Wasm)在前端中的典型应用场景,以及与JavaScript的协作方式。WebAssembly是一种二进制指令格式,设计目标是在浏览器中实现接近原生的执行速度(比JS快10-100倍),适用于计算密集型任务。典型场景:(1)图形处理:如图片/视频编解码(WebAssembly实现WebP编码比JS快3倍)、3D渲染(替代部分WebGL的JS胶水代码)。(2)科学计算:如物理引擎(游戏中的碰撞检测)、金融风控的复杂算法(实时计算大量数据)。(3)跨语言移植:将C/C++/Rust编写的库(如FFmpeg、SQLite)编译为Wasm,在前端调用(如视频编辑工具直接使用FFmpeg的Wasm版本进行转码)。与JavaScript的协作方式:(1)导入/导出函数:Wasm模块可导出函数供JS调用(如C函数通过EMSCRIPTEN_KEEPALIVE标记后,编译为Wasm的exports对象),JS也可向Wasm导入函数(如传递DOM操作回调)。(2)内存共享:Wasm使用线性内存(ArrayBuffer)与JS共享数据,JS通过WebAssembly.Memory对象访问Wasm内存,需注意类型转换(如将JS字符串转为UTF-8字节数组存入Wasm内存)。(3)异步调用:Wasm本身不支持异步(如网络请求),需通过JS桥接(如在Wasm中调用导入的JS函数,由JS执行fetch后回调Wasm)。8.如何优化React组件的渲染性能?请列举至少5种具体方法。(1)使用React.memo缓存组件:对纯函数组件(输入props不变则输出不变),用React.memo包裹,避免重复渲染(默认浅比较props,可通过第二个参数自定义比较函数)。(2)优化state粒度:避免将大对象作为state(如整个表单数据),拆分为多个小state(如单独管理inputValue和isValid),减少不必要的重新渲染。(3)使用useCallback和useMemo缓存函数/计算值:通过useCallback缓存传递给子组件的回调函数(避免父组件渲染时函数引用变化导致子组件重新渲染),useMemo缓存耗时计算的结果(如列表过滤后的数组)。(4)虚拟化长列表:使用react-window或react-virtualized库,仅渲染可视区域内的列表项(如1000条数据只渲染20条),减少DOM节点数量。(5)避免在渲染阶段执行副作用:将数据请求、定时器等副作用移至useEffect,避免在组件函数体中执行(会导致每次渲染都重新执行,浪费性能)。(6)使用useDeferredValue延迟更新:对非紧急的状态更新(如搜索结果高亮),用useDeferredValue包裹,允许React推迟更新,优先响应高优先级任务(如用户输入)。9.解释Vue3响应式系统的实现原理(基于Proxy),并说明与Vue2的Object.defineProperty的区别。Vue3响应式系统核心是通过Proxy对象拦截目标对象的属性访问(get)和修改(set)操作,关联依赖(Dep)和触发更新(Trigger)。具体流程:(1)当访问响应式对象的属性(如obj.foo)时,Proxy的get陷阱被触发,调用track函数,将当前活跃的副作用函数(effect)添加到该属性的依赖集合(Dep)中。(2)当修改属性值(如obj.foo='bar')时,Proxy的set陷阱被触发,调用trigger函数,遍历该属性的依赖集合,执行所有副作用函数(重新渲染组件或更新计算属性)。与Vue2的Object.defineProperty的区别:(1)支持深层响应式:Vue2需递归遍历对象属性并为每个属性添加getter/setter,对数组的push、pop等方法需重写;Vue3的Proxy可直接拦截对象的所有属性(包括新增、删除),无需递归初始化,对数组的原生方法(如push)也能自动触发更新(通过拦截length属性的变化)。(2)支持Symbol类型属性:Object.defineProperty无法监听Symbol类型的属性,而Proxy可以拦截所有类型的属性键。(3)性能优化:Vue3的响应式系统在初始化时无需深度遍历对象(仅在访问嵌套属性时动态创建响应式),减少了初始化时间,尤其适合大型对象。10.编写一个函数实现数组扁平化(flatten),要求支持深度控制,且尽可能高效。```javascriptfunctionflatten(arr,depth=1){returnarr.reduce((acc,val)=>{if(Array.isArray(val)&&depth>0){//递归展开,深度减1returnacc.concat(flatten(val,depth1));}else{returnacc.concat(val);}},[]);}//测试用例console.log(flatten([1,[2,[3,[4]],5]],2));//[1,2,3,[4],5]console.log(flatten([1,[2,[3,[4]],5]],Infinity));//[1,2,3,4,5]```优化说明:使用reduce方法遍历数组,避免了push的多次调用(concat更高效);通过深度参数控制展开层级,默认展开1层;当depth为Infinity时,递归展开所有层级(通过判断depth>0,Infinity1仍为Infinity)。相比循环+栈的实现,reduce的递归方式更简洁,且在现代JS引擎中尾递归优化(部分引擎支持)可避免栈溢出。11.如何理解前端中的“虚拟DOM(VirtualDOM)”?React和Vue的虚拟DOM实现有何差异?虚拟DOM是用JS对象模拟真实DOM结构的轻量级描述(如{tag:'div',props:{id:'app'},children:[...]}),通过比较新旧虚拟DOM的差异(diff算法),仅更新需要变化的真实DOM节点,减少DOM操作次数(DOM操作比JS计算昂贵得多)。React与Vue虚拟DOM的差异:(1)diff策略:React采用“全量diff”,对同一层级的节点进行key比较(列表需唯一key),不同层级节点直接删除重建;Vue3采用“快速diff”算法,结合最长递增子序列(LIS)优化,减少移动操作(如列表顺序变化时,仅移动实际变化的节点)。(2)触发更新的粒度:React组件级更新(state变化触发整个组件重新渲染,通过shouldComponentUpdate或React.memo优化);Vue3细粒度更新(响应式系统追踪具体依赖的属性,仅重新渲染依赖该属性的组件)。(3)虚拟DOM创建方式:React通过JSX(Babel编译为createElement);Vue通过h函数(或模板编译为render函数,模板语法更接近HTML)。12.简述HTTP/3相比HTTP/2的核心改进,前端开发中需要注意哪些适配问题?HTTP/3基于QUIC协议(UDP之上的可靠传输),核心改进:(1)解决队头阻塞(Head-of-LineBlocking):HTTP/2在TCP连接上multiplexing(多路复用),但TCP层丢包会导致后续所有流阻塞;QUIC基于UDP,每个流独立编号,丢包仅影响当前流,其他流可继续传输。(2)更快的连接建立:QUIC使用TLS1.3加密,首次连接仅需1-RTT(往返时间),后续连接通过会话恢复(0-RTT);TCP+TLS1.3需2-3-RTT。(3)更好的移动网络支持:QUIC通过连接ID(而非IP+端口)标识连接,移动设备切换Wi-Fi/4G时(IP变化),可无缝恢复连接;TCP连接会因IP变化而断开。前端适配注意点:(1)服务器支持:需部署支持HTTP/3的服务器(如Nginx1.23+、Cloudflare),并配置QUIC监听端口(通常443)。(2)客户端兼容:现代浏览器(Chrome89+、Firefox90+)已支持,但旧浏览器(如Safari15-)可能仅支持HTTP/2,需通过Alt-Svc头(如Alt-Svc:h3=":443";ma=86400)告知客户端HTTP/3可用,客户端自动降级。(3)Cookie和缓存:QUIC连接的会话恢复依赖客户端缓存的会话票证,需确保Cookie策略(SameSite、Secure)不会意外阻止会话恢复。(4)性能测试:使用ChromeDevTools的“Network”面板查看协议版本(显示h3),验证是否启用HTTP/3;对比HTTP/3与HTTP/2的加载时间(尤其在弱网环境下)。13.如何实现一个线程安全的前端本地存储方案(支持高并发写入)?前端本地存储(localStorage/sessionStorage)是单线程同步的,多标签页或高并发写入时可能出现数据覆盖问题。实现线程安全需结合以下机制:(1)使用IndexedDB替代localStorage:IndexedDB是异步、事务性的存储,支持ACID特性,可通过事务(transaction)保证原子性。例如,写入时创建只读事务检查数据,再创建读写事务更新,避免脏读。(2)加锁机制:通过localStorage的storage事件实现跨标签页锁。例如,写入前尝试在localStorage中设置锁键(如lock:key=timestamp),监听storage事件确认其他标签页是否释放锁,超时(如500ms)则强制获取锁。(3)队列处理:在单页面内,将写入操作加入队列,使用setTimeout或微任务按顺序执行,避免同步写入阻塞主线程。示例代码(基于IndexedDB和队列):```javascriptclassThreadSafeStorage{constructor(dbName='safeStorage',storeName='data'){this.db=null;this.queue=[];this.isProcessing=false;//初始化IndexedDBconstrequest=indexedDB.open(dbName,1);request.onupgradeneeded=(e)=>{constdb=e.target.result;if(!db.objectStoreNames.contains(storeName)){db.createObjectStore(storeName,{keyPath:'id'});}};request.onsuccess=(e)=>{this.db=e.target.result;cessQueue();};}asyncsetItem(id,value){returnnewPromise((resolve)=>{this.queue.push({type:'set',id,value,resolve});cessQueue();});}asyncprocessQueue(){if(this.isProcessing||this.queue.length===0||!this.db)return;this.isProcessing=true;consttask=this.queue.shift();consttransaction=this.db.transaction(task.storeName||'data','readwrite');conststore=transaction.objectStore('data');try{if(task.type==='set'){awaitnewPromise((res,rej)=>{constrequest=store.put({id:task.id,value:task.value});request.onsuccess=res;request.onerror=rej;});task.resolve();}}finally{this.isProcessing=false;cessQueue();//处理下一个任务}}}```14.解释CSS中BFC(块格式化上下文)的概念,列举触发BFC的条件及常见应用场景。BFC(BlockFormattingContext)是Web页面中CSS盒模型的一种渲染区域,其中块级盒子(blockbox)按垂直方向排列,内部元素的布局不受外部影响,也不会与外部浮动元素重叠。触发BFC的条件(满足其一即可):(1)根元素(<html>);(2)float属性不为none(left/right);(3)position为absolute或fixed;(4)display为inline-block、table-cell、table-caption、flex、grid;(5)overflow不为visible(hidden/auto/scroll)。常见应用场景:(1)解决浮动元素导致的父容器高度塌陷:父容器触发BFC后,会包含内部的浮动元素(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 微创手术联合免疫治疗对胶质瘤炎症微环境的影响
- 微创手术影像监护护理配合要点
- 微创入路下颅底肿瘤手术出血控制技巧
- 2025年国际陆运全程代理协议
- 康复医学中的康复人才培养策略
- 应急物资需求预测模型构建与应用
- 年龄分层跨境心理干预策略
- 小修保养安全培训课件
- 干眼症合并老视的屈光手术策略
- 干燥症唾液腺标志物检测的患者教育策略
- 期货开户测试题及答案
- 幼儿心理与行为观察指导
- 心内科急危重症急救
- 2024年网络安全解决方案项目合同
- 阿米巴经营模式分析课件
- 北京市2022-2023学年四年级上学期语文期末试卷(含答案)
- 老年人肌肉健康小知识讲座
- 2024年度医院放疗科述职报告课件
- 胃脘痛的中医护理查房课件
- 美容院经营管理策略学习手册
- 辅导员工作谈心谈话分析-辅导员谈心谈话案例
评论
0/150
提交评论