`

400% 的飞跃-web 页面加载速度优化实战

阅读更多

       

前言

一个网站的加载速度有多重要? 反正我相信之前来博主网站的人至少有 50% 在加载完成前关闭了本站。 为啥捏? 看图

首页完整加载时间 8.18s,看来能进来看博主网站的人都是真爱呀,哈哈。 正常来讲一个网页 4s 加载不完就会流失很大一部分用户,而博主的网站加载时间竟然达到了 8s 还是在电脑端,如果在移动端,加载时间会更久,体验会更差。 这样的话网站做得再难看批判者进不来不是白搭嘛,于是针对 web 页面加载速度的优化迫在眉睫。

基于博主以前优化过其他网站,于是博主准备把这次的优化过程记录下来分享给大家借鉴。

1. 页面分析

先来看优化前的页面:

加载时间 8.18s ,一共 33 个 请求,加载 1.38MB 。 可以看到对于网速较慢的浏览者光加载资源就需要 5s 以上,再加上 33 个请求切换开销,简直不能愉快的玩耍。 所以接下来的优化手段就要从加载流量和请求数量入手:

2. 优化图片

图片在网络流量中占有很大的比重,因此优化图片对于减少流量有着至关重要的作用。

合并小图片:

很多页面有很多小图标,一个一个加载就相当于一个一个请求,将这些小图片合并成一个大图片,用css 控制显示范围,这样就只需要一个请求即可加载完所有小图片,瞬间就会减少很多网络请求。

优化图片格式:

很多图片没有经过优化直接上传到网页中会占用很多额外的流量,比如一张屏幕大小的截图,用截图工具直接截图后的大小大概有 1MB ,此时直接上传到网页中就直接占用了 1MB 流量,但其实我们完全可以只牺牲它 40% 的质量换取缩小 10 倍的大小,网上有很多转化 web 图片的网站,当然如果你有 photoshop 的话完全可以自己导出:

将图片在 ps 中打开,然后点击菜单栏 “文件” 菜单,选择 “储存为 web 所用格式”,出现如下对话框:

一般情况下 jpg 图片选择品质中即可,png 格式图片选择 png8 即可,但注意有透明背景的 png 图片要选择 png24 ,否则透明背景中会出现白边,gif 图片选择 gif64 无仿色即可。

一般经过优化的图片大小至少会有 3倍 之差,图片原大小越大优化的结果会越好。

博主的网站最显眼的图片就是页眉上那个幽鬼的图片啦,所以就先拿它开刀,经过以上步骤优化:

瞬间减小 4 倍,实际效果可以看看,代表着博主门面的图片经过优化后和优化前显示效果并没有明显区别,而文件大小却相差了 4 倍。

3. 使用免费 cdn 加载第三方资源

所有网站都会用到第三方资源,对于第三方资源,如果选择让自己的服务器提供,那么对于小型站点,本就不大的带宽相当一部分还要被公共资源占用,无形之中压缩了服务器带宽,如果把这部分资源让第三方 cdn 提供,那么对于网站加载速度会有不小的提升。

博主选用的是 bootstrap 中文站提供的 cdn 静态库,博主看过不少国内 cdn 静态库,可以说 bootstrap 家的还是很良心的,更新及时,资源现在也很丰富,基本博主用的三方资源都能在上面找到,于是接下来就是搜索静态资源 + 替换静态资源:

  1. <scriptsrc="/s/js/jquery.min.js"></script>
  2. 改为
  3. <scriptsrc="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>

这里不要写协议头,让网页自动判断使用 http 还是 https ( 关于 https 网站的部署可以看博主之前的文章: 给你的网站穿上外衣- HTTPS 免费部署指南 )

4. 使用 cdn 储存静态资源

一般网站 90% 的流量都用于静态资源的加载,除了用免费 cdn 加载第三方资源,还可以自己申请云空间储存自己的静态资源,进一步减小服务器的开销,让服务器只专注于提供数据或者网页渲染服务。 比如博主使用的是 X牛 ,将自己的图片什么都存在 x牛上,每个月都有免费流量,对于个人网站来说应该够用。

5. 合并压缩 js css

除去引用公共库,网页中还有许多自己写的 js 与 css,如果我们直接把开发环境的文件拿来用无疑很浪费流量,因此在编写好网页测试完毕后,我们应该将 css 和 js 压缩合并成一个或者几个文件,这样既减少了请求次数又减少了流量消耗,一箭双雕。 当然还有 html 压缩,不过 ms 现阶段还有一些坑,就先不用了。 说到合并压缩,第一时间播追就想到了 webpack ,前端工程化神器,简单配置一下就可以完全搞定任务:

博主网站自己的 js 工程文件放在 /webroot/static/src/js/ 中,假如我们要将压缩合并后的文件放在 /webroot/static/dist/js/ 中:

在 /webroot/ 下新建文件夹 webpack, 进入文件夹,新建文件 package.json:

  1. {
  2. "name":"RaPo3",
  3. "version":"1.0.0",
  4. "description":"",
  5. "main":"index.js",
  6. "scripts":{
  7. "test":"echo \"Error: no test specified\" && exit 1"
  8. },
  9. "author":"rapospectre",
  10. "license":"ISC",
  11. "devDependencies":{
  12. "css-loader":"^0.24.0",
  13. "style-loader":"^0.13.1",
  14. "webpack":"^1.13.2",
  15. "webpack-dev-server":"^1.15.1"
  16. }
  17. }

保存后执行:

  1. npm install
  2. //或
  3. cnpm install
  4. //如果你有的话

然后新建 webpack 配置文件 webpack.config.js:

  1. var webpack =require('webpack');
  2. module.exports ={
  3. entry:{
  4. base:['../static/js/src/http.js','../static/js/stickUp.min.js','../static/js/src/base.js'],
  5. index:['../static/js/src/index.js'],
  6. detail:['../static/js/editormd.js','../static/js/src/article.js'],
  7. know:['../static/js/editormd.js','../static/js/src/know.js'],
  8. list:['../static/js/src/list.js']
  9. },
  10. output:{
  11. path:'../static/js/dist/',
  12. filename:'[name].js'
  13. },
  14. plugins:[
  15. new webpack.optimize.UglifyJsPlugin({
  16. output:{
  17. comments:false
  18. },
  19. compress:{
  20. warnings:true
  21. }
  22. }),
  23. ]
  24. }

这里要注意的是如果你的 js 文件间的引用是传统的 html 引入后引用那么在这里合并时记得把你被引用的方法\对象等等设置为全局,比如 b.js 要引用 a.js 中的函数 c,合并前要在 a.js 中加上( 当然如果你一直用 es6/node 写 js 就不用看这里了 ):

  1. window.c = c;
  2. this.c = c;

不然 c 就会被当作局部函数封装起来。

改完后运行 webpack 提示成功后看到 dist 目录里已经输出了合并压缩好的文件,之前 12kb 的文件经过压缩合并后只有 6kb 大小,然后我们将其替换到网页中即可。

6. 代码优化

页面代码的优化对于页面加载速度也有不小的影响,最广为人知的:

HTML头部的JavaScript和写在HTML标签中的Style会阻塞页面的渲染,因此CSS放在页面头部并使用Link方式引入,JavaScript的引入放在页面尾

其次还有:

  1. 按需加载,把统计、分享等 js 在页面 onload 后再进行加载,可以提高访问速度;
  2. 优化 cookie ,减少 cookie 体积;
  3. 避免  的 src 为空;
  4. 尽量避免设置图片大小,多次重设图片大小会引发图片的多次重绘,影响性能;
  5. 合理使用display属性:
    1. a.display:inline后不应该再使用widthheightmarginpadding以及float
    2. b.display:inline-block后不应该再使用float
    3. c.display:block后不应该再使用vertical-align
    4. d.display:table-*后不应该再使用margin或者float
  1. 不滥用Float 和 web 字体;
  2. 尽量使用CSS3动画;
  3. 使用 ajax 异步加载部分请求;

7. HTTP2 与 gzip

HTTP2 是以 SPDY 为基础开发的。 SPDY 系列协议由谷歌开发,于 2009 年公开。它的设计目标就是降低 50% 的页面加载时间,所以 HTTP2 在很大程度也是为了优化页面加载时间,同时 HTTP2 支持多路复用,简单说就是所有的请求都通过一个 TCP 连接并发完成。 而 gzip 大家都不陌生,就是一种压缩网页的技术,当然压缩网页进行传输的代价就是给服务器增加一些压缩的负担,当然这种牺牲是值得的。

如何开启 HTTP2 与 gzip? 博主的网站基于 nginx + uWSGI 进行服务,因此只要在 nginx 开启 HTTP2 与 gzip 就好:

开启 HTTP2

nginx 1.9.5 之后才支持 HTTP2 ,而且需要配置编译参数,关于 nginx 开启 HTTP2 请直接移步博主之前的文章: nginx 配置 http2

开启 gzip

直接打开 nginx 配置文件, 比如博主的在 /etc/nginx/nginx.conf, 然后加上:

  1. server{
  2. gzip on;
  3. gzip_comp_level 6;
  4. gzip_proxied any;
  5. gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript application/x-font-woff;
  6. }

然后重启 nginx 即可

最后,让我们清除缓存,再次打开网站:

总加载流量 527kb ,页面完成加载时间 1.84s,对比之前加载时间 8.18s ,1.38MB 流量,整体时间提升了 4 倍多!用手机端访问测试,简直快的飞起,不信你也来访问( 骗流量脸 )试试呀~

最后,附上本文网站的源码以及目录结构,可以通过 commit 记录更加直观的看到优化的过程:

https://github.com/bluedazzle/django-vue.js-blog

欢迎来颗 star 哈哈。

原文地址https://www.rapospectre.com/blog/web-page-loading-optimize-guide

分享到:
评论

相关推荐

    400%的飞跃-web页面加载速度优化实战

    这样的话网站做得再难看批判者进不来不是白搭嘛,于是针对web页面加载速度的优化迫在眉睫。基于博主以前优化过其他网站,于是博主准备把这次的优化过程记录下来分享给大家借鉴。先来看优化前的页面:加载时间8.18s,...

    飞跃--手册

    详细讲述了GF的w前世今生和突破技术,想看不能看的东西就认真学习学习吧

    跨平台高手必修课-Flutter动态化解决方案实战

    跨平台高手必修课--Flutter动态化解决方案实战之手把手带你自研一套Flutter动态热更新框架。 Flutter作为跨平台首选框架,未来可期,但动态化问题一直是行业诟病的问题。所以,各大公司都急需一套成熟且高效的动态...

    远卓-重新审视公司战略与管理体系,在挑战中实现飞跃---报告.pptx

    这份报告名为“远卓-重新审视公司战略与管理体系,在挑战中实现飞跃”,着重讨论了如何在面临挑战时通过改进战略和管理体系来推动企业飞跃式发展。 【KPI 考评体系】作为企业管理的重要组成部分,其主要功能包括...

    多云世界芯飞跃--2017英特尔至强可扩展处理器解析.pdf

    这个处理器系列代表了英特尔在数据中心计算能力上的重大飞跃,尤其针对企业级用户、云计算、关键业务以及大规模科学计算等领域。新一代处理器引入了许多创新技术和增强的扩展能力,同时对产品线进行了重新命名,包括...

    Yahoo!网站最佳体验守则、web优化

    在构建和维护网站时,确保用户能够获得最佳的浏览体验是至关重要的。Yahoo!网站最佳体验守则是指导网站开发者和管理员...在实践中,结合文件"web优化"的内容,可以深入学习和应用这些优化策略,为网站带来质的飞跃。

    重塑互联网教育行业-伴鱼如何实现从1到10的飞跃-.docx

    ### 重塑互联网教育行业——伴鱼如何实现从1到10的飞跃 #### 一、互联网教育行业背景 互联网教育自上世纪90年代初现雏形以来,经历了多个发展阶段。从最初的网络学校形式,到2013年以后随着移动互联网、大数据、...

    Pragmatic Ajax - A Web 2.0 Primer

    7. **性能优化**:书中可能会讨论如何减少HTTP请求,缓存策略,以及如何利用Ajax进行页面预加载和分块加载以提高性能。 8. **最佳实践**:书中可能包含关于编写可维护和可扩展的Ajax代码的建议,包括错误处理、版本...

    Web中利用Ajax技术进行模型优化.pdf

    它的核心理念在于利用客户端脚本技术与Web服务器进行数据交换,并在无需重新加载整个页面的情况下,更新页面的部分内容。这一技术的出现,从根本上改变了传统的Web应用交互模式,使得Web应用的用户体验有了质的飞跃...

    跨平台高手必修课-Flutter动态化解决方案实战(14章)

    手把手带你自研一套Flutter动态热更新框架,带大家从0到1自主研发一套Flutter动态化框架,并深入掌握跨平台动态化解决方案,助力你在跨平台技术上有质的飞跃。 Flutter是一种由谷歌开发的开源用户界面(UI)工具包...

    精品2021海关数字化转型白皮书:从质的提升到质的飞跃-海关管理的数字化转型 华为&德勤白皮书(PDF报告).rar

    《2021海关数字化转型白皮书:从质的提升到质的飞跃—海关管理的数字化转型 华为&德勤白皮书》是一份深入探讨海关行业如何通过数字化手段实现根本性变革的专业报告。这份由华为和德勤联合发布的PDF报告,不仅详尽...

    【珍贵】2010WEB前端技术趋势及总结

    - **YouTube的视频加载优化**:YouTube通过优化JavaScript代码执行逻辑、预加载视频片段以及提供高清版本等多种手段,显著提高了视频加载速度。这些改进措施有效地缩短了用户等待时间,提升了用户体验。 - **Yahoo ...

    安全技术-网络信息-滁州联通CDMA网络优化.pdf

    论文强调了深入理解网络优化的重要性,通过系统的优化思路解决网络规划初期的不足、维护中的难题以及运行过程中的参数配置不合理性,以实现无线网络运行质量的飞跃。关键词包括码分多址、导频污染和软切换,这些都是...

    提高网页打开速度的一些小技巧

    互联网带宽越来越宽,似乎让网页的加载速度得到了质的飞跃。其实不然,因为随着带宽的提高,网页上的对象也越来越多,因此加快网页打开速度还是一个重要的课题。加快网页的打开速度,有三个路径,一是提高网络带宽,...

    能否代表英特尔40年的进化成果?--Core i7-8086K纪念版处理器实战.pdf

    5. **性能对比**:与8086相比,Core i7-8086K的运算能力提升了30万倍以上,工作频率、核心数、线程数、内存支持等各方面都有巨大飞跃。但与当代的旗舰处理器Core i7-8700K相比,Core i7-8086K的主要提升在于基础频率...

    飞跃手册(第二版)--北大未名飞跃重洋版

    - **手册名称**:飞跃手册(第二版)——北大未名飞跃重洋版 - **适用对象**:在校学生及非学生群体,主要面向有意出国留学的人士 - **内容特点**:详尽实用,涵盖留学准备、申请流程、海外生活等多个方面 #### 二...

    java版飞机大战源码-java-performance:Java系统性能优化实战

    书配套例子,Java系统性能优化实战 ,程序员的优化宝典。购买地址可以从。书中代码包含了关键注释和结论,也可以直接浏览代码获得知识 如果对SpringBoot技术有兴趣,可以购买或者电子版 大佬评书 看了李兄的第4章...

Global site tag (gtag.js) - Google Analytics