zoukankan      html  css  js  c++  java
  • 浏览器加载解析HTML、JS、CSS的过程


    链接:https://www.zhihu.com/question/263866883/answer/276139578

    浏览器加载

    • 加载过程
      当浏览器获得一个html文件时,会”自上而下“加载,并在加载过程中进行解析渲染。
      加载过程中遇到外部css文件,浏览器另外发出一个请求,来获取css文件。
      遇到图片资源,浏览器也会另外发出一个请求,来获取图片资源。这是异步请求,并不会影响html文档进行加载。
      但是当文档加载过程中遇到js文件,html文档会挂起渲染(加载解析渲染同步)的线程,不仅要等待文档中js文件加载完毕,还要等待解析执行完毕,才可以恢复html文档的渲染线程。
    • 加载外联js和css的阻塞情况

    一个不太严谨但方便记忆的口诀:JS 全阻塞,CSS 半阻塞

    • JS 会阻塞后续 DOM 解析以及其它资源(如 CSS,JS 或图片资源)的加载。
    • CSS不阻塞DOM的加载和解析(它只阻塞DOM的渲染呈现。这里谈加载),不会阻塞其它资源(如图片)的加载,但是会阻塞 后续JS 文件的执行(原因之一是,js执行代码可能会依赖到css样式。css只阻塞执行而不阻塞js的加载)。
    • 鉴于上面的特性,当css后面存在js的时候,css会间接地阻塞js后面资源的加载(css阻塞js,js阻塞其他资源 )。
    • 现代浏览器会进行 prefetch 优化,浏览器在获得 html 文档之后会对页面上引用的资源进行提前下载

    外联js文件使用defer属性和asyn可以达到异步非阻塞加载的效果,由于现代浏览器都存在 prefetch,所以 defer, async 可能并没有太多的用途,可以作为了解扩展知识,仅仅将脚本文件放到 body 底部(但还是在</body>之前)就可以起到很不错的优化效果(遵循先解析再渲染再执行script这个顺序)。当把js放在最后的时候,其实浏览器将自动忽略</body>标签,从而自动在最后的最后补上</body>

    浏览器解析

    • 1、浏览器通过请求的 URL 进行域名解析,向服务器发起请求,接收文件(HTML、CSS、JS、Images等等)。
    • 2、HTML 文件加载后,开始构建 DOM Tree(DOM树)
    • 3、CSS 样式文件加载后,开始解析和构建 CSS Rule Tree
    • 4、Javascript 脚本文件加载后, 通过 DOM API 和 CSSOM API 来操作 DOM Tree 和 CSS Rule Tree

    浏览器渲染

    • 1、浏览器引擎通过 DOM Tree 和 CSS Rule Tree 构建 Rendering Tree(渲染树)
    • 2、布局阶段——在屏幕上绘制渲染树中的所有节点的几何属性,比如: 位置,宽高,大小等等,这个过程称为 Flow 或 Layout 。
    • 3、绘制元素——绘制所有节点的可视属性。
    • 4、合并渲染层——把以上绘制的所有图层(类似于PhotoShop中的“图层”)合并,最终输出一张图片

    其中的阶段3、4可称之为Paint

    Repaint和Reflow

    当用户在浏览网页时进行交互或通过 js 脚本改变页面结构时,以上的部分操作有可能重复运行,此过程称为 Repaint 或 Reflow。

    • Repaint

    当元素改变的时候,将不会影响元素在页面当中的位置(比如 background-color, border-color, visibility),浏览器仅仅会应用新的样式重绘此元素,此过程称为 Repaint。

    • Reflow

    当元素改变的时候,将会影响文档内容或结构,或元素位置,此过程称为 Reflow。( HTML 使用的是 flow based layout ,也就是流式布局,所以,如果某元件的几何尺寸发生了变化,需要重新布局,也就叫 Reflow。)

    Reflow 的成本比 Repaint 的成本高得多的多。我们应当尽量避免Reflow。

    如何优化浏览器渲染过程

    • 1、创建有效的 HTML 和 CSS ,不要忘记指定文档编码,比如<meta charset="utf-8">
    • 2、CSS 样式应该包含在 <head>中, Javascript 脚本出现在<body>末尾。
    • 3、减少 CSS 嵌套层级和选择适当的选择器,可参考 如何提升 CSS 选择器性能。
    • 4、不要通过 JS 逐条修改 DOM 的样式,提前定义好 CSS 的 Class 进行操作。
    • 5、尽量减少将 DOM 节点属性值放在循环当中,会导致大量读写此属性值。
    • 6、尽可能的为产生动画的 HTML 元素使用 fixed 或 absolute 的 position ,那么修改他们的 CSS 是不会 Reflow 的。
     
  • 相关阅读:
    printcap
    browser-ua
    PHP 开发 APP 接口 学习笔记与总结
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode70 爬楼梯
  • 原文地址:https://www.cnblogs.com/hengwu/p/9989736.html
Copyright © 2011-2022 走看看