通过浏览器渲染过程来进行前端优化

介绍

  做web开发,我个人觉得必须要弄清楚浏览器的渲染过程,否则我们很难进行前端优化。

  我今天就简单说一下页面加载和前端优化。

页面加载

我按照最简单的方式进行描述,实际上更复杂,不管是在浏览器端还是服务端,比如dns解析,代理服务器,负载均衡器等等。

1、用户访问网页,发送一个http请求到网络服务器。

2、网络服务器(应用服务器)解析请求,发送请求给数据库服务器。

3、数据服务器返回数据给网络服务器,网络服务器解析数据,并生成html文件内容放入http response中,返回给浏览器。

4、浏览器解析http response。

5、浏览器创建DOM树。

6、浏览器下载css,并应用在DOM树上,进行渲染。

7、浏览器下载js,并解析执行js。

缺陷

以上整个流程中,如果其中任何一个流程出现问题,都不能顺利的渲染页面。

服务端:

  网络服务器:无法获取到资源文件(404),或者由于并发的原因暂时无法处理你的请求(最常见的500错误),你的浏览器会长时间处于空白状态,直到服务器返回状态,或者进行超时处理。

  数据层:如果服务器停止,或忙于处理大数据等等,长时间无法返回数据给网络服务器,那么网络服务器一直处于等待状态中,如果请求量达到最大值,那么后面的请求都被堵塞,从而无法及时返回内容给浏览器。

客户端:

  JavaScript:如果你的js写在body中的div里,而且这个js执行非常复杂的逻辑,那么整个页面处于等待状态中。

  不论js代码是内联还是包含在一个不相干的外部文件中,页面下载和解析过程肯定会停下,等待脚本执行完成这些处理,然后才能继续进行。——大多数浏览器使用单进程处理JavaScript的多个任务,同一时间只能有一个任务执行。

  CSS:可以同时下载多个CSS文件。

      如果我们把CSS样式放在页面底部,虽然使页面内容能更快的加载(因为将加载css 文件的时间放在最后,从而使页面内容先显示出来),但这样的内容是没有样式的,在CSS文件加载进来后,浏览器再对DOM使用样式,会出现我们常说的“无样式之闪烁”。

      更讨厌的是,上下都放置CSS样式,浏览器会首先按照上面的进行渲染,等到下面的样式上来,再按照下面的样式进行回流和重绘,用户感觉很差。

注意两个词“repaint"和"reflow"。

  repaint(重绘)是在一个元素的外观被改变,但没有改变布局的情况下发生。——如果只是改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性,将只会引起浏览器repaint。

  reflow(回流):浏览器发现某个部分发生了点变化影响了布局,需要倒回去重新渲染,这个回退的过程就叫回流。

总结:以上两种严重影响用户体验,会无意识的流失用户。

解决方案

服务端:方式比较多,可以从架构上说(这个内容太多了,什么负载均衡了,什么缓存了,什么主从了),但是今天主要讨论语言层面。

    我们可以使用逐步返回内容的方式,输送数据给浏览器,如我们可以使用php的flush,把整个head部分,半个body加一部分div返回给浏览器,进行渲染,然后把其他部分逐步输送到浏览器。

    我们可以在服务端使用多线程或多进程的方式并发去进行数据处理。如php常见的

do {
  $mrc = curl_multi_exec($mh, $active);
}while($mrc==CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK){
  if (curl_multi_select($mh) != -1){
    do {
      $mrc = curl_multi_exec($mh,$active);
    }while($mrc==CURLM_CALL_MULTI_PERFORM);
  }
}

或者

<?php
while (count($sockets)) {
    $read = $write = $sockets;
    $n = stream_select($read,$write, $e, $timeout);
    if ($n > 0) {
        foreach ($read as $r) {
            $id = array_search($r, $sockets);
            $data = fread($r, 8192);
            if (strlen($data) == 0) {
                fclose($r);
                unset ($sockets[$id]);
            }else {
                $retdata[$id] .= $data;
            }
        }
        $retdata[$id] = preg_replace(‘/^HTTP(.*?)\r\n\r\n/is‘,<em>, $retdata[$id]);</em>
            foreach ($write as $w) {
                if (!is_resource($w))continue;
                $id = array_search($w, $sockets);
                fwrite($w, "GET /" . $url[$id] . "HTTP/1.0\r\nHost: " . $hosts[$id] ."\r\n\r\n");
                $status[$id] = 1;
            }
    }else {
        break;
    }
}

JavaScript:

  1、把脚本进行压缩(移除不必要的字符,注释以及空行)。

  2、对部分js文件进行合并,以减少http的请求个数,以减少服务器端的压力——但是要量力而行,因为如果你的js文件很大,下载很慢的话,很多功能都不能正常进行,我们可以按照业务进行合并。

  3、使用外部js文件。因为现在很多浏览器都有缓存,明显会减少http请求数。

  4、将脚本放在页面底部。先让用户看到内容,然后再加载js,这样用户会感觉页面加载速度很快。

CSS:

  1、合并多个css文件,以减少http的请求个数,以减少服务器端的压力。

  2、使用外部css文件。主要原因是浏览器缓存,以减少http请求。

  3、放在页面顶部(head标签处),防止出现“无样式内容的闪烁”。

总结

以上是我通过浏览器的加载过程,来进行的前端优化,大家有什么更好的方式,不妨告知一、二。

时间: 2024-10-10 22:38:10

通过浏览器渲染过程来进行前端优化的相关文章

从浏览器渲染过程看重绘回流

