一、浏览器渲染机制
- 浏览器的渲染机制 浏览器通过以下步骤将网页转换为可视化界面:
- 解析HTML:构建DOM树(Document Object Model)。
- 解析CSS:生成CSSOM树(CSS Object Model)。
- 布局(Layout):根据DOM和CSSOM计算元素的几何位置(如坐标、大小)。
- 绘制(Paint):将布局结果渲染到屏幕上。
- 合成(Composite):将多个图层合并为最终画面(如GPU加速)。
-
浏览器渲染页面的流程
-
输入URL:用户输入网址或点击链接。
-
DNS解析:将域名转换为IP地址。
-
建立TCP连接:通过三次握手与服务器建立连接。
-
发送HTTP请求:获取网页资源(HTML/CSS/JS等)。
-
处理响应:解析资源并构建DOM树、CSSOM树。
-
执行JavaScript:动态修改DOM和样式。
-
触发重绘与回流:更新布局后重新渲染页面。
-
重绘与回流的触发场景及优化
- 触发场景:
- 回流:DOM结构变化(如增删节点)、窗口大小调整、样式修改(如
width、height)。 - 重绘:样式变化(如
color、background),不影响布局。
- 回流:DOM结构变化(如增删节点)、窗口大小调整、样式修改(如
- 优化方法:
- 减少DOM操作,使用
DocumentFragment批量修改。 - 避免频繁读取布局属性(如
offsetWidth),改用requestAnimationFrame优化动画。 - 使用CSS动画代替JavaScript动画(利用GPU加速)。
- 减少DOM操作,使用
- 优化重绘与回流
- 批量修改样式:通过
class切换或CSS Variables集中控制。 - 避免强制同步布局:使用
getComputedStyle()提前计算样式。 - 利用
will-change属性:提前通知浏览器哪些元素可能变化。
二、缓存机制
- 浏览器的缓存机制
- 强缓存:直接使用本地缓存资源(无需服务器验证),通过
Cache-Control: max-age控制有效期。 - 协商缓存:资源过期后,客户端携带缓存标识(如
Last-Modified、ETag)向服务器验证是否可用。
- 如何控制浏览器缓存
- 设置HTTP头:
Cache-Control: no-cache, no-store, must-revalidate # 禁用缓存 Cache-Control: max-age=3600 # 缓存1小时 ETag: "unique-value" # 协商缓存标识 - 使用版本号或指纹(如文件名加哈希)强制更新资源。
三、跨域问题
-
跨域产生的原因 浏览器同源策略限制:仅允许访问同协议、同域名、同端口的资源。
-
解决跨域的常见方法
- CORS(跨域资源共享):服务器设置
Access-Control-Allow-Origin响应头。 - JSONP:通过
<script>标签绕过同源限制(仅支持GET请求)。 - 代理服务器:通过中间服务器转发请求(如Nginx)。
- WebSocket:协议本身支持跨域。
- 跨域解决方案的具体实现
- CORS实现:
// 服务器端设置(Node.js示例) res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST'); - JSONP实现:
<script src="https://api.example.com/data?callback=handleResponse"></script>
四、网络请求与页面加载
- 从输入网址到页面呈现的完整过程
- DNS解析:将域名转为IP地址。
- TCP握手:建立安全连接(HTTPS需TLS加密)。
- 发送HTTP请求:获取HTML、CSS、JS等资源。
- 解析资源:构建DOM树和CSSOM树。
- 执行JS:动态修改页面内容(如渲染SPA框架)。
- 触发渲染:完成布局、绘制和合成,页面显示。
五、数据格式
- XML与JSON的区别
特性 XML JSON 语法 标签嵌套,严格闭合 键值对形式,更简洁 体积 较大,冗余标签多 更轻量,适合作为数据传输格式 解析速度 较慢 快速(浏览器原生支持) 应用场景 配置文件、SOAP Web Service Web API、NoSQL数据库存储
六、浏览器原理
- 事件循环在浏览器与Node中的差异
- 浏览器:
- 单线程事件循环,分为宏任务(如
setTimeout)和微任务(如Promise.then)。 - 执行顺序:微任务优先于宏任务。
- 单线程事件循环,分为宏任务(如
- Node.js:
- 基于
libuv多线程事件循环,但对外暴露单线程接口。 - 使用
process.nextTick()插入到当前循环的末尾,优先级高于微任务。
- 基于
-
主流浏览器内核差异
内核 浏览器 特点 Trident IE/Edge(旧版) 兼容性较差,已逐步淘汰 Gecko Firefox 开源,注重隐私和性能 WebKit Safari 专注于Web标准,曾为Chrome基础 Blink Chrome/Opera/Edge(新版) 轻量、快速,Chromium项目分支 兼容性测试:
- 使用工具:
BrowserStack、CrossBrowserTesting。 - 通过特性检测(如
Modernizr)动态适配不同内核。
- Quirks模式与Standards模式
- Quirks模式:模拟老旧浏览器(如IE5)的怪异行为,解决历史遗留问题。
- Standards模式:严格遵循W3C标准,推荐默认使用。
- 触发方式:缺失
<!DOCTYPE>声明或使用过时文档类型。