# 浏览器面试题 by 爽爽学编程
# 重绘和回流 ( 重排) 是什么, 如何避免?
DOM的变化影响到了元素的⼏何属性 ( 宽高) ,浏览器重新计算元素的⼏何属性, 其他元素的⼏何属性和位置也会受到影响, 浏览器需要重新构造渲染树, 这个过程称为重排, 浏览器将受到影响的部分重新绘制到屏幕上的过程称为重绘 。
引起重排的原因有
- 添加或者删除可见的DOM元素,
- 元素位置 、尺⼨ 、内容改变,
- 浏览器页面初始化
- 浏览器窗⼝尺⼨改变, 重排⼀定重绘, 重绘不⼀定重排,
减少重绘和重排的方法:
- 不在布局信息改变时做 DOM 查询
- 使用 cssText 或者 className ⼀次性改变属性
- 使用 fragment
- 对于多次重排的元素, 如动画,使用绝对定位脱离文档流,让他的改变不影响到其他元素
# 页面渲染过程
- 解析html,构建DOM树
- 解析css,生成css树
- DOM树和css树结合,生成render tree(渲染树)
- 生成渲染树以后,就会根据渲染树来进行布局(也叫回流),得到各个节点的几何信息(位置、大小)
- 将渲染树的每个节点都转换为屏幕上的实际像素,这个阶段就叫做重绘节点
# 说说从输入URL到看到页面发生的全过程,越详细越好
首先浏览器主进程接管, 开了⼀个下载线程。
然后进⾏HTTP请求 ( DNS查询 、IP寻址等等), 中间会有三次捂手, 等待响应, 开始下载响应报文。
将下载完的内容转交给Renderer进程管理。
Renderer进程开始解析css rule tree和dom tree, 这两个过程是并⾏的,所以⼀般我会把link标签放在页面顶部。
解析绘制过程中, 当浏览器遇到link标签或者script、img等标签, 浏览器会去下载这些内容, 遇到时候缓存的使用缓存,不适用缓存的重新下载资源。
css rule tree和dom tree生成完了之后, 开始合成render tree, 这个时候浏览器会进⾏layout, 开始计算每⼀个节点的位置,然后进⾏绘制。
绘制结束后, 关闭TCP连接, 过程有四次挥手
# 谈谈你对重构的理解
网站重构:在不改变外部⾏为的前提下, 简化结构 、添加可读性, 而在网站前端保持⼀致的⾏为 。也就是说是在不改变UI的情况下, 对网站进⾏优化, 在扩展的同时保持⼀致的UI
对于传统的网站来说重构通常是:表格( table )布局改为 DIV+CSS
使网站前端兼容于现代浏览器(针对于不合规范的 CSS 、如对Im6有效的)
对于移动平台的优化
针对于 SEO 进⾏优化
# 浏览器内核
IE : trident 内核
Firefox : gecko 内核
Safari : webkit 内核
Opera :以前是 presto 内核, Opera 现已改用Google - Chrome 的 Blink 内核
Chrome:Blink (基于 webkit , Google与Opera Software共同开发)
# 同步任务和异步任务:
- 同步任务:
- 同步任务是按照程序顺序执行的任务。
- 当一个同步任务开始执行时,程序会等待该任务执行完成,然后再继续执行下一个任务。
- 在执行同步任务期间,程序会阻塞(即暂停)其他任务的执行,直到当前任务完成。
- 异步任务:
- 异步任务是在程序执行过程中,不会等待其完成,而是继续执行后续的代码。
- 异步任务通常会在后台或者另外的线程中执行。
- 异步任务的执行结果通常会通过回调函数、Promise对象或者async/await等方式来处理。
在前端开发中,常见的同步任务包括但不限于:
- DOM 操作:例如修改元素的内容、样式、属性等。
- 计算操作:例如数学计算、字符串处理等。
- 函数调用:同步执行的函数调用,例如调用一个普通的JavaScript函数。
- 循环:通常情况下,for 循环、while 循环等都是同步执行的。
- 条件语句:例如 if 语句、switch 语句等。
在前端开发中,常见的异步任务包括但不限于:
- Ajax 请求:通过 XMLHttpRequest 对象或者 Fetch API 发起网络请求,从服务器获取数据。
- 定时器:使用 setTimeout()、setInterval() 等方法设置定时器,在一定时间后执行指定的代码。
- 事件监听:通过addEventListener()方法添加事件监听器,等待事件触发后执行相应的回调函数。
- Promise:使用 Promise 对象处理异步操作,可以通过 then() 方法注册成功或失败的回调函数。
- 异步函数:使用 async/await 关键字来定义异步函数,使函数内部的异步操作以同步的写法表达,提高代码可读性。
- Web Workers:在后台线程中执行脚本,以便在主线程不受阻塞的情况下执行耗时操作。
- DOM 事件:例如在页面加载完成后执行的回调函数,或者监听用户输入、鼠标移动等事件。
- 文件读取:使用 File API 中的 FileReader 对象来读取本地文件内容。
# 从浏览器地址栏输入url到显示页面的步骤
- 浏览器根据请求的 URL 交给 DNS 域名解析,找到真实 IP , 向服务器发起请求;
- 服务器交给后台处理完成后返回数据, 浏览器接收⽂件 ( HTML、JS、CSS 、图象等);
- 浏览器对加载到的资源 ( HTML、JS、CSS 等) 进行语法解析, 建立相应的内部数据结构:如 HTML 的 DOM
- 载⼊解析到的资源⽂件, 渲染页面, 完成
# 介绍⼀下你对浏览器内核的理解?
- 主要分成两部分:渲染引擎( layout engineer 或 Rendering Engine )和 JS 引擎
- 渲染引擎:负责取得网页的内容 ( HTML 、 XML 、图像等等) 、整理讯息 (例如加⼊CSS 等), 以及计算网页的显示⽅式,然后会输出至显示器或打印机 。浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同 。所有网页浏览器 、电子邮件客户端以及其它需要编辑 、显示网络内容的应用程序都需要内核
- JS 引擎:解析和执⾏ javascript 来实现网页的动态效果最开始渲染引擎和 JS 引擎并没有区分的很明确,后来JS引擎越来越独立, 内核就倾向于只指渲染引擎
# cookies , sessionStorage 和 localStorage 的区别
cookie 是⽹站为了标示用户身份而储存在用户本地终端 ( Client Side)上的数据 ( 通常经过加密)
cookie数据始终在同源的http请求中携带 ( 即使不需要), 记会在浏览器和服务器间来回传递
sessionStorage 和 localStorage 不会自动把数据发给服务器,仅在本地保存
存储⼤小:
- cookie 数据⼤小不能超过4k
- sessionStorage 和 localStorage 虽然也有存储⼤小的限制,但比 cookie ⼤得多, 可以达到5M或更⼤
有期时间:
- localStorage 存储持久数据, 浏览器关闭后数据不丢失除⾮主动删除数据
- sessionStorage 数据在当前浏览器窗⼝关闭后自动删除
- cookie 设置的 cookie 过期时间之前⼀直有效, 即使窗⼝或浏览器关闭