一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情。
关于这道经典的面试题,笔者准备写三篇文章来对知识点进行深度和广度的挖掘:
在 第一篇文章 中写到,用户在输入 url 并回车之后,浏览器经历了下面这些阶段:重定向 → 拉取缓存 → DNS 查询 → 建立 TCP 连接 → 发起请求 → 接收响应 → 处理 html 元素 → 页面进行渲染。因此性能优化也可以从这几个阶段入手:
减少请求数量:
减小请求资源大小:
提升网络传输速率:
资源加载位置:
资源加载时机:
资源渲染过程:
我们常将网络性能优化措施归结为三大方面:减少请求数量、减小请求资源大小、提升网络传输速率。
减少请求数量:
原理:当页面发生了重定向,就会重新发送 url 请求,延迟整个 HTML 文档的传输。 如果一定要使用重定向,就使用 永久重定向。
实例:
原理:使用 或 这类强缓存时,在缓存不过期的情况下,可以直接使用缓存的文件,而不向服务器请求资源。若强缓存失效,还可以使用 或 这类协商缓存,向服务器发送请求,在资源不发生变化的情况下,可以直接从本地缓存加载资源;若资源发生变化,则服务器会将更新后的资源发送给浏览器。
使用:在 文件的 头部中加上 标签。
标签中①设置属性 ,赋值为 ;②设置属性 ,赋值为 要解析的域名 (写域名和端口号就可以了)。
实例:
原理:将多个文件合并,这样在请求时就只发送一个 HTTP 请求来请求资源。
但这样也有它的坏处:①首屏渲染变慢;②缓存失效问题。
因此对于文件合并,有两点改进:①公共库合并;②不同页面单独合并。
原理:将网站上用到的一些图片整合到一张单独的图片中,从而减少请求图片的次数。
使用:
通过上面配置就能将目录下的所有 文件合成雪碧图,并且输出到对应目录,同时还可以生成对应的样式文件,样式文件的语法会根据你配置的样式文件的后缀动态生成。
如果不使用 webpack 插件的话,也可以使用在线生成雪碧图的网站:www.toptal.com/developers/
原理:a 标签设置空的 href ,会重定向到当前的页面地址;form 设置空的 method ,会提交表单到当前的页面地址。
原理:使用 css @import 会导致 css 无法并行下载,因为使用 @import 引用的文件只有在引用它的那个文件被下载、解析之后,浏览器才会知道还有另外一个 css 需要下载,这时才去下载这个 css 文件,然后在下载后开始解析、构建 layout tree 等一系列操作。因此 css @import 引起的 css 解析延迟会加长页面留白期。
减小请求资源的大小:
在 webpack 的 production 模式中,会自动压缩 js 代码。
作用:?可以去除未引用代码,减少代码体积。
使用: 在 中,添加字段:sideEffects: false,告诉 Webpack 所有代码都没有副作用(都可以进行tree shaking),然后再根据不同的环境进行不同的配置。
:
开发环境下的配置:
生产环境下的配置:
在生产环境下, 默认会添加 的配置,因此只需写一行 mode: 'production' 即可。
注意:
如果想要对一段代码做 处理,那么就要避免引入整个库到一个 JS 对象上,如果你这么做了,Webpack 就会认为你是需要这整个库的,这样就不会做 Tree Shaking 处理。
Tree Shaking 只支持 ESM 的引入方式,不支持 Common JS 的引入方式。
ESM: export + import
Common JS: module.exports + require
流程:①浏览器发起请求时,在请求头中设置属性 表明浏览器支持 gzip 。②服务器根据请求头信息判断浏览器是否支持 gzip ,支持的话就向浏览器传送压缩过的内容,并在响应头上带上 ;不支持的话则直接向浏览器发送未经过压缩的内容。③浏览器接收到服务器响应后根据响应头判断内容是否被压缩,如果被压缩则解压缩后再显示内容。
详细原理可参考 gzip压缩算法。
不要在 HTML 里缩放图像 不要使用 的 width、height 缩放图片,如果用到小图片,就使用相应大小的图片。如果需要 ,那么图片本身(mycat.jpg)应该是 100x100px 的,而不是去缩小 500x500px 的图片。
使用字体图标(iconfont)代替图片图标 字体图标就是将图标制作成一个字体,使用时就跟字体一样,可以设置属性如 、 等。并且字体图标是矢量图,不会失真,而且生成的文件特别小。
Base64 将图片的内容以Base64格式内嵌到HTML中,可以减少HTTP请求数量。但是,由于Base64编码用8位字符表示信息中的6个位,所以编码后大小大约比原始值扩大了 33% 。
使用 Webp webp 的优势体现在它具有更优的图像数据压缩算法,能带来更小的图片体积,而且拥有肉眼无差异的图像质量;同时具备了无损和有损的压缩模式、alpha 透明以及动画的特性,在 jpeg 和 png 上的转化效果都想当优秀、稳定和统一。
提升网络传输速率:
原理:在一次 HTTP 请求中,底层会通过 tcp 建立连接。而 tcp 协议存在 3 次握手,4 次挥手阶段,这些机制虽然保证了 tcp 的可靠性,但降低了传输效率,为了解决这个问题,我们可以使用 http2 来增加传输时候效率。
http2 相比 http1 主要有以下几点优化:
原理:
当访问一个网站时,如果没有部署 CDN ,浏览器获取资源就是通过 DNS 解析得到 ip 后,向该 ip 地址请求资源;
如果该网站部署了 CDN ,那么就
查看:执行以下命令查看用户与服务器之间经过的所有路由器:
页面要进行渲染,首先要先加载资源,那么优化便可分为资源加载位置、资源加载时机和资源渲染过程。
资源加载位置:
优先使用外部文件样式,其次才是本文件的样式;
也是优先使用外部脚本文件,其次才是本文件的脚本代码。
资源加载时机:
原理:在 html 加载时,会加载很多第三方资源,这些资源的优先级是不同的,一些重要资源需要提前进行获取,而一些资源可以延迟进行加载。我们可以使用?DNS 预解析,预加载,预获取,预连接,预渲染来管理页面资源的加载。
使用:
标签有两个属性: 和 ,可以控制文件的执行顺序。
待补充......
概念:懒加载也叫延迟加载、按需加载,指的是在页面渲染时不一次性渲染所有图片,而是只加载在页面可视区内的图片。
优点:
原理: 给 标签定义一个 属性,赋值为图片地址,并将 属性赋值为 ,这样图片就渲染不出来了,当图片出现在页面可视区的时候,再将 的值赋给 即可完成懒加载。
注意: 是自定义的,你也可以定义为 。
这里的难点在于怎么确定可视区域,有两种方法:
代码实现:
构造函数的返回值 是一个观察器实例,实例的方法可以指定观察哪个 DOM 节点。
如果要观察多个节点,就要多次调用这个方法。
资源渲染过程:
原理:查询 DOM 比较耗时,因此在同一个节点需要多次查询的情况下,可以缓存 DOM 。
使用:
原理:HTML 中标签元素越多,标签的层级越深,浏览器解析 DOM 并绘制到浏览器中所花的时间就越长。
不要两个读操作之间,加入一个写操作。
原理:当 DOM 变动和样式变动时,会触发页面的重新渲染。但浏览器会尽量把所有的变动集中在一起,排成一个队列,然后一次性执行,尽量避免多次重新渲染。这时如果在修改样式中间进行了其他不是修改样式的操作,就会触发多次重排。
原理:在元素脱离文档流之后,对该元素进行的多次操作,不会触发回流。等操作结束后,再将元素放回标准流即可达到效果。
脱离文档流的方法:
实例:对 DOM 节点进行多次操作:给每个 新增一个 ,要使其不会触发回流
原理:如果要给一个节点操作多个 css 属性,而每修改一种样式都会造成回流,因此尽可能将多次操作合并成一个。
实例:
一个小的改动可能会使整个进行重新布局
原理:因为 元素是内联元素,所以在加载图片后悔改变宽高,因此最好在渲染前就指定图片的大小,或者让其脱离文档流。
我们知道,浏览器页面的绘制是由 GPU 完成的,因此减少重排重绘也可以从 GPU 缓存 这方面入手。例如:把那些会发生大量重排重绘的元素提取出来,单独触发一个渲染层,那么这个元素就不会影响其它层一块重绘了。
创建渲染层的方式:
满足以下任意情况便会创建层:
最常用的方法,就是给某个元素添加下面的样式:
在webkit内核的浏览器中,另一个行之有效的方法是:
待补充......
原理:在短时间内对一个元素进行多次的重复操作,可以设置防抖和节流,防止该操作的频繁触发。
实现:
进阶版:事件触发的时候马上执行 函数。
时间戳版
两者合并版
希望在每一帧刚开始的时候对页面进行更改,目前只有使用 requestAnimationFrame 能够保证这一点。使用 setTimeout 或者 setInterval 来触发更新页面的函数,该函数可能在一帧的中间或者结束的时间点上调用,进而导致该帧后面需要进行的事情没有完成,引发丢帧。
当你准备更新动画时你应该调用此方法。这将使浏览器在下一次重绘之前调用你传入给该方法的动画函数(即你的回调函数)。
?告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行。
注意:若你想在浏览器下次重绘之前继续更新下一帧动画,那么回调函数自身必须再次调用
语法:
参数: 表示下一次重绘之前更新动画帧所调用的函数(即上面所说的回调函数)。
返回值:一个整数,请求 ID ,是回调列表中唯一的标识。用于传值给以取消回调函数。
范例:
Copyright © 2002-2022 博猫-博猫娱乐纸糊模型站 版权所有 非商用版本备案号:点ICP备7845159号网站地图