知蛛网
  • 首页
  • 会员
  • 活动
  • 工作台

常见问题
活动
关于我们
联系我们
隐私协议
用户协议
会员协议
© 2026 知蛛网. 保留所有权利。
首页会员工作台我的
flynn@flynn
主页wiki简历作品集
目录
全部书籍
00-路线
  • 学习路线
  • 命名与写作规范
01-计算机基础
01-计算机网络
  • 互联网是如何工作的
  • HTTP协议
  • TCP/IP协议
  • 浏览器直接打开本地html文件,请求时的协议问题
02-浏览器原理
  • 浏览器是如何渲染页面的
  • 浏览器是如何渲染页面的
  • 面试之浏览器
03-操作系统
  • 进程与线程
  • 内存管理与虚拟内存
  • IO 模型与多路复用
  • 文件系统与页缓存
04-数据结构与算法
  • 数组与链表
  • 栈与队列
  • 哈希表
  • 树与堆
  • 基础数据结构
01-基础数据结构
02-高级算法
  • 排序算法
  • 二分查找
  • 递归与回溯
  • 动态规划
  • 双指针与滑动窗口
03-leetcode刷题
02-前端核心
01-web开发
  • Web 和 Web 标准
  • web 入门
  • web 开发
  • URL
  • 域名
  • Web服务器
  • 命令行
  • 工作流程和流程
  • 超链接
  • 浏览器指纹
02-html
  • HTML基础语法
  • HTML 概述
  • HTML 发展史
  • HTML调试
  • HTML标题与段落
  • 文本格式化
  • 强调与重要性
  • 块级元素和内联元素
  • 列表
  • 区块
  • 语义元素
  • 页面结构化和语义化
  • 超链接
  • 相对路径和绝对路径
  • 图片
  • 表格
  • 表单和按钮
  • 多媒体
  • 视频/音频
  • HTML 头部
  • HTML 字符集
  • HTML颜色
  • HTML 语言代码
  • HTML 国家/地区
  • Emoji (表情符号)
  • HTML 标签简写及全称 |
  • SVG
  • Canvas 2D
  • Canvas 3D
  • 框架 `<iframe>`
  • HTML 拖放
  • HTML5 Geolocation(地理定位)
  • Web 存储
  • HTML URL 编码
  • MathML
  • 远程图片资源在自己网站中无法展示问题
03-css
  • CSS简介
  • CSS 语法
  • CSS 创建
  • CSS 发展史
  • CSS 浏览器支持
  • CSS 选择器
  • CSS `!important` 规则
  • css颜色
  • CSS 文本格式
  • CSS 盒子模型
  • CSS 尺寸
  • CSS 内边距
  • CSS 外边距
  • CSS 边框
  • CSS 轮廓
  • CSS 背景(background)
  • CSS 溢出
  • CSS 文档流
  • CSS 显示和可见性
  • CSS 浮动
  • CSS 定位
  • CSS 对齐方式
  • CSS 网页布局
  • CSS 多列布局(CSS Multi-column Layout)
  • CSS 透明度
  • CSS 响应式设计(Responsive Design)
  • CSS 媒体查询
  • CSS 列表
  • CSS 表格
  • CSS 表单
  • CSS 链接
  • CSS 用户界面
  • CSS 计数器
  • CSS 过渡
  • CSS 动画
  • CSS 2D 转换
  • CSS 3D 转换
  • CSS 变量(CSS Custom Properties)
  • CSS 原生嵌套(CSS Nesting)
  • CSS 函数(CSS Functions)
04-javascript
  • 什么是 JavaScript?
  • 编程范式(Programming Paradigm)
  • 什么是范式?
  • ECMAScript 规范
  • 什么是语法糖
  • 开发环境搭建
  • 什么是堆和栈?
  • 什么是执行上下文
  • JavaScript 垃圾回收机制
  • 作业队列与事件循环
  • 深拷贝和浅拷贝
  • 语法与类型
  • 字面量
  • 控制流与错误处理
  • 循环与迭代
  • 函数
  • 表达式与运算符
  • 数字和字符串
  • 表达日期与时间
  • 正则表达式
  • 索引集合类
  • 带键的集合
  • 对象
  • 类
  • Promise
  • async/await
  • 迭代器和生成器
  • 国际化
  • 模块
  • 资源管理
  • 属性的可枚举性和所有权
  • 闭包
  • 继承与原型链
  • 元编程
  • 内存管理
  • 内置对象
  • arguments 对象
  • BOM 对象(浏览器对象模型)
  • DOM 对象(文档对象模型)
  • bind、apply、call的区别
  • new 操作符
  • typeof 和 instanceof 的区别
  • HTML5 Web Workers
