您好,欢迎访问本站博客!登录后台查看权限
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧
  • 网站所有资源均来自网络,如有侵权请联系站长删除!

从输入Url到页面渲染

CF黑号 admin 2025-09-30 08:04 1 次浏览 0个评论
网站分享代码

ARP攻击主要是存在于局域网网络中,局域网中若有一个人感染ARP木马,则感染该ARP木马的系统将会试图通过“ARP欺骗”手段截获所在网络内其它计算机的通信信息,并因此造成网内其它计算机的通信故障。

服务器接受请求4. 服务器处理请求

主要流程:

图2

HTTPD

其会监听得到的请求,然后开启一个子进程去处理这个请求。

最常见的 HTTPD 有 Linux 上常用的 Apache 和 Nginx,以及 Windows 上的 IIS。

处理请求

接受 TCP 报文后,会对连接进行处理,对HTTP协议进行解析(请求方法、域名、路径等),并且进行一些验证:

重定向

假如服务器配置了 HTTP 重定向,就会返回一个 301永久重定向响应,浏览器就会根据响应,重新发送 HTTP 请求(重新执行上面的过程)。

URL 重写

查看 URL 重写规则,如果请求的文件是真实存在的,比如图片、html、css、js文件等,则会直接把这个文件返回。

否则服务器会按照规则把请求重写到 一个 REST 风格的 URL 上。

然后根据动态语言的脚本,来决定调用什么类型的动态文件解释器来处理这个请求。

5. 浏览器接受响应6. 渲染页面浏览器内核

图3

基本流程

图4

HTML 解析

从上往下一行一行地解析。

解析的过程可以分为四个步骤:

浏览器容错进制:从来没有在浏览器看过类似”语法无效”的错误,是因为浏览器去纠正错误的语法,然后继续工作。

事件:当整个解析的过程完成以后,浏览器会通过DOMContentLoaded事件来通知DOM解析完成。

CSS 解析

一旦浏览器下载了 CSS,CSS 解析器就会处理它遇到的任何 CSS,根据语法规范解析出所有的 CSS 并进行标记化,然后得到一个规则表。

CSS 匹配规则:在匹配一个节点对应的 CSS 规则时,是按照从右到左的顺序的,例如:div p { font-size :14px }会先寻找所有的p标签然后判断它的父元素是否为div。

注意:写 CSS 时,尽量用 id 和 class,千万不要过度层叠。

渲染树

DOM 树和 CSS 规则树合并的过程。

注意:渲染树会忽略那些不需要渲染的节点,比如设置了display:none的节点。

计算

通过计算让任何尺寸值都减少到三个可能之一:auto、百分比、px,比如把rem转化为px。

级联

浏览器需要一种方法来确定哪些样式才真正需要应用到对应元素,所以它使用一个叫做specificity的公式,这个公式会通过:

渲染阻塞当遇到一个script标签时,DOM 构建会被暂停,直至脚本完成执行,然后继续构建 DOM 树。

但如果 JS 依赖 CSS 样式,而它还没有被下载和构建时,浏览器就会延迟脚本执行,直至 CSS Rules 被构建。

故而:

布局与绘制

确定渲染树种所有节点的几何属性,比如:位置、大小等等,最后输入一个盒子模型,它能精准地捕获到每个元素在屏幕内的准确位置与大小。

然后遍历渲染树,调用渲染器的 paint() 方法在屏幕上显示其内容。

合并渲染层

把以上绘制的所有图片合并,最终输出一张图片。

回流与重绘

回流(reflow)

当浏览器发现某个部分发现变化影响了布局时,需要倒回去重新渲染,会从html标签开始递归往下,重新计算位置和大小。

reflow基本是无法避免的,因为当你滑动一下鼠标、resize 窗口,页面就会产生变化。

重绘(repaint)改变了某个元素的背景色、文字颜色等等不会影响周围元素的位置变化时,就会发生重绘。

每次重绘后,浏览器还需要合并渲染层并输出到屏幕上。

回流的成本要比重绘高很多,所以我们应该尽量避免产生回流。

JavaScript 编译执行

主要流程:

图5

主要分成三大部分:

词法分析

JS 脚本加载完毕后,会首先进入语法分析阶段,它首先会分析代码块的语法是否正确,不正确则抛出“语法错误”,停止执行。

主要有三个步骤:

预编译

JS 有三种运行环境:

每进入一个不同的运行环境都会创建一个对应的执行上下文,根据不同的上下文环境,形成一个函数调用栈,栈底永远是全局执行上下文,栈顶则永远是当前执行上下文。

创建执行上下文主要事件:

执行JS 线程:

图6

尽管JS 是单线程的,但实际上参与工作的线程一共有四个:其中三个只是协助,只有 JS 引擎线程是真正执行的。

注意:浏览器对同一域名的并发连接数是有限的,通常为 6 个。

宏任务分为:

微任务:

微任务是ES6和Node环境下的,主要 API 有:Promise,process.nextTick。

微任务的执行在宏任务的同步任务之后,在异步任务之前。

代码例子

console.log('1'); // 宏任务 同步
setTimeout(function() {
  console.log('2'); // 宏任务 异步
})
new Promise(function(resolve) {
  console.log('3'); // 宏任务 同步
  resolve();
}).then(function() {
  console.log('4') // 微任务
})
console.log('5') // 宏任务 同步
// 以上代码输出顺序为:1,3,5,4,2