前端性能优化 css和js的加载与执行

一个网站在浏览器端是如何进行渲染的?

html本身首先会被渲染成 DOM 树,实际上 html 是最先通过网址请求过来的,请求过来之后,html 本身会由一个字节流转化成一个字符流,浏览器端拿的就是字符流,然后通过词法分析之后,将相应的语法分析成相应的 token ,比如说 header token, 转化不同的 token tag ,然后通过 token 类型 append 到 dom 树。

遇到 link token tag,然后去请求 css ,请求过来之后再去对 css 进行解析,生成 CSSOM ,然后和 DOM 树进行结合形成 Render Tree 这样的渲染树。然后再进行布局和渲染。

遇到 script tag ,然后去请求 JS 相关的 web 资源,请求回来的 js 会交给浏览器的 v8 引擎进行解析,

HTML渲染过程的一些特点

1、顺序执行

因为他是使用词法分析的能力,从上到下依次分析整个html,tag 相应的情况,所以第一个特点是顺序执行。词法分析是对 html 这个文档解析的一个方式,对 tag 依次从上到下解析,这个从上到下决定了很多阻塞的情况。

2、并发加载

我们的html中可能会引入很多的 css,js 的 web 资源,这些 web 资源在浏览器端是并发加载的,这里需要优化的一点就是这个并发加载过程的并发度是受我们浏览器域名限制的。所以会设置 3 到 4 个 CDN 域名,防止单个域名的限制

3、是否阻塞

首先 css 的加载是否会阻塞 js 的加载,js 的加载是否阻塞 js 的执行, css 的加载是否会阻塞页面的渲染。

css 在 head 中通过 link 方式引入的话,他会阻塞页面的渲染。就是要等这个 css 加载完之后才会进行渲染。所以这个时候分析完之后是带样式的,所以推荐是放在 head 里面请求 css

css 通过 link 的方式,css会阻塞页面的渲染,css 会阻塞 js 的执行,因为 js 会影响样式,js 的执行会依赖一些 css 的属性,如果 css 没有加载完,可能会有问题。但 css 不阻塞外部脚本的加载,原因是 webkit 实际上有一个预先扫描器,他是可以预先扫描后面的词语的,所以他不会阻止加载的过程,但会阻止执行的过程。

直接引入的js会阻塞页面的渲染,因为 js 的执行会影响 dom 节点的修改,所以会阻塞后面的节点创建。这也是符合逻辑的。

4、依赖关系

html渲染过程中,是否有要遵循的依赖关系,如何保证依赖关系正确的情况下提高效率。比如有些情况 html 已经出来了,但是样式没有,然后突然闪了一下,样式出来了。这种情况就是没有遵循依赖关系,一般 css 放在 head tag 里面,页面就会等 css 加载好,生成 cssom ,再进行渲染,这个时候就不会出现 css 闪动的问题。有时候 js 会加 async,这个时候就是放弃的 js 的依赖关系,这时候需要关注js的依赖关系

页面渲染依赖于 css 的加载

js 的执行顺序的依赖关系

js 逻辑对于 dom 节点的依赖关系,有些 js 需要去获取 dom 节点

5、引入方式

比如是 link 引入,还是 import 引入,两者有什么区别。对于js,比如 tag,比如动态引入。

直接引入,会阻塞页面的渲染

defer,不会阻塞页面的渲染,在 defer 的时候,所有 dom 树都已经构建完成了。defer 是顺序执行

async,不会阻塞页面的渲染,跟 defer 不同的是,不保证执行顺序,哪个先从服务端回来,哪个先执行

异步动态引入js,需要的时候,动态引入新的js文件,spa 单页页面中非常广泛

根据这些特点,我们找到可以优化的点

1、css 样式表置顶

2、用 link 代替 import,指的是 css 里面的 import,这个 import 是写在最底层,这样引入 css 的时候是不好的

3、js 脚本置底,并发请求的时候不区分 css 和 js 的,js 写在顶部会影响 css 的加载,在渲染的时候,css 是由于 js的,所以跟页面渲染无关的 js 放于页面底部

4、合理使用 js 的异步加载能力,优化js的加载执行

实战

1、加载并发数是有上限的,js和css混合放置,会导致css的延迟,会导致页面闪动,所以js要置底

2、css放在header中,阻塞页面的渲染,css加载完,再加载dom,放置页面样式跳变,从而保证渲染一步到位

3、css不会阻塞后面js并发加载,但会阻塞js的执行。如果js放在header中,会阻塞html的渲染。

4、把js都放在header, 分别放 async,defer。

async 不阻塞页面渲染,不保证执行顺序,谁先回来谁执行,不保证dom书构造完成之后再执行。

defer 不阻塞页面渲染, 保证执行顺序,保证dom树构造完成之后再执行。

5、@import link 实操

@import 有两个重大缺陷,第一点它不支持并发执行。他要 import 之后,再去 import 第二个,他不支持并发。

第二点,他需要整个页面全部加载完之后,才去执行 import 里面的代码。

