跳到正文
前端知识库
浏览器

浏览器 高频追问 Q&A

A: 回流更重,因为涉及布局计算。(深入阅读:回流与重绘)

4 分钟

浏览器 高频追问 Q&A

1. Q: 回流和重绘哪个更重?

A: 回流更重,因为涉及布局计算。(深入阅读:回流与重绘

2. Q: 为什么要减少 DOM 深度?

A: 深层结构会增加样式计算和布局成本。(深入阅读:从渲染树到像素

3. Q: 预加载和预渲染区别?

A: 预加载下载资源,预渲染会提前渲染页面。(深入阅读:关键渲染路径与资源提示

4. Q: 从 URL 到渲染最常考哪几段?

A: DNS、TCP/TLS、HTTP、解析与渲染流水线。(深入阅读:输入 URL 后的完整过程

5. Q: 浏览器缓存如何命中?

A: 先强缓存,再协商缓存。(深入阅读:缓存策略

6. Q: 为什么不建议用 unload 做页面离开上报?

A: 移动端可能不触发,而且会影响 bfcache。优先在 visibilitychange/pagehide 中使用 navigator.sendBeacon();它只保证请求被浏览器接受入队,不保证服务端已收到。(深入阅读:页面关闭、PV 与可靠上报队列、上报与降级

7. Q: PerformanceObserver 能统计哪些性能问题?

A: 可观察长任务、资源、导航、绘制等条目,先检查 supportedEntryTypes。长任务通常指持续至少 50 毫秒的主线程任务;跨源资源的详细耗时还需要 Timing-Allow-Origin。(深入阅读:性能与请求采集PerformanceObserver 与监控 SDK

8. Q: 如何避免多个接口失败时弹出多个错误提示?

A: 在请求协调层统一聚合错误,按一次批次或业务操作生成一个提示;不要在每个 catch 中直接弹 Toast,并把主动取消与真正失败分开处理。(深入阅读:请求去重与错误聚合

9. Q: 虚拟列表和分帧渲染有什么区别?

A: 虚拟列表长期只保留可视区附近的少量 DOM,解决节点数量问题;分帧渲染只是把创建工作拆到多帧,最终仍会创建全部节点。长列表通常优先窗口化,再按需分帧。(深入阅读:大量 DOM 的分帧渲染

10. Q: Service Worker 缓存为什么会让线上出现旧版本?

A: Worker 和 Cache Storage 有独立生命周期;旧缓存未清理或新 Worker 尚未接管时,页面可能继续使用旧资源。缓存要版本化、在 activate 清理,并设计兼容窗口和回滚策略。(深入阅读:Service Worker 与跨页面通信

11. Q: BroadcastChannel 的通信边界是什么?

A: 它只在同源的窗口、标签页和 Worker 间广播,数据按结构化克隆传递,发送者不接收自己的消息;跨源通信需要其他受控机制。(深入阅读:iframe、窗口和 Worker 的可靠通信

12. Q: preloadprefetchpreconnect 怎么选?

A: preload 是当前页面确定需要的资源,prefetch 是未来可能需要的低优先级资源,preconnect 只提前建立连接。preloadas、CORS 模式必须与实际请求一致,否则可能重复下载。(深入阅读:关键渲染路径与资源提示

13. Q: 如何可靠统计 PV?

A: 首次文档加载只记一次;SPA 由路由切换产生稳定页面 ID 并去重,bfcache 恢复要区分 pageshow.persisted。上报应异步、限流并脱敏,不能阻塞页面关闭。(深入阅读:页面关闭、PV 与可靠上报队列、上报与降级

14. Q: User-Agent 能准确判断设备吗?

A: 不能保证。UA 可被伪装且信息逐渐减少;布局用媒体查询,功能分支用能力检测,视口宽度和输入能力应分别判断。(深入阅读:设备能力与响应式判断

15. Q: 几万个 DOM 节点如何避免一次性卡住页面?

A: 能分页或虚拟化就不要创建全部节点;确实需要全部创建时,用 DocumentFragment 减少逐节点挂载,并用 requestAnimationFrame 分批调度,让出输入和绘制时间。批次大小要按真实设备的 Performance 记录调整,不能把固定数量当成通用答案。(深入阅读:大量 DOM 的分帧渲染