前端性能优化_css加载会造成哪些阻塞现象?

时间: 2018-01-18阅读: 505标签: 性能
css的加载是不会阻塞DOM的解析,但是会阻塞DOM的渲染,会阻塞link后面js语句的执行。这是由于浏览器为了防止html页面的重复渲染而降低性能,所以浏览器只会在加载的时候去解析dom树,然后等在css加载完成之后才进行dom的渲染以及执行后面的js语句。这就是造成在css下载完成之前,页面刚开始会出现白屏现象的原因。


浏览器渲染流程:

  1. 浏览器开始解析目标HTML文件,执行流的顺序为自上而下。

  2. HTML解析器将HTML结构转换为基础的DOM(文档对象模型),构建DOM树完成后,触发DomContendLoaded事件。

  3. CSS解析器将CSS解析为CSSOM(层叠样式表对象模型),一棵仅含有样式信息的树。

  4. CSSOM和DOM开始合并构成渲染树,每个节点开始包含具体的样式信息。

  5. 计算渲染树中个各个节点的位置信息,即布局阶段。

  6. 将布局后的渲染树显示到界面上。


根据以上的流程,可以知道,当cssdom还没构建完成时,页面是不会渲染到浏览器界面的,这也是为什么当css下载过慢时,会出现白屏的现象,以下是模拟白屏的例子:

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>

</head>
<body>
    <h1>this is a test</h1>
    <link rel="stylesheet" type="text/css" href="test.css">
    <img src="1.jpg">
    <hr>
    <span>this is a test</span>
</body>
</html>

test.css:

img{
    width: 50%;
}

使用fidder延迟css的响应:

if(oSession.uriContains('test.css')){
    oSession["response-trickle-delay"] = "3000";
}


可以看到,在1.4s的时候,html文档和img已经下载完成,但是页面并没有渲染,而是等到css加载完成后再渲染出来,这也证实了css加载过程中会阻塞页面的渲染。所以在我们的前端日常开发中,应尽量减少css的响应时间。


前端性能的本质是什么?

性能一直以来是前端开发中非常重要的话题。随着前端能做的事情越来越多,浏览器能力被无限放大和利用:从 web 游戏到复杂单页面应用,从 NodeJS 服务到 web VR/AR 和数据可视化,前端工程师总是在突破极限

优化网站性能规则_前端性能优化策略【网络加载、页面渲染】

前端网站性能优化规则:网络加载类、页面渲染类。包括:减少 HTTP 资源请求次数、减小 HTTP 请求大小、避免页面中空的 href 和 src、合理设置 Etag 和 Last-Modified、使用可缓存的 AJAX、减少 DOM 元素数量和深度等

高性能Javascript总结

Js高性能总结:加载和运行、数据访问、DOM编程、算法和流程控制、响应接口、Ajax 异步JavaScript和XML、编程实践...

2018 前端性能检查表

性能十分重要。然而,我们真的知道性能瓶颈具体在哪儿吗?是执行复杂的 JavaScript,下载缓慢的 Web 字体,巨大的图片,还是卡顿的渲染?研究摇树(Tree Shaking),作用域提升(Scope Hoisting)

如何提高CSS性能?CSS优化、提高性能提升总汇

如何提高CSS性能,根据页面的加载性能和CSS代码性能,主要表现为: 加载性能 (主要是从减少文件体积,减少阻塞加载,提高并发方面入手),选择器性能,渲染性能,可维护性。

提高js加载速度,实现js无阻塞加载方式,高性能的加载执行JavaScript

为解决JS加载速度慢,采用js的延时加载,和动态加载。由于js的堵塞特性,当浏览器在加载javascript代码时,不能同时做其他任何事情,如果javascript执行时间越久,浏览器等待响应的时间就越久。