但是,,,可能这两个重大缺陷曾经存在过,但是现在这两个问题已经没有了,跟 link 的效果是一模一样的。他更适合用于 css 模块化。但是在不同 css 文件中 @import 的是不支持并发的,只有该 css 文件加载完之后才去加载 @import 里面的 css

原文地址:https://www.cnblogs.com/wzndkj/p/11993095.html

时间: 2024-12-15 19:05:58

前端性能优化 css和js的加载与执行的相关文章

JS的加载和执行

从JS的加载和执行谈性能优化 ---高性能JS读后感(第一章) 从脚本的"霸道"说起,随着浏览器的进步,js越来越听话了,所以,我们先说说以前的浏览器是怎么加载js的,以及js如何个霸道法. 1.阻塞的脚本 在以前,js很霸道. 问:当我们在网页中使用<script></script>时,到底发生了什么? 答:无论是内嵌的<script>标签代码还是用<script>引入文件,当浏览器解析到<script>元素时,浏览器就会去

JS 动态加载脚本 执行回调[transfer]

JS 动态加载脚本 执行回调 关于在javascript里面加载其它的js文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的js文件是否加载完成,如果没有加载完成我们就调用文件里面的函数是不会成功的.本文讲解怎么在js中加载其它js文件并在加载完成后执行回调函数. 我们可以动态的创建 <script> 元素,然后通过更改它的 src 属性来加载脚本,但是怎么知道这个脚本文件加载完成了呢,因为我们有些函数需要在脚本加载完成生效后才能开始执行. 经过对网络上资源的搜索,我发现

JS 动态加载脚本 执行回调

JS 动态加载脚本  执行回调 关于在javascript里面加载其它的js文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的js文件是否加载完成,如果没有加载完成我们就调用文件里面的函数是不会成功的.本文讲解怎么在js中加载其它js文件并在加载完成后执行回调函数. 我们可以动态的创建 <script> 元素,然后通过更改它的 src 属性来加载脚本,但是怎么知道这个脚本文件加载完成了呢,因为我们有些函数需要在脚本加载完成生效后才能开始执行. 经过对网络上资源的搜索,我发

前端设计中关于外部js文件加载的速度优化

在一般情况下,许多人都是将<script>写在了<head>标签中,而许多浏览器都是使用单一的线程来加载js文件的,从上往下,从左往右. 若是加载过程出错,那么网页就会阻塞,就像许多网站用Google的CDN库,而我们在墙内访问一样.页面不会出来,一直加载这个js文件,直到浏览器放弃加载为止! 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default

前端性能优化 CSS动画

最近拜读了一下html5rocks上几位大神写的一篇关于CSS3动画性能优化的文章,学到了很多,在这里记录一下,其中的知识都是来源于这俩篇文章,我只是截取了其中比较关注的内容出来,原文地址High Performance Animations及Accelerated Rendering in Chrome 原理 现代浏览器在使用CSS3动画时,以下四种情形绘制的效率较高,分别是: * 改变位置 * 改变大小 * 旋转 * 改变透明度 层?重绘?回流和重布局?图层重组? 首先要了解CSS的图层的概

抛砖引玉:大型网站性能优化之Javascript异步懒加载技术

懒加载技术是现在许多大型网站的都使用的提高网站性能的方式,它的核心思想是当用户想看页面某个区域时,再加载该区域的数据.这在一定程度上减轻了服务器端的压力,也加快了页面的呈现速度. 其实国内很多网站都用到了懒加载技术,比如国内两个大型电商网站的页面都运用到了这项技术: 天猫首页: 京东商品列表页: 最近在学习时,自己写了一个带懒加载功能的电影列表展示页,大家可以先看下页面效果: http://f81236211.w4w7.tumm.top/lazyload/ 然后自己在页面底部写了一个分页功能,页

html、css、js文件加载顺序及执行情况

今天看书,看到html,css,js加载执行情况,发现自己并不是真正的了解,网上搜了半小时依然未弄明白,就在这时我找到了让我恍然大悟的一段话,如下: HTML页面加载和解析流程 1. 用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件. 2. 浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部CSS文件. 3. 浏览器又发出CSS文件的请求,服务器返回这个CSS文件. 4. 浏览器继续载入html中&

【转】html、css、js文件加载顺序及执行情况

原链接:http://www.cnblogs.com/Walker-lyl/p/5262075.html 今天看书,看到html,css,js加载执行情况,发现自己并不是真正的了解,网上搜了半小时依然未弄明白,就在这时我找到了让我恍然大悟的一段话,如下: HTML页面加载和解析流程  1. 用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件.  2. 浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部

【性能优化】懒、懒加载、懒动画 --- 基于window滚动事件来实时更新DOM的视图状态,以表明是否在规定的可视区,并作有change回调

/* * * 扩展jq原型: 懒.懒加载.懒动画 * --- 基于window滚动事件来实时更新DOM的视图状态,以表明是否在规定的可视区,并作有change回调 * * $jq.viewChange( {top:100,bottom:100,change:function(status){}} ) --- status: 'in'/'out' * $jq.viewChange('off') * * $jq[n].viewChange.status = 'in'/'out' ----- 状态为'