前段时间优化一个公司历史老项目的Web性能,却引出了一系列的问题,让我反思良多。

我通过Chrome的Lighthouse工具可以看出一些性能参数和问题反馈,我逐一对其进行优化。

根据资源请求的不同,大致可以分为前端资源性能和后端程序性能两个方面。

先分析一下前端资源吧:

  1. Defer offscreen images。

Chrome给出的建议是:

Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. Learn more.

意思是可以考虑延迟加载一些图片或者隐藏一些图片在所有关键资源完成加载后再考虑加载,通过延迟加载来降低交互时间。

lazy-load的实现方法很多,开源框架推荐:lazysizes

当然也可以使用npm方式安装:

npm install lazysizes

使用方式很简单,先引入lazysize到需要的页面:

<script src="lazysizes.min.js" async=""></script>

然后给需要被lazyload的img标签上加新的属性,如下:

<img
data-sizes="auto"
data-src="image2.jpg"
data-srcset="image1.jpg 300w,
image2.jpg 600w,
image3.jpg 900w" class="lazyload" />

特别要注意,有时候太多background方式加载的图片也会影响性能,lazysizes也可以处理这样的图片。方法如下,使用data-bg属性即可:

<div class="lazyload" data-bg="/path/to/image.jpg"></div>
  1. Reduce JavaScript execution time

解决这个问题方法很多,第一个想到的就是压缩资源。

比如压缩js和css文件,可以考虑使用webpack工具或者gulp来压缩大资源文件,合并一些文件资源请求。

还可以通过预加载来提高响应速度,可以在最重要的js资源文件的引入上加入预加载,代码如下:

<link rel="preload" as="style" href="css/style.css">

通过增加preload

最后还可以异步加载资源,异步不会阻塞主进程,代码调整也很小:

<script src="xxx" async></script>

除此之外JavaScript的执行时间过长还有可能是有大量逻辑运算,有很多页面把一些逻辑判断和计算都交给前端去计算,这样也不利于渲染,建议还是把复杂逻辑和计算尽可能交给后端去处理,让前端渲染更加“轻量”。

3. Backend response

数据接口返回有时候也很拖累响应时间,因为一些前端结构需要根据返回的数据进行组装新的页面结构。

这里可以考虑找到性能真正的瓶颈,到底是数据库查询导致的慢,还是业务逻辑不清晰导致的冗余,或者其他原因。

我遇到的是因为老项目的数据库操作类不是单例,会每次产生一个数据库连接句柄,且该页面复杂又多的sql查询。

我勇敢地修改着10多年历史的代码,编写了单例模式的操作类,然后增加了必要的缓存机制。

然而后面我遇到了问题,首先单例类在一些特殊情形下不满足之前的代码需求,导致奇特的数据库报错,而async属性导致一些js文件无法同步加载到位,而有一些依赖这些资源的php文件执行报错。

最终在同事的帮助下,恢复了服务,我也再一次体会到了任何一种性能提升都要谨慎,特别是对一个古老的项目。

前人不敢动的代码,可能是深渊。

PS:我的公众号 成都有娃儿会同步发布该文章,也可以关注哦!

