输入URL到页面展示发生了什么

2020-01-22  本文已影响0人  Lyan_2ab3

与浏览器进程如何配合

首先我们需要知道浏览器进程的作用和负责的功能;

后续其他的文章 会专门介绍进程之间的交互和功能

92d73c75308e50d5c06ad44612bcb45d.png

用户输入URL 到页面解析出来 经历哪些步骤:

DNS 解析 http缓存讲到了DNS解析
TCP 三次握手
发送请求
服务端处理请求返回HTTP报文
浏览器解析渲染页面
断开连接:TCP四次挥手

用户输入URL

URL请求过程

1、DNS解析:

2、TCP连接:

TCP 三次握手

3、发送HTTP请求:

一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求实体4个部分组成。

浏览器会构建请求头请求行,并且把和域名相关的cookie 等数据加在请求头上,向服务器发送构建请求;

method:

WechatIMG561.png

headers:本质来说,就是一些名值对。首部分以下几类:通用首部、请求首部、响应首部、实体首部、扩展首部(规范中没有的自定义首部)

4、服务器处理请求:

20180821111206724.png

客户端不是直接通过HTTP协议访问某网站应用服务器,而是先请求到Nginx,Nginx再请求应用服务器,然后将结果返回给客户端,这里Nginx的作用是反向代理服务器。同时也带来了一个好处,其中一台服务器万一挂了,只要还有其他服务器正常运行,就不会影响用户使用。

5、返回响应结果:

提到响应体,我们可能要提到浏览器是怎么知道URL 请求的类型是什么?

渲染进程准备

提交文档

判断文件类型,然后创建一个渲染进程,渲染进程准备好之后,网络进程和渲染进程之间建立一个共享数据的管道,渲染进程在另一端不断的读取数据,然后给到HTML 解析器

渲染阶段:

这个页面很重要,主要是渲染页面,熟悉了相关流程:
1、就可以知道如何解决优化页面卡顿问题,优化动画流程,优化样式。
2、我们编好的HTML JS CSS 又是如何转化成我们看到的页面的呢?
带着问题下面看下 渲染阶段都是怎么渲染页面的:

1、构建DOM 树

1、通过分词器将字节流转换成Token
2、Token 解析为DOM 节点,并将DOM 节点添加到DOM树中

如果遇到 script 解析器会暂停 DOM 解析 ,因为js 可能要修改当前的DOM 结构。 JS 文件下载的过程中会阻塞DOM 解析

async 和 defer 虽然都是异步的,
1、使用 async 标志的脚本文件一旦加载完成,会立即执行;
2、使用了 defer 标记的脚本文件,需要所有的元素解析完成之后,在 DOMContentLoaded 事件之前执行。

如果代码引用了外部css 文件,那么执行js 之前还需要等待外部 css 文件下载完成,并解析成CSSDOM 之后才能执行js。 所以js 阻塞DOM 生成,样式又会阻塞js 的执行。

125849ec56a3ea98d4b476c66c754f79.png

HTML 解析器并不是等整个文档加载完成之后在解析的,而是网络进程加载了多少数据,HTML 解析器便解析多少数据

2、样式计算

样式计算阶段的目的是为了计算出 DOM 节点中每个元素的具体样式,在计算过程中需要遵守 CSS 的继承和层叠两个规则。这个阶段最终输出的内容是每个 DOM 节点的样式,并被保存在 ComputedStyle 的结构内

css 如何影响 首次加载的白屏时间:

<html>
<head>
    <link href="theme.css" rel="stylesheet">
</head>
<body>
    <div>geekbang com</div>
    <script src='foo.js'></script>
    <div>geekbang com</div>
</body>
</html>
优化策略:

缩短白屏时间:
1、通过内联 JavaScript、内联 CSS 来移除这两种类型的文件下载,这样获取到 HTML 文件之后就可以直接开始渲染流程了
2、但并不是所有的场合都适合内联,那么还可以尽量减少文件大小,比如通过 webpack 等工具移除一些不必要的注释,并压缩 JavaScript 文件
3、可以将一些不需要在解析 HTML 阶段使用的 JavaScript 标记上 sync 或者 defer

3、布局阶段

我们有 DOM 树和 DOM 树中元素的样式,但这还不足以显示页面,因为我们还不知道 DOM 元素的几何位置信息

总结:在 HTML 页面内容被提交给渲染引擎之后,渲染引擎首先将 HTML 解析为浏览器可以理解的 DOM;然后根据 CSS 样式表,计算出 DOM 树所有节点的样式;接着又计算每个元素的几何坐标位置,并将这些信息保存在布局树中

4、分层
图层绘制
栅格化(raster)操作
5、 合成和显示

总结下渲染流程:
1、渲染进程将 HTML 内容转换为能够读懂的 DOM 树结构
2、渲染引擎将 CSS 样式表转化为浏览器可以理解的 styleSheets,计算出 DOM 节点的样式
3、创建布局树,并计算元素的布局信息。
4、对布局树进行分层,并生成分层树。
5、为每个图层生成绘制列表,并将其提交到合成线程。
6、合成线程将图层分成图块,并在光栅化线程池中将图块转换成位图。
7、合成线程发送绘制图块命令 DrawQuad 给浏览器进程
8、浏览器进程根据 DrawQuad 消息生成页面,并显示到显示器上。

上一篇 下一篇

猜你喜欢

热点阅读