一、设备与环境检测类场景
1. 用户设备类型精准识别
在响应式布局场景中,需通过navigator.userAgent解析设备类型,但需注意该方法存在兼容性问题。推荐使用现代API组合方案:
const deviceType = () => {const ua = navigator.userAgent;if (/Mobi|Android|iPhone/i.test(ua)) return 'mobile';if (/iPad/i.test(ua)) return 'tablet';return 'desktop';};
对于需要精确屏幕尺寸的场景,应结合window.screen.width与CSS媒体查询结果进行交叉验证。
2. 浏览器标签页活跃状态检测
通过Page Visibility API实现:
document.addEventListener('visibilitychange', () => {if (document.visibilityState === 'hidden') {console.log('标签页进入后台');// 暂停视频播放等操作} else {console.log('标签页恢复活跃');}});
该方案可降低后台标签页的CPU占用,特别适用于视频播放类应用。
二、性能优化专项突破
3. 长任务(Long Task)监控体系
使用PerformanceObserver监听长任务:
const observer = new PerformanceObserver((list) => {list.getEntries().forEach((entry) => {if (entry.duration > 50) {console.warn('检测到长任务:', entry);// 可上报至监控系统}});});observer.observe({ entryTypes: ['longtask'] });
建议结合Web Vitals指标建立综合性能评估体系,长任务阈值通常设置为50ms。
4. 大文件分片上传策略
关键考量因素包括:
- 网络状况:通过
navigator.connection.effectiveType检测网络类型 - 文件大小:超过100MB文件建议分片
-
并发控制:使用Promise.all控制同时上传的分片数
async function uploadInChunks(file, chunkSize = 5*1024*1024) {const chunks = Math.ceil(file.size / chunkSize);const uploadTasks = [];for (let i = 0; i < chunks; i++) {const start = i * chunkSize;const end = Math.min(file.size, start + chunkSize);const blob = file.slice(start, end);uploadTasks.push(fetch('/upload', {method: 'POST',body: blob,headers: { 'Content-Range': `bytes ${start}-${end-1}/${file.size}` }}));}await Promise.all(uploadTasks);}
5. 静态资源加载耗时统计
推荐使用Resource Timing API:
const resources = performance.getEntriesByType('resource');resources.forEach(resource => {console.log(`${resource.name} 加载耗时: ${resource.duration}ms`);});
对于CDN资源,建议结合initiatorType区分不同类型资源(script/style/image等)。
三、交互与状态管理
6. 防重复请求实现方案
双重防护机制:
let isRequesting = false;async function safeRequest(url) {if (isRequesting) return Promise.reject('请求进行中');isRequesting = true;try {const res = await fetch(url);return res.json();} finally {isRequesting = false;}}
对于表单提交场景,可结合debounce函数与请求状态锁实现更精细控制。
7. 鼠标拖拽交互实现
完整实现包含事件监听与边界处理:
function makeDraggable(element) {let pos = { x: 0, y: 0 };let offset = { x: 0, y: 0 };function mouseDownHandler(e) {offset = {x: element.offsetLeft - e.clientX,y: element.offsetTop - e.clientY};document.addEventListener('mousemove', mouseMoveHandler);document.addEventListener('mouseup', mouseUpHandler);}function mouseMoveHandler(e) {pos = {x: e.clientX + offset.x,y: e.clientY + offset.y};element.style.left = `${pos.x}px`;element.style.top = `${pos.y}px`;}function mouseUpHandler() {document.removeEventListener('mousemove', mouseMoveHandler);document.removeEventListener('mouseup', mouseUpHandler);}element.addEventListener('mousedown', mouseDownHandler);}
四、数据上报与监控
8. 埋点数据可靠上报
使用navigator.sendBeacon实现可靠上报:
window.addEventListener('beforeunload', () => {const data = JSON.stringify({ event: 'page_exit', ...analyticsData });navigator.sendBeacon('/analytics', data);});
该方案相比XMLHttpRequest的优势在于:
- 异步发送不阻塞页面卸载
- 适用于低功耗设备
- 自动处理请求重试
9. PV统计准确计数
需处理以下边界情况:
let isPageViewSent = false;function trackPageView() {if (isPageViewSent) return;// 使用RequestIdleCallback避免阻塞渲染requestIdleCallback(() => {fetch('/track', { method: 'POST', body: 'pv' });isPageViewSent = true;});}// 监听路由变化(单页应用场景)window.addEventListener('popstate', trackPageView);
五、高级调试技巧
10. 错误归因定位
使用git bisect进行二分查找:
# 示例命令流程git bisect startgit bisect bad HEAD # 当前版本有问题git bisect good v1.0.0 # 已知正常版本# 自动进入二分查找模式,每次测试后执行:git bisect good/bad
配合自动化测试脚本可大幅提升定位效率。
11. Git历史修改
精确删除指定commit:
# 交互式变基git rebase -i HEAD~10# 在编辑器中将目标commit前的pick改为drop# 保存退出后完成历史修改
注意:该操作会重写提交历史,团队开发时需谨慎使用。
刷题资源推荐
- 在线练习平台:某代码托管平台提供的算法题库(含前端专项分类)
- 模拟面试系统:支持场景题随机抽测与自动评分
- 开源项目:前端性能监控工具集(含20+实战案例)
- 官方文档:MDN Web Docs的性能优化专题
建议采用”333”刷题法:每天3个场景题、3种解法对比、3次代码重构,持续21天可显著提升问题解决能力。掌握这些核心场景题的解题思路,将帮助你在技术面试中建立系统化思维,准确识别问题本质并给出最优解。