打个总结:Web性能优化的更多相关文章

  1. 关于WEB 性能优化 (摘抄)

    压缩源代码和图片 JavaScript文件源代码可以采用混淆压缩的方式,CSS文件源代码进行普通压缩,JPG图片可以根据具体质量来压缩为50%到70%,PNG可以使用一些开源压缩软件来压缩,比如24色 ...

  2. Web性能优化-合并js与css,减少请求

    Web性能优化已经是老生常谈的话题了, 不过笔者也一直没放在心上,主要的原因还是项目的用户量以及页面中的js,css文件就那几个,感觉没什么优化的.人总要进步的嘛,最近在被angularjs吸引着,也 ...

  3. web性能优化——浏览器相关

    简介 优化是一个持续的过程.所以尽可能的不要有人为的参与.所以能自动化的或者能从架构.框架级别解决的就最更高级别解决. 这样即能实现面对开发人员是透明的.不响应,又能确保所有资源都是被优化过的. 场景 ...

  4. Web性能优化系列

    web性能优化之重要,这里并不打算赘述.本系列课程将带领大家认识.熟悉.深刻体会并且懂得如果去为不同的站点做性能优化 同时,本系列将还会穿插浏览器兼容性相关问题的解决方案,因为在我看来,兼容性同样属于 ...

  5. 移动web性能优化笔记

    移动web性能优化 最近看了一些文章,对移动web性能优化方法,做一个简单笔记 笔记内容主要出自 移动H5前端性能优化指南和移动前端系列——移动页面性能优化

  6. web性能优化 来自《web全栈工程师的自我修养》

    最近在看<web全栈工程师的自我修养>一书,作者是来自腾讯的前端工程师.作者在做招聘前端的时候问应聘者web新能优化有什么了解和经验,应聘者思索后回答“在发布项目之前压缩css和 Java ...

  7. web性能优化之--合理使用http缓存和localStorage做资源缓存

    一.前言 开始先扯点别的: 估计很多前端er的同学应该遇到过:在旧项目中添加新的功能模块.或者修改一些静态文件时候,当代码部署到线上之后,需求方验收OK,此时你送了一口气,当你准备开始得意于自己的ma ...

  8. Web 性能优化:Preload与Prefetch的使用及在 Chrome 中的优先级

    摘要: 理解Preload与Prefetch. 原文:Web 性能优化:Preload,Prefetch的使用及在 Chrome 中的优先级 作者:前端小智 Fundebug经授权转载,版权归原作者所 ...

  9. Web 性能优化:21 种优化 CSS 和加快网站速度的方法

    这是 Web 性能优化的第 4 篇,上一篇在下面看点击查看: Web 性能优化:使用 Webpack 分离数据的正确方法 Web 性能优化:图片优化让网站大小减少 62% Web 性能优化:缓存 Re ...

  10. Web 性能优化: 图片优化让网站大小减少 62%

    摘要: 压缩各种格式的图片. 原文:Web 性能优化: 图片优化让网站大小减少 62% 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 这是 Web 性能优化的第二篇,上一篇在下面看点 ...

随机推荐

  1. SSIS 数据类型 第二篇:变量的数据类型

    变量(Variable)用于存储在Package运行时用到的值,集成服务支持两种类型的变量:用户自定义的变量和系统变量,自定义的变量由用户来定义,系统变量由集成服务来定义. 变量的用途十分广泛,用于容 ...

  2. jchdl - RTL实例 - MOS6502 ALU

    https://mp.weixin.qq.com/s/nMxYVC2djk7DdAforerZPA   使用jchdl RTL实现MOS6502 CPU的ALU.   参考链接 https://git ...

  3. OkHttp,一次无奈的使用

    一次使用OKHTTP的心痛历程 最近由于一些不得已的原因,接触到了OKHttp,说起来也挺Dan疼的,之前同事将生产附件上传地址配置成了测试地址,还好数量不多,没有造成太大的影响,况且的是这位同事又离 ...

  4. (Java实现) 洛谷 P1071 潜伏者

    题目描述 R国和 S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S国的 R 国间谍小 C终于摸清了 S 国军用密码的编码规则: 1. S 国军方内部欲发送的原信息经过 ...

  5. C# winform 学习(二)

    目标: 1.ADONET简介 2.Connection对象 3.Command对象 4.DataReader对象 准备工作:创建mhys数据库及员工表 代码如下: create database mh ...

  6. Java实现 LeetCode 448 找到所有数组中消失的数字

    448. 找到所有数组中消失的数字 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间 ...

  7. Java实现 LeetCode 388 文件的最长绝对路径

    388. 文件的最长绝对路径 假设我们以下述方式将我们的文件系统抽象成一个字符串: 字符串 "dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext" 表示 ...

  8. Java实现 LeetCode 133 克隆图

    133. 克隆图 给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆). 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node]). class Node { ...

  9. Java实现 蓝桥杯VIP 算法提高 change

    算法提高 change 时间限制:1.0s 内存限制:256.0MB 问题描述 数组A中共有n个元素,初始全为0.你可以对数组进行两种操作:1.将数组中的一个元素加1:2.将数组中所有元素乘2.求将数 ...

  10. Java实现第十届蓝桥杯JavaC组第十题(试题J)扫地机器人

    扫地机器人 时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分 [问题描述] 小明公司的办公区有一条长长的走廊,由 N 个方格区域组成,如下图所 示. 走廊内部署了 K 台扫地机器人 ...