05-typescript
  • TypeScript 类型系统基础
  • 类型体操
03-框架与跨端
01-react
  • 开发环境搭建
  • JSX
  • 组件
  • 生命周期
  • Hooks
  • 组件通信
  • 状态管理
  • React 19 新特性
  • useCallback 闭包陷阱
  • 常用的性能优化操作
  • Firbe 架构
  • React 18 新特性
  • useRef
  • 基于umijs 4.0 搭建官网
  • react+vite本地开发,如何手机联调
  • React 实现谷歌登录
  • React 项目调起 WhatsApp
02-vue
  • vue 解决跨域请求
  • 在vue2使用TinyMCE富文本编辑器
  • 使用jszip 导出新闻
  • Vue 本地开发启用 https
  • 基于vue3+vite+ts+elementplus+pinia+axios搭建后台管理系统
03-react-native
  • iOS 开发环境(RN 0.72)
  • RN 原生模块(Native Module)
  • 查看Maven包的Java包名
  • 优化 APP 启动速度
  • 安全键盘
  • 启动图与 Icon 尺寸规范
  • RN如何生成/配置iOS的开发者证书和生产证书
  • 邓白氏编码
  • 微信开放平台配置Universal Link
  • 上架至Apple App Store
04-android
  • 开发环境搭建
  • Android项目目录结构
  • 认识Gradle
04-工程化
01-git
  • 如何解决已被git跟踪文件不在跟踪
  • git标签
  • Git报错: Failed to connect to github.com port 443 解决方案
  • Git 分支操作速查
02-构建工具
  • 构建工具原理与选型
02-webpack
  • webpack 核心概念与构建流程
  • webpack 性能优化
03-vite
  • vite 为什么快
  • vite 插件与生产构建
03-测试
  • 前端测试体系
04-部署
  • Nginx 反向代理解决跨域
  • SPA 刷新非首页报 404
05-docker
  • Docker 常用命令
  • docker-compose nginx配置ssl证书
  • Docker Desktop 升级后 docker-compose 命令找不到
06-性能优化
  • 前端性能优化体系
  • 背景 GIF 优化方案
07-微前端
  • 微前端实战(qiankun)
  • 微前端 · qiankun
01-qiankun
05-后端与数据
01-nodejs
  • Node 版本与依赖的 engines 冲突
  • Express 实现 Gmail 发信(邮箱验证码)
02-php
  • 浏览器保存新闻,发布到自有网站
  • [分布式] 浏览器保存新闻,发布到自有网站
  • 邮件发送,多账号轮询
  • nginx和php-fpm通信问题导致网站页面空白
03-python
  • macOS M1 芯片 如何安装 py 和 tkinter
  • tkinter 编写的程序如何打包成桌面软件
04-架构设计
  • 后台管理系统中角色管理、管理员管理、权限设置他们三者之间的关系
05-运维
  • redis启动失败
  • 实现自动备份宝塔项目及数据库到本地
  • 宝塔面板
01-宝塔
06-实战项目
  • 实战准备工作
02-项目记录
  • AI-Chat 模块技术文档
  • CRMChat 部署
07-面试专项
01-面试
  • 面试之自我介绍
  • CSS 面试
  • JS面试
  • React面试
  • Vue面试
  • RN 面试 · 题目清单
  • RN 面试 · 答案详解
  • RN 物流公司 · 题目清单
  • RN 物流公司 · 答案详解
  • Uniapp 面试
  • 带团队经验
12-react专项
  • 一个表格,某一行的某一列数据变动了,如何优化性能?
13-reactnative专项
  • RN 开发过程中,有遇到什么棘手的问题?你是如何解决的?
14-过往面试总结
  • 冷哥传媒 · 面试题
  • 沐腾科技 · 面试题
  • 字符频率排序
02-面试八股
  • 网络八股
  • 浏览器八股
  • 工程化八股
03-算法面试题
  • 前端高频手写题
  • 场景设计题
04-真实面试经历
  • 20251027 盾蓝科技 面试
  • 20251028 芝麻甜心 面试
08-工具
01-n8n
  • 初始n8n
  • 快速入门
  • 在宝塔中搭建n8n环境
  • n8n中常用节点
  • n8n和代码的区别
02-Trae
  • Figma MCP 配置指南
03-UI_UX_pro_max
  • UI_UX_pro_max的使用
04-开发环境
  • VMWare虚拟机安装
  • PowerShell 执行策略与编码设置
98-杂项
  • A股股票交易相关费用
99-手册
  • iOS 开发者账号申请流程及费用
  • 邓白氏编码申请及费用
  • App 推送通道申请及费用
  • App 开发收费项目清单
  • 注册AWS账号
  • 使用Amazon Polly实现文本转语音
  • Google 翻译 Key 申请与前端调用
  • 使用SmsForwarder转发短信

浏览器八股

02-面试八股2026/11/14

浏览器题考的不是名词量,而是能否把机制、触发条件、优化手段和度量对成一条线。这份清单按这条线整理高频考点。

面试怎么答

浏览器题用四段式回答,比背定义稳:

段落回答内容作用
机制内部怎么运作,涉及哪些进程/线程/阶段证明理解
触发什么操作会进入这个机制证明能定位
手段优化或规避的具体做法证明能落地
度量用什么指标验证有效证明闭环

最容易被追问的是"你怎么知道是这一步慢的",所以每个机制都要能顺带说出一个 DevTools 面板或 API。

一、多进程架构

一句话:Chromium 用进程隔离把"页面崩溃"和"页面越权"都关在单个站点内。

进程职责
浏览器主进程地址栏、标签页管理、前进后退、文件对话框、部分网络调度
渲染进程每个标签页一个,Blink 排版渲染 + V8 执行 JS
GPU 进程光栅化与合成,所有页面共用
网络进程走 NetworkService,处理请求、缓存、代理
插件 / Utility 进程PDF、编解码、不受信任务

渲染进程为什么要隔离

  • 稳定:一个页面 OOM 或崩溃,其他标签页和浏览器外壳不受影响。
  • 安全:同源策略只是逻辑隔离,进程隔离是物理隔离。Spectre 这类侧信道能读同进程内存,所以 Chrome 推行站点隔离(Site Isolation),跨站 iframe 也单独开进程,并用 CORB/ORB 限制跨站数据进入渲染进程。

渲染进程内的线程:主线程(DOM、CSS、JS)、合成线程(滚动与动画)、光栅线程、Worker 线程池。理解这条分层才能解释"为什么 transform 动画不卡"。

二、渲染流水线

一句话:HTML 变 DOM、CSS 变 CSSOM,合成渲染树后依次算样式、布局、绘制、合成。

HTML → DOM ┐
           ├→ Render Tree → Style → Layout → Paint → Raster → Composite
CSS  → CSSOM┘

阶段产物主线程
Style每个节点的计算样式是
Layout(回流)每个盒子的几何位置与尺寸是
Paint分层后的绘制指令列表是
Raster图层位图光栅线程
Composite按图层树合成一帧合成线程

哪一步触发回流:改动影响几何的属性,如 width/height/padding/margin/border/font-size/display/position/top/left,或读写会强制同步布局的 API(offsetTop、getBoundingClientRect)。

上一篇网络八股
下一篇工程化八股
本页目录
面试怎么答一、多进程架构二、渲染流水线三、重排、重绘与合成优化四、事件循环五、存储方案六、垃圾回收与内存泄漏七、首屏指标 LCP / INP / CLS关联阅读

哪一步只触发重绘:改动只影响外观,如 color/background/visibility/box-shadow/outline。

哪些连重绘都不需要:transform、opacity、filter 由合成线程处理,改的是图层变换矩阵或透明度,主线程完全不参与。

三、重排、重绘与合成优化

一句话:优化的本质是减少主线程参与,把变化交给合成线程。

  • transform/opacity 能走合成,是因为它们只改变图层的变换和混合参数,已有位图可以直接复用;改 left/top 则要重新布局、重新绘制整层。
  • 代价:提升为独立图层会占用显存,层数过多导致"图层爆炸",合成与内存开销反而更大。
  • will-change 是提前告知浏览器"这个属性要变",让它预先分层;滥用等于常驻图层,只在动画开始前加、结束后移除。
  • 其他手段:批量读写 DOM 避免布局抖动,用 DocumentFragment 或 innerHTML 一次插入,动画用 requestAnimationFrame,列表虚拟化,离屏元素 content-visibility: auto。

追问:transform 一定不回流吗——改变的是布局无关属性才对;同时改 width 依然回流。

四、事件循环

一句话:每轮取一个宏任务执行完,清空所有微任务,需要时渲染一帧,再进入下一轮。

宏任务 → 清空微任务 → [rAF → Style/Layout/Paint] → 空闲回调 → 下一个宏任务

类型成员
宏任务整段 script、setTimeout、setInterval、MessageChannel、I/O、UI 事件回调
微任务Promise.then/catch/finally、queueMicrotask、MutationObserver、await 后续代码
渲染前requestAnimationFrame
渲染后空闲requestIdleCallback

Promise.then 为什么比 setTimeout(0) 先执行

then 的回调进微任务队列,当前宏任务结束后立刻被清空;setTimeout 的回调是下一个宏任务,还要排队,嵌套调用还有 4ms 最小延迟钳制。

浏览器与 Node 的差异

  • 浏览器只有"宏任务/微任务"两层,渲染穿插在轮次之间。
  • Node 的宏任务分六个阶段:timers → pending callbacks → idle/prepare → poll → check(setImmediate)→ close。每个阶段结束清空 process.nextTick 队列,再清空微任务队列;nextTick 优先于 Promise。
  • Node 11 之后每个宏任务回调后都会清微任务,和浏览器行为基本对齐;setTimeout(0) 与 setImmediate 在 I/O 回调内的顺序仍不固定。

requestAnimationFrame 在哪:在样式计算与布局之前、下一帧绘制之前执行,回调参数是帧时间戳;同一帧多次调用只执行一次,后台标签页暂停。适合动画,不适合做数据计算。

五、存储方案

一句话:按"容量、生命周期、是否随请求发送、是否同步"四个维度选型。

方案容量生命周期随请求发送API
Cookie约 4KB/条,单域名约 50 条可设 Expires/Max-Age,否则会话级是,同源请求自动带同步
localStorage5–10MB永久,除非手动清除否同步
sessionStorage约 5MB标签页会话,关闭即清否同步
IndexedDB配额制,通常数百 MB 起永久否异步、事务
  • Cookie 还要关注 HttpOnly(JS 读不到)、Secure(仅 https)、SameSite(CSRF 防护)。
  • sessionStorage 在"复制标签页"时会复制一份,新标签页打开同 URL 则是空的。
  • IndexedDB 能存结构化克隆对象与 Blob,适合离线缓存、大列表草稿。

跨标签页通信

  • storage 事件:同源的其他标签页触发,当前页自己不触发;event.key/newValue 可用,但删改频繁时建议只当信号再读一次 localStorage。
  • BroadcastChannel:同源任意标签页广播,API 简单,推荐首选。
  • SharedWorker、Service Worker 做消息中转。
  • window.postMessage:跨源 iframe 或 window.open 场景,必须校验 origin。

六、垃圾回收与内存泄漏

一句话:V8 分代回收,新生代复制、老生代标记清除并整理;泄漏的本质是"还有引用可达但业务上已经不用"。

  • 新生代 Scavenge:From/To 两个半区,存活对象复制到 To 区,两次存活后晋升老生代。
  • 老生代 Mark-Sweep 标记清除,碎片多时 Mark-Compact 整理;配合增量标记与并发标记减少停顿。
  • 引用计数无法处理循环引用,现代引擎不用它做主策略。

常见泄漏场景

场景原因
未解绑事件监听全局对象或 DOM 一直持有回调
定时器未清理setInterval 持有闭包作用域
全局变量缓存只增不减的 Map/数组
Detached DOMJS 变量还引用已移除的节点
闭包持有大对象回调长期存活
console.logDevTools 打开时保留引用

排查:Performance Monitor 看内存曲线是否锯齿上行,Heap Snapshot 采三次对比"只增不减"的对象,Allocation Timeline 定位分配来源。

七、首屏指标 LCP / INP / CLS

一句话:三项 Core Web Vitals 分别衡量"看到主要内容快不快、点了之后响应快不快、页面稳不稳"。

指标含义良好阈值优化方向
LCP视口内最大内容元素的渲染时间≤ 2.5s图片压缩与 fetchpriority、预连接、字体、SSR、CDN、减少阻塞资源
INP交互到下一次绘制的延迟≤ 200ms拆分长任务、scheduler.yield、事件处理轻量、减少 DOM 规模
CLS累积布局偏移≤ 0.1图片/视频写宽高或 aspect-ratio、字体 size-adjust、不在顶部动态插入
  • LCP 的子部分是 TTFB、资源加载延迟、资源加载时长、元素渲染延迟,先定位是哪一段。
  • INP 只统计有交互的页面,替代了 FID;FID 只测首次输入延迟,不反映后续绘制。
  • CLS 只统计"非预期"偏移,用户主动交互引起的偏移不计入。

关联阅读

  • 浏览器是如何渲染页面的
  • 作业队列与事件循环
  • JS 面试