性能优化

191 阅读3分钟

资源的合并和压缩

资源的合并(减少HTTP的请求数量)

因为HTTP的建立和释放都需要时间,而且浏览器对同一个域名的并发数量是有限制的,所以减少HTTP请求可以提升性能。

每个HTTP请求从建立到释放的步骤

  • 客户端连接到到Web服务器
  • 发送HTTP请求
  • 服务器接受请求并返回HTTP响应
  • 释放TCP连接

资源合并(文件合并)存在的问题:

  • 首屏渲染问题:合并JS文件后,文件会变大,请求的时间也会变长。如果渲染HTML时需要这个JS文件,会导致首屏渲染的时间变长。
  • 缓存失效问题:如果将多个文件合并成一个文件,只要任意修改其中任何一个文件都会导致文件缓存失效

资源合并(文件合并)方法:

  • CSS-sprites(雪碧图):将多张图片合并成一张图片,通过background-position属性来控制偏移量从而得到相应的图片
  • 将图片的内容嵌入到HTML中:使用内联样式将URL嵌入到HTML中
  • 多用SVG矢量图:压缩效果好,代码内嵌,相对较小(icon,logo)
  • 使用Webpack,gulp等工具合并文件

资源压缩

减少HTML,JS,CSS文件的大小。删除注释等等无效的代码。

可以使用Webpack,gulp等工具

CSS和JS的装载和执行

HTML渲染过程的特点

  1. 顺序执行:进行词法分析,从上到下

  2. 并发加载:并发请求外部资源,但是并发度受到浏览器域名的限制

  3. 阻塞:

  • CSS在head中通过link方式引入会阻塞页面渲染
  • CSS不阻塞外部资源请求,但是阻塞JS的执行
  • 引入JS会阻塞HTML文档的分析,页面的渲染
  • JS不阻塞外部资源加载
  1. 依赖关系
  • 页面渲染需要依赖CSS的加载
  • JS顺序执行,后面的代码会依赖前面的代码;JS依赖DOM节点

优化

  • CSS样式表置顶:防止页面在没有CSS的时候渲染出来
  • 用link代替import引入CSS: import会在页面加载完成后才执行(部分高版本浏览器没有区别)
  • JS脚本置底:防止阻塞页面渲染和CSS加载
  • 合理使用JS异步加载

图片懒加载和预加载

懒加载

在图片进入可视区域后再请求图片资源,需要监听scroll函数document.addEventListener('scroll',lazyload),使用getBoundingClientRect获取某个元素相对于视窗的集合item.getBoundingClientRect(),若图片的top小于视窗的高度document.documentElement.clientHeight,说明进入了可视区域。

预加载

在使用图片等静态资源前提前请求

实现方式

  • <img src="http://..." style="display: none" />
  • 使用Image对象 var image = new Image();image.src = "http://...";
  • 使用XMLHttpRequest对象
  • 使用PreloadJS,提供了一个一致的方式预先加载在HTML应用的内容,以及预加载可以使用HTML标签作为XHR完成。

参考1:juejin.cn/post/684490…

参考2segmentfault.com/a/119000002…

参考3:segmentfault.com/a/119000002…