前端面试题复习
1. 浏览器解析
- 用户输入网址
- 对输入的URL进行语法解析,如果网址不合法会抛出错误
- 查看本地cache,网址被分段解析后,浏览器首先在本地缓存查询cache,如果cache被标明是最新的则直接使用缓存内容。
- dns解析,向dns服务或服务器查询域名所对应的IP地址
- 请求连接,tcp三次握手,连接服务器
- 发送http请求,向服务器发送请求
- 接收服务器响应,服务器发回一个HTML响应,浏览器开始显示HTML,浏览器发送获取嵌入在HTML中的对象
- 断开连接
- 写cache,将可以缓存的数据写入cache中
- 大概:用户输入网址——浏览器查找IP地址——发送HTTP请求——服务器处理请求并响应——服务器发回HTML响应——浏览器开始解析HTML——浏览器发送请求获取HTML中内嵌的对象,如CSS/JS/图片等资源——浏览器展示完整页面
浏览器解析html响应过程
- 加载-解析-渲染(加载过程进行解析渲染)
- 浏览器自上而下加载html代码,发现link引用外部css文件时,请求css文件,等待服务器响应(异步,不阻塞DOM加载和解析,但会阻塞页面渲染),服务器响应,浏览器解析,浏览器拿到css文件,可以开始渲染页面;发现img时,请求(异步),遇到js外部文件加载(同步),阻塞页面后续的内容的加载以及解析
- 解析页面标签生成DOM树,解析css资源生成CCSOM树,Javascript 脚本文件加载后, 通过 DOM API 和 CSSOM API 来操作 DOM Tree 和 CSS Rule Tree
- 浏览器引擎通过 DOM Tree 和 CSS Rule Tree 构建 Rendering Tree(渲染树),下一步layout,就是计算出每个节点在屏幕中的位置。 之后绘制rendering tree
- 总结一个版本:
- 浏览器开始解析HTML代码(自上向下),发现link引用外部css文件,请求css文件,服务器响应,浏览器解析;
- 浏览器继续载入html中<body>部分的代码,并且CSS文件已经拿到手了,可以开始渲染页面了
- 当发现img标签时,发出请求,此时浏览器不会等待图片加载,而是继续渲染后面的代码;
- 服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码;
- 发现script-js脚本,载入后立马执行(不管HTML有没有被渲染),执行后会阻塞页面后续的内容包括页面的渲染、其它资源的下载)。原因:因为浏览器需要一个稳定的DOM树结构,而JS中很有可能有
代码直接改变了DOM树结构,比如使用 document.write 或
appendChild,甚至是直接使用的location.href进行跳转,浏览器为了防止出现JS修
改DOM树,需要重新构建DOM树的情况,所以 就会阻塞其他的下载和呈现。所以,js 死循环执行不完的话,页面也就别想呈现了,所以,建议将所有的script标签放到页面底部;
- 假设js脚本中有
style.display=”none”
,执行后,浏览器需要重新渲染部分代码
- 直至解析至