第 1 卷
浏览器高频面试题(完整版)
1. 描述浏览器的基本功能以及它是如何加载并运行网页的
浏览器基本功能
- 资源请求:向服务器发起HTTP/HTTPS请求,获取HTML、CSS、JS、图片、字体等网页资源;
- 资源解析:解析HTML构建DOM树、解析CSS构建CSSOM树、解析执行JavaScript代码;
- 页面渲染:结合DOM树和CSSOM树生成渲染树,完成布局、绘制,最终展示可视化页面;
- 交互能力:处理用户鼠标、键盘、触摸等事件,执行JS交互逻辑,支持前进/后退、书签、缓存、
开发者工具等;
- 安全防护:实现同源策略、XSS/CSRF防护、HTTPS加密、资源沙箱隔离等安全机制;
- 附加能力:支持插件/扩展、本地存储(localStorage/sessionStorage)、Cookie管理、多标签页
隔离等。
浏览器加载运行网页核心流程
- 解析URL,确定请求协议、域名、端口、路径,发起DNS解析获取服务器IP;
- 与服务器建立TCP连接(HTTPS需额外TLS握手);
- 发送HTTP请求,服务器返回响应资源(HTML为主);
- 浏览器接收HTML,开始解析→渲染→执行流程;
- 解析HTML过程中发现外链资源(CSS/JS/图片),依次发起请求并加载;
- 资源加载完成后,完成页面渲染和JS执行,响应用户交互。
- 浏览器内核是什么?常见的浏览器内核有哪些?
浏览器内核定义
浏览器内核(Rendering Engine,渲染引擎)是浏览器的核心组件,负责解析HTML/CSS、执行JS、布局计算、页面绘制,决定了浏览器的渲染能力、兼容性和性能。
注:现代浏览器内核包含渲染引擎+JS引擎,比如Chrome的Blink(渲染)+V8(JS)。
常见浏览器内核分类
- WebKit:苹果Safari、旧版Chrome/Opera,开源内核,轻量高效,适配移动端/桌面端。
- 传统内核(逐步淘汰)
- Gecko:火狐Firefox专属内核,完全开源,兼容性强,渲染逻辑独立;
- Trident:IE浏览器专属内核,又称MSHTML,兼容性差、性能低,已被Edge放弃;
- Presto:旧版Opera内核,渲染速度极快,但维护成本高,后续替换为Blink。
- 国产自研内核(基于开源二次开发)
- 麒麟芯:适配国产系统,基于WebKit/Blink定制;
- 极速内核:国内主流浏览器均采用「Blink+兼容模式(Trident)」双内核。
3. 解释一个网页从请求开始到最终显示给用户的完整过程
核心流程(10步完整版)
- URL解析:浏览器解析用户输入的URL,判断是地址/搜索词,拼接完整请求地址;
- DNS域名解析:将域名(如www.baidu.com)转换为服务器IP地址,优先查本地DNS缓存→运营
商DNS→根DNS;
- TCP连接建立:基于IP地址与服务器建立TCP连接,执行三次握手(确保通信双向通畅);
- HTTPS TLS握手(可选):若为HTTPS协议,额外完成TLS加密握手,生成会话密钥,保证传输
安全;
- HTTP请求发送:浏览器向服务器发送请求报文(包含请求头、请求体、请求方法等);
- 服务器响应处理:服务器接收请求,处理业务逻辑,返回响应报文(包含状态码、响应头、资源内
容);
- TCP连接释放:请求完成后,执行四次挥手释放TCP连接(HTTP/1.1默认长连接,可复用);
- 资源解析:浏览器解析响应的HTML,同时加载外链CSS/JS/图片/字体等资源;
- 页面渲染:构建DOM树→CSSOM树→渲染树→布局(回流)→绘制(重绘)→合成显示;
- 交互就绪:JS执行完成,绑定事件监听,页面进入可交互状态,浏览器维护缓存/历史记录。
4. 描述浏览器解析并展示HTML、CSS和JavaScript的基本过程
第一步:解析HTML → 构建DOM树
- 浏览器从服务器获取HTML文本,按从上到下的顺序逐行解析;
- 遇到标签(如 <div> / <p>)创建DOM节点,遇到文本创建文本节点;
• 解析过程中遇到语法错误会自动容错,最终形成DOM树(文档对象模型),描述页面的结构和层级
• 解析中发现外链资源(CSS/JS/图片),立即发起并行请求加载(JS会阻塞后续解析,特殊标签除
外)。
第二步:解析CSS → 构建CSSOM树
- 浏览器解析CSS文件/内联样式/行内样式,处理样式规则(选择器、属性、值);
- 解析过程中处理样式继承、优先级、浏览器前缀,解决样式冲突;
• 最终形成CSSOM树(CSS对象模型),描述页面所有元素的样式规则,且CSSOM树只读(修改样
式会重新生成)。
第三步:执行JavaScript → 操作DOM/CSSOM
- JS引擎(如V8)解析执行JS代码,按执行上下文顺序执行;
• JS可直接修改DOM树(如增删节点)、修改CSSOM树(如修改样式),也可发起异步请求、绑定
事件、操作存储;
- 若JS修改了DOM/CSSOM,会触发后续的渲染树重建、回流/重绘。
第四步:渲染树构建 → 布局 → 绘制 → 显示
- 构建渲染树:结合DOM树和CSSOM树,过滤不可见节点(如 display:none、head标签),为
可见节点绑定样式,生成渲染树;
- 布局(Layout/回流):计算渲染树中所有节点的位置、大小、间距,确定每个元素在页面中的坐
标;
- 绘制(Paint/重绘):根据布局结果,将节点的颜色、背景、边框、文字、图片等像素绘制到画
布;
- 合成(Composite):将绘制的图层合并,通过GPU渲染到屏幕,最终展示可视化页面。
5. 解释CSS文件是如何被浏览器解析并应用到网页上的
CSS解析核心流程
- 资源加载:浏览器解析HTML时,遇到 <link rel="stylesheet"> 或 @import,发起
HTTP请求加载CSS文件,CSS加载不会阻塞HTML解析,但会阻塞页面渲染;
- 词法/语法解析:CSS引擎将CSS文本拆分为令牌(Token)(如选择器、属性名、属性值),校验
语法合法性,容错非法语法;
- 构建CSSOM树:
- 从根节点(html)开始,为每个DOM节点匹配对应的CSS样式规则;
全站分卷索引 · 10 卷
- 1第 1 卷
- 2第 2 卷
- ◦ 处理样式优先级(!important > 行内样式 > ID选择器 > 类/伪类/属性选择器 > 标签/伪元素选择
- 关键特性
- 6. 详述浏览器加载和执行JavaScript文件的机制
- JS加载执行核心机制(单线程+阻塞特性)
- • 浏览器解析HTML时,遇到 <script> 标签,立即暂停后续HTML解析,发起HTTP请求加载JS文
- • 可通过属性优化加载:
- ◦ async:异步加载,加载完成后立即执行(执行顺序不确定,不阻塞HTML解析,阻塞渲
- ◦ defer:异步加载,HTML解析完成后、DOMContentLoaded事件前执行(执行顺序与标签
- ◦ type="module":ES6模块加载,默认异步,遵循 defer 规则,支持按需加载、作用域隔
- • V8引擎采用即时编译(JIT):将AST转换为字节码,再将热点代码(频繁执行)编译为机器码,
- 关键特性
- • 异步JS(async/defer/module)仅解除对HTML解析的阻塞,仍会阻塞 DOMContentLoaded 事
- 3第 3 卷
- 4第 4 卷
- 5第 5 卷
- 6第 6 卷
- ✅ 2. 微任务的优先级和执行时机不同
- ✅ 3. 宏任务的类型和优先级不同
- ✅ 4. 页面渲染的差异
- • Node.js事件循环:无页面渲染环节,Node.js是服务端运行环境,无需渲染页面,专注于I/O处
- ✅ 5. 异步API的支持差异
- • 浏览器:支持DOM事件、AJAX、requestAnimationFrame、MutationObserver等前端专属异步
- • Node.js:支持文件I/O、网络I/O、child_process、setImmediate、process.nextTick等服务端专
- ✅ 6. 任务队列的数量差异
- ✅ 核心差异总结表
- 17. 描述process.nextTick在Nodejs事件循环中的执行顺序及其与微任务
- 的关系
- process.nextTick的定义
- 7第 7 卷
- 8第 8 卷
- 9第 9 卷
- 10第 10 卷
- • 不再使用的全局变量,手动置空释放:`window.data = null`(浏览器)、`delete global.data`
- • 避免闭包长期引用大对象,若必须引用,业务结束后手动清空闭包引用:`persistentClosure =
- • DOM元素移除前,通过`removeEventListener`移除对应的事件监听(注意:监听函数必须与绑
- • 组件生命周期销毁时(如React的`componentWillUnmount`、Vue的`beforeUnmount`),批
- • 定时器/计时器使用后,务必通过`clearTimeout`/`clearInterval`清理,尤其是在组件销毁、页
- • 将定时器ID存储在实例属性中,便于后续清理:`this.timer = setTimeout(...)`,销毁时执行
- • 避免在JS中长期缓存DOM元素,优先通过`document.querySelector`动态获取,减少不必要的
- • 异步任务(Promise/AJAX)确保完成:无论成功/失败,都调用`resolve/reject`;使用
- • 内存缓存设置上限和过期机制:使用`lru-cache`等成熟缓存库(自动淘汰最近最少使用的缓
- • 优先使用`WeakMap/WeakSet`作为缓存:它们的键是弱引用,当键对应的对象无其他引用时,会
- • 浏览器端:使用Chrome开发者工具(Memory面板),通过HeapSnapshot(堆快照)对比内存
- • Node.js端:使用`--inspect`参数启动服务,通过Chrome开发者工具调试;使用`clinic.js`、