对网站的产品页进行性能优化,提高加载速度

最近一直在做性能优化和模块化改造的工作,并完成了一次前端重构。应用场景分析;常规优化手段包括;增强型手段;监控、测量;按需加载;效果、总结

对网站的产品页进行性能优化,提高加载速度

前言:

最近一直在做性能优化和模块化改造的工作,并完成了一次前端重构。在这里总结出一些经验和得失来帮助大家思考。共两篇文章,第一篇讨论性能优化,第二篇讨论模块化框架。而之所以把这两个话题放到一起,是因为这两项工作都涉及到对前端代码进行不同程度的重构,而且模块化改造其实是我们在对性能优化做到一定程度之后发现必须要做的一件事情。本篇是性能优化的部分,下面我把我们的产品简称为N页面。

应用场景分析:

N页面作为一个入口页面,对页面加载速度有着极高的要求。同时,N页面内部却又有着非常复杂的功能与交互。N页面的第一版上线时,页面引用的js文件有3个,一共40-50k(压缩&Gzip之后)。页面onload时间在1.3秒。

1.3秒的load时间,相比较绝大多数网站来说都是一个不错的数值。但老板一句话“怎么这个页面打开这么慢”,立刻像是给我们的后背安了一枚定时炸弹。性能优化成了N页面下一步工作的重中之重。

老板重视页面速度,对于Web前端开发人员来说其实是件幸事,这表明你将有更丰富的时间和资源去实践Web性能优化这一课题,不用被翻来覆去的产品升级需求所打扰。那么对于N页面,我们做了哪些实践:

常规优化手段包括:

CSS置顶,JS置底。

静态资源外联、合并、压缩。

基础库定制。(用代码分析代码,自动打包被使用到的方法作为基础库,使基础库从原来的压缩后25K减小为9.8K,减小了61%)

页面数据存储优化。(从原来的直接写json形式的script,变为将json隐藏在textarea中,初始化或用到的时候才去提取并进行解析。)

首屏CSS检测。(对首屏用到的CSS进行检测,将不属于首屏的CSS代码单独打包并移到首屏之外进行延迟加载)

js按需加载。(在后面做重点介绍)

监控& 测量

性能优化最重要的工作不是优化而是监控。这个道理很简单:没有监控体系就没办法衡量性能优化的效果,那么你所做的任何工作都是盲目的。

我们对性能的监控是从多个维度展开的,包括平均时间、时段分布、浏览器分布、省份、运营商等。便于发现和定位任何一个细节的问题。

而在平均时间这一维度,我们又分为四个级别:

1.head时间– head标签加载完成的时间

2.tti时间– 页面可交互时间(即首屏第一次渲染出来的时间)

3.dom时间– Dom Ready的时间

4.load 时间– 页面完全加载完成的时间

这样划分的好处是,页面加载每个环节的耗时一目了然:

head :CSS加载时间

tti :整体HTML加载和渲染时间

dom 减TTI : js文件网络传输时间和在浏览器进行解析的时间

load 减Dom : js初始化+ 有2%的用户网速小于2k/s,5%的用户网速小于10k/s。(国内的网络状况真是惨不忍睹啊)

那么,优化方案就很明显了:最大限度地减小js文件大小,以减小网络传输时间,提升页面性能。

通过后来的优化工作我们发现:js代码压缩、Gzip后每减小1k,页面加载时间就能减小10ms左右。

按需加载:

这是除了js压缩外,你能想到的最有效减小js文件大小的办法了。

按需加载,顾名思义,就是在页面首次加载的时候只提供最需要的js给用户,而剩余的js等用户使用到了相关的功能再去加载。

按需加载适合哪种类型的网站:如果80%的用户来到你的页面只使用20%的功能,那么就有必要把这20%的js作为首屏加载,而剩余的js做按需加载。

从这个角度来讲,几乎所有网站都可以做按需加载,因为总有一些功能是用户很少会用到的。

那么,如何做按需加载:

按需加载需要有一套js模块加载的框架。这个框架的作用是:保障在所需的js加载完成后才去执行回调方法。

按需加载还需要有一套触发条件。在我们的页面中,对鼠标移动和鼠标点击都进行了监听,以保障在用户想使用某个功能之前或进行了相应操作时,触发js加载。

除此之外,我们还对js基础库进行了进一步拆分,分为首屏用到的基础方法,和延迟加载的js所需的基础方法。以最大限度地保证首屏js量的最小化。

通过按需加载的拆分,我们将首屏的js代码从原来的gzip之后40-50k减小到了只有24k。

同时,我们对CSS的加载也进行拆分,首屏不需要的CSS代码也随JS进行延迟加载。

效果 & 总结

性能优化是一个非常繁琐的工作,页面性能受很多因素的制约,不过相信一点:方法总比问题多。我们通过优化,最终将页面加载时间降到了650ms,仅为优化前的一半。所有优化工作中,效果最明显的就是js按需加载了。

不过按需加载也为我们的代码结构带来了很大的冲击,极大地改变了我们写代码的方式,也制造了很多问题,我会在下一篇《前端重构——模块化框架实践》中进行详细介绍。

文章来源:百度搜索研发部官方博客

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年5月4日 23:33:45
下一篇 2024年5月4日 23:35:53

相关推荐

  • java实现热加载,java热重载

    用jetty做嵌入式开发,怎样才能让class热加载。 首先要解决文件被锁定的问题。文件被锁定是由于在使用windows系统时,jetty默认在内存中映射了这些文件,而windows会锁定内存映射的文件。 由于Jetty本身代码的原因,WebApplicationInitializer的实现必须直接实现接口,不能继承 AbstractContextLoade…

    2024年5月23日
    4100
  • oraclelinuxio性能,oracle性能优化求生指南

    oracle数据库性能优化什么意思 1、针对不同业务模式对数据库进行优化,修改sga、pga、各种pool及其他parameter,spfile等可以增强数据库的可用性,提高内存使用效率,避免数据库异常现象的发生。 2、应用程序的执行最终将归结为数据库中的SQL语句执行,因此SQL语句的执行效率最终决定了ORACLE数据库的性能。ORACLE公司推荐使用OR…

    2024年5月22日
    4900
  • linux加载光驱报错,linux如何加载光驱

    linux下挂载光驱问题 1、Linux中挂载光驱输入命令mount/mnt/cdrom显示没有那个目录,是设置错误造成的,解决方法如下:首先将系统镜像文件与光驱关联(实际环境是将安装盘放入光驱)。然后将光驱挂载到/mnt下mount/dev/cdrom /mnt。 2、找到光盘的完整路径名。在命令行输入:ls -l /dev | grep cdrom。可以…

    2024年5月22日
    4700
  • linux加载硬盘权限,linux 硬盘权限

    Linux系统如何加载U盘或移动硬盘 1、首先,将U盘插入电脑,进入Linux系统主界面,再使用Ctrl+Alt+T快捷键打开命令窗口,获取高级用户权限,在窗口中输入命令:sudo -i,按enter确认后输入密码,如下图所示,然后进入下一步。 2、操作步骤如下: 首先插入u盘到电脑主机u *** 接口处(建议插入到主机箱后置的u *** 接口),然后打开U…

    2024年5月22日
    4300
  • javatrycatch性能,java里面的try catch

    Java代码如何优化 使用指定类、方法的final修饰符 具有final修饰符的类不可派生。在Java核心API中,有许多最终应用程序的例子,例如java.lang.String,整个类都是final。 下面回龙观回龙观IT培训为大家介绍代码优化的方法。尽量重用目标 特别是,使用代表字符串收敛的String目标应该使用StringBuilder/String…

    2024年5月21日
    4800
  • c语言加载dll,c语言加载背景音乐代码

    c语言怎么调用别人的dll文件 1、(1)编写程序时,你要包含(#include \什么.h\) dll文件作者提供 的 头文件(.h文件) 。程序里,便和普通函数调用一样,去调用它的函数。(2)程序编译时,你要链接 dll文件作者提供 的 (.lib文件) 库文件。 2、可以是可以,比较麻烦。方法我目前所知的有两种 一种是用C#写出COM组件,在系统中注册…

    2024年5月21日
    4500
  • pythonjava速度,python速度太慢

    python的性能 1、)Python是解释型语言,能跨平台解释型语言一般都是跨平台的(可移植性好),Python也不例外,我们已经在《编译型语言和解释型语言的区别》中进行了讲解,这里不再赘述。 2、py 关键代码可以依赖于扩展包Python使许多编程任务变得简单,但是对于很关键的任务并不总是提供最好的性能。使用C、C++或者机器语言扩展包来执行关键任务能极…

    2024年5月20日
    4600
  • linux动态加载so原理,linux添加动态库

    什么是linux中的SO动态库 SO文件是Linux下共享库文件,它的文件格式被称为ELF文件格式。由于Android操作系统的底层基于Linux系统,所以SO文件可以运行在Android平台上。Android系统也同样开放了C/C++接口供开发者开发Native程序。 so的全称是shared object,即共享动态链接库,类似于windows下的dll…

    2024年5月20日
    4200
  • linuxkvm性能,k linux

    kvm切换器是什么 1、kvm切换器是用于切换不同电脑源的计算机硬件设备;kvm切换器也被称为计算机切换器,使用户透过一组键盘、显示屏和鼠标控制多台计算机,kvm也就是键盘(Keyboard)、显示器(Video)、鼠标(Mouse)的英文首字母缩写。 2、KVM切换器是一种计算机硬件设备,可以使用户透过一组键盘、屏幕和鼠标控制多台电脑。透过KVM切换器,可…

    2024年5月20日
    4600
  • linux加载ko文件,linux 加载iso

    Linux系统下.ko文件是什么文件?.so文件是什么文件? SO文件格式即ELF文件格式,它是Linux下可执行文件,共享库文件和目标文件的统一格式。根据看待ELF文件的不同方式,ELF文件可以分为链接视图和装载视图。链接视图是链接器从链接的角度看待静态的ELF文件。 .ko文件是kernel object文件(内核模块),该文件的意义就是把内核的一些功能…

    2024年5月19日
    3900

发表回复

登录后才能评论



关注微信