渲染过程 浏览器渲染过程如下: 解析 HTML,生成 DOM 树,解析 CSS,生成 CSSOM 树. 将 DOM 树和 CSSOM 树结合,生成渲染树(Render Tree). Layout(回流): 根据生成的渲染树,进行回流(Layout),得到节点的几何信息(位置,大小). Painting(重绘): 根据渲染树以及回流得到的几何信息,得到节点的绝对像素. Display: 将像素渲染到屏幕上. 阻塞问题: 构建 CSSOM 会阻塞浏览器渲染,但不会阻塞解析 HTML 构建 DOM树.

浏览器渲染过程

有时候想要进行性能优化时了解浏览器的渲染过程无疑是十分重要的.下面来看 首先介绍一下主流浏览器的渲染引擎: IE:Trident chrome:Blink Safire:webkit Firefox:Gecko Opera:Blink QQ浏览器/微信webview:X5/Blink 可能有很多会感到疑惑:chrome不是webkit么?其实Blink也算是webkit的一种升级吧,前缀还是不变的. 然后介绍一下渲染过程 1.DOM解析(与CSS解析同时进行): 把HTML文档解析成DOM树的过

读书笔记(二)—— 浅析浏览器渲染过程和html中的文件加载

在构建页面时,我们会在html中载入一个或多个css和js文件.或许大家都已经习惯了"最佳实践"中,css文件应该放在<head>标签中引入,而js文件则是放在</body>关闭标签前引入的原则,但其中的原因,很多人可能像我之前一样,不是了解得很清楚.在查阅了书籍和资料后,稍微了解的其中的原由. 让我们先看一看浏览器中的渲染流程: 主流程: 详细流程: 当浏览器获得一个html文件时,会"自上而下"加载,并在加载过程中进行解析渲染.     

浏览器工作原理(二):浏览器渲染过程概述

参考:https://segmentfault.com/a/1190000012925872#articleHeader4 浏览器器内核拿到内容后,渲染大概可以划分成以下几个步骤: 解析html建立dom树 解析css构建render树(将CSS代码解析成树形的数据结构,然后结合DOM合并成render树) 布局render树(Layout/reflow),负责各元素尺寸.位置的计算 绘制render树(paint),绘制页面像素信息 浏览器会将各层的信息发送给GPU,GPU会将各层合成(com

浏览器渲染原理解析

作者:贝程学院 浏览器内核分为两部分:渲染引擎(Layout Engine 或者 Rendering Engine)和 JS 引擎.早期渲染引擎和 JS 引擎并没有明显区分,随着 JS 引擎越来越独立,内核逐渐变成了渲染引擎的代名词.渲染引擎包括: HTML 解释器 CSS 解释器 布局 网络 存储 图形 音视频 图片解码器 等等 渲染引擎简介 浏览器——Firefox.Chrome和Safari是基于两种渲染引擎构建的,Firefox使用Geoko——Mozilla自主研发的渲染引擎,Safa

浏览器渲染机制

1. 什么是DOCTYPE及其作用 DTD(document type definition,文档类型定义)是一系列的语法规则,用来定义XML或(X)HTML的文件类型.浏览器会使用它来判断文档类型,决定使用何种协议来解析及切换浏览器模式 DOCTYPE是用来声明文档类型和DTD规范的,一个主要的用途便是文件的合法性验证.如果文件代码不合法,那么浏览器解析便会出现一些差错. HTML5 <!DOCTYPE html> HTML4.01 Strict 该DTD包含所有的HTML元素和属性,但不包

浅谈浏览器解析 URL+DNS 域名解析+TCP 三次握手与四次挥手+浏览器渲染页面

(1)浏览器解析 URL 为了能让我们的知识层面看起来更有深度,我们应该考虑下面两个问题了: 从浏览器输入 URL 到渲染成功的过程中,究竟发生了什么? 浏览器渲染过程中,发生了什么,是不是也有重绘与回流? OK,兴致来了,我们就先从 浏览器解析 URL 看起,先来看看当用户输入 URL,到浏览器呈现给用户页面,经历了以下过程: 版本 A: 用户输入 URL 地址. 对 URL 地址进行 DNS 域名解析. 建立 TCP 连接(三次握手). 浏览器发起 HTTP 请求报文. 服务器返回 HTTP

前端必备的浏览器知识(渲染过程、回流和重绘等)

常用哪几种浏览器测试?有哪些浏览器内核(Rendering Engine)? (Q1)浏览器:Chrome,IE,FireFox,Safari,Opera. (Q2)对应内核:Webkit,Trident,Gecko,Webkit,Presto.(国内的浏览器,除了傲游是直接基于Webkit开发的,其他基本都是基于谷歌在webkit上开发的Chromium,当然谷歌自己也是用的Chromium.另外值得的一提的是手机的系统(安卓.苹果)默认浏览器都是基于webkit内核的) 如何理解浏览器内核?

前端进阶——浏览器页面渲染过程

一 .构建 DOM 和 CSSOM 树 浏览器渲染页面前需要先构建 DOM 和 CSSOM 树. 浏览器解析过程大概经过:字节 → 字符 → 令牌 → 节点 → 对象模型. 浏览器处理html页面的方式如下图: 1.转换:浏览器从磁盘或网络读取HTML的原始字节,并根据文件指定的编码将它们转换成各个字符 2.令牌化:浏览器将字符串转换成W3C HTML5标准规定的各种令牌(节点) 3.词法分析:发出的令牌转换成定义其属性和规则的对象 4.DOM构建:根据标记之间的关系构建dom 整个流程的最终输