当前位置: 首页 > news >正文

从输入URL到页面加载完中间发生了什么?

从输入URL到页面加载完中间发生了什么?

当浏览器地址栏的 URL 发生变化时,通常会经历以下步骤:

  1. 用户输入或导航操作:用户在地址栏中输入新的 URL 或者通过点击链接、前进/后退按钮等进行导航操作。

  2. URL 解析:浏览器会解析新的 URL,并将其拆分为不同的组成部分,包括协议(例如 http://)、域名、路径、查询参数等。

  3. DNS 解析:如果 URL 中包含了域名部分,浏览器会将该域名发送给 DNS 服务器进行解析,以获取对应的 IP 地址。

  4. 建立连接:浏览器使用解析得到的 IP 地址建立与目标服务器的 TCP 连接。这个过程经历了 TCP 的三次握手,确保双方能够正常通信。

  5. 发送 HTTP 请求:浏览器向服务器发送一个 HTTP 请求,请求中包含了要获取的资源的信息,如请求方法(GET、POST 等)、路径、请求头、请求体等。

  6. 服务器处理请求:服务器接收到请求后,根据请求中的信息执行相应的处理逻辑。这可能涉及到服务器端的代码执行、数据库查询等操作。

  7. 返回响应:服务器处理完请求后,生成一个包含要返回给浏览器的资源的 HTTP 响应。响应中包含了状态码、响应头、响应体等信息。

  8. 接收响应:浏览器接收到服务器返回的响应,包括状态码、响应头和响应体等内容。

  9. 渲染页面:浏览器根据接收到的响应内容,对页面进行渲染。这包括解析 HTML、CSS 和 JavaScript,构建 DOM 树、渲染页面布局和执行 JavaScript 代码等。

  10. 显示页面:最终,浏览器将渲染好的页面显示给用户,并开始处理用户的交互事件。

大概的流程就是输入了一个域名,先去检查本地的hosts文件,看看是否有域名映射关系,如果没有的话,通过DNS解析找到域名对应的服务器地址,通过TCP请求链接服务器,再通过WEB服务器返回资源,浏览器根据返回的资源构建DOM树,再把css形成一个样式表,这两个东西结合,百年成了render树,render树上,绘制节点位置坐标,页面上通过重绘和回流的过程,渲染出页面。

DOM 树

DOM 树是由 HTML 文档生成的树形结构,它表示页面的内容和结构。每个节点对应一个 HTML 元素、属性或文本。

  • 生成:浏览器解析 HTML 文件,逐步生成 DOM 树。
  • 结构:包括所有的 HTML 标记,例如 <html><body><div><p> 等等。
  • 操作:可以通过 JavaScript 操作 DOM 树来动态更新页面内容。
示例
<!DOCTYPE html>
<html><head><title>Sample Page</title></head><body><div id="container"><p>Hello World!</p></div></body>
</html>

对应的 DOM 树结构:

Render 树

Render 树是由 DOM 树和 CSSOM(CSS Object Model)树共同生成的,表示页面的可视化结构。每个节点都是一个将被渲染到屏幕上的可视化元素。

  • 生成:浏览器将 DOM 树与 CSSOM 树结合起来,构建一个仅包含可见元素的 Render 树。
  • 结构:仅包含那些会影响页面布局和外观的元素,不包括不可见的元素(例如 display: none)。
  • 操作:Render 树用于计算布局(layout)和绘制(paint)页面。
示例

延续前面的示例,假设以下 CSS:

#container { display: none; } 

那么,Render 树将不包含 #container 的内容,因为它被设置为 display: none

html

└── body

关键区别

  1. 组成部分

    • DOM 树:包含所有的 HTML 节点,包括不可见的节点。
    • Render 树:只包含那些对页面可视化有影响的节点。
  2. 目的

    • DOM 树:用于表示文档的内容和结构,并且可以被 JavaScript 操作。
    • Render 树:用于计算页面布局和进行绘制操作。
  3. 生成时机

    • DOM 树:在浏览器解析 HTML 时生成。
    • Render 树:在解析完 DOM 和 CSS 后生成,用于后续的布局计算和绘制。

 

相关文章:

  • C# 通过Win32API设置客户端系统时间
  • git Fork或者git clone克隆别人的项目到自己的仓库如何保持原仓库同步
  • flume配置----a1.sources.r1.positionFile=xxxx.json
  • mysql如何创建并执行事件?
  • Mysql union语句
  • Bagging与Boosting的应用与优势
  • 计算机网络期末复习
  • 【设计模式-12】代理模式的代码实现及使用场景
  • 【SpringBoot】94、SpringBoot中使用MyBatis-Plus实现数据权限管理
  • 上海交通大学、中科大 开源镜像站停止 Docker Hub 仓库镜像支持后的可用替代源
  • springboot宠物领养系统-计算机毕业设计源码07863
  • python2.7pip报错:UnicodeDecodeError: ‘ascii‘ codec can‘t decode
  • 运维监控系统
  • 大数据安全经典面试题及回答(上)
  • 2024 年最新 windows 操作系统部署安装 redis 数据库详细教程(更新中)
  • JavaScript-如何实现克隆(clone)函数
  • Angularjs之国际化
  • bootstrap创建登录注册页面
  • ES2017异步函数现已正式可用
  • ES6系列(二)变量的解构赋值
  • IP路由与转发
  • Javascript编码规范
  • JavaScript新鲜事·第5期
  • Logstash 参考指南(目录)
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • XForms - 更强大的Form
  • 大型网站性能监测、分析与优化常见问题QA
  • 模型微调
  • 新版博客前端前瞻
  • 怎样选择前端框架
  • 7行Python代码的人脸识别
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (四)鸿鹄云架构一服务注册中心
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • **PHP二维数组遍历时同时赋值
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET CF命令行调试器MDbg入门(一)
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .Net IOC框架入门之一 Unity
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • [ 蓝桥杯Web真题 ]-布局切换
  • [asp.net core]project.json(2)
  • [Bugku]密码???[writeup]
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [C/C++] C/C++中数字与字符串之间的转换
  • [C/C++]数据结构 深入挖掘环形链表问题
  • [Django 0-1] Core.Email 模块
  • [Django开源学习 1]django-vue-admin
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率
  • [hive] posexplode函数