广州总部电话:020-85564311
广州总部电话:020-85564311
20年
互联网应用服务商
请输入搜索关键词
知识库 知识库

优网知识库

探索行业前沿,共享知识宝库

Web 性能优化实战之海外分校官网性能优化

发布日期:2025-06-27 12:27:13 浏览次数: 816 来源:好未来技术
推荐语
海外分校官网性能优化实战:从域名收敛到图片压缩,一步步提升用户体验。

核心内容:
1. 域名收敛专项解决CDN加速问题
2. 基于webpagetest和lighthouse的性能分析
3. 图片格式优化与AVIF/webp方案选择
小优 网站建设顾问
专业来源于二十年的积累,用心让我们做到更好!

前言:

加入到海外产研后得到一个需要 11 月底完成的任务:官网性能优化。

业务反馈网站打开慢。

在这之前,前端的伙伴已经做了一些前期的工作,我翻阅了一下。

  • 三方脚本报错移除

  • 三方脚本加载异步处理

  • 非首屏图片进行 lazy 加载处理

  • 非 SEO 必须组件使用异步加载

01

第一个优化版本

基于 v-lazy-load 做了懒加载优化后,提交了一个版本给测试伙伴进行验证,这时候遇到了一个问题:

没有一个支持 CDN 加速的非线上环境

那就创建一个预发布环境支持上 CDN 加速,就齐了

且慢,运维伙伴反馈:

由于二级域名过多,导致全集团加速的域名已经要超出套餐数量

为了达到套餐内能实现预发布环境部署来验证实际的优化效果,我们内部决定要做一轮 域名收敛 专项。经过这样的处理后,将原始的 *.thethinkacademy.com 的路径统一调整为 thethinkacademy.com/* 来节省域名资源。

经过这一轮调整后,终于可以来验证一下之前的优化改动的效果了。

经过回归测试发现,没有明显的改善,新加坡的还在另一个指标上下降了 😦

02

分析结果

我们现在使用 webpagetest 来进行性能测试,在之前的团队里我和伙伴们还做过基于 lighthouse 的性能分析和优化,这次也综合参考了部分 lighthouse 的分析结果来改进。

一起看一下 webpagetest 的衡量指标:

  • Security Score

  • First Byte Time

  • Keep-Alive

  • GZIP text

  • Compress Images

  • Use Progressive JPEGs

  • Cache Static

  • Use A CDN

其中 Security Score First Byte Time   Cache Static 分均为 F 最低,其中 First Byte Time 是很重要的一个指标,即服务端开始给浏览器返回数据的标示;相比这个指标其实 lighthouse  首屏渲染 其实更有价值,现在先依据 webpagetest 的标准来进行优化。

03

优化方案

一般来说性能不好,无外乎这么几个点,其中非常容易做的就是静态资源的压缩和格式转换,通过 lighthouse 分析可以发现,有一些大尺寸图片以及一些体积巨大(600KB+)的图片资源存在,这些资源对于加载性能影响巨大,需要消灭。

如何优化图片体积,通过 webspeedtes.cloudin ary.com 来分析可以得到一个非常不错的结果:

结果来看采用 AV1 编解码的图片格式 AVIF 一骑绝尘,但别忘了这个新格式在浏览器的支持上还不够,不能直接默认启用,还需要考虑 fallback 方案,而 webp 也是 Google 在推进的图片格式同一样有不错的表现,但同样为了做到各种浏览器的普适性,webp 都是一个需要考虑 fallback 方案的格式。这么一来,从项目的时间风险来看需要考虑如下方案:

A. 采用原格式进行图片压缩;

B. 采用 JPEG2000 进行格式转换(大部分情况下表现同样亮眼);

C. 采用激进的 AVIF、webp 格式同样考虑 fallback 格式。

为了支持多种图片格式,需要将 <img> 换成 <picture> 

<picture>  <source srcset="mdn-logo.svg" type="image/svg+xml">  <source srcset="mdn-logo.avif" type="image/avif">  <source srcset="mdn-logo.webp" type="image/webp">  <img src="mdn-logo.png" alt="MDN"></picture>

通过图片压缩工具 pngquant 可以将 1MB 的文件压缩到 400KB± 整体效果还是比较可观的,而且处理起来的成本并不高,因此这个 A 计划作为这个项目的首个版本会优先上线,后续增加对于 avif/webp 格式的尝试来进一步节省空间和流量,到时候会进一步分享这部分的经验。

安全性得分部分,根据测试结果的说明,可以较快确认解决方案:

  app.use(async (ctx, next) => {    ctx.set('Strict-Transport-Security', 'max-age=63072000')    ctx.set('X-XSS-Protection', '1; mode=block')    ctx.set('X-Frame-Options', 'DENY')    ctx.set('X-Content-Type-Options', 'nosniff')    await next()  })
<meta http-equiv="Content-Security-Policy" content="default-src https: http: 'self' 'unsafe-eval' 'unsafe-inline'; img-src data: https: http: 'unsafe-eval' 'unsafe-inline'; child-src https: http:; script-src https: http: 'unsafe-eval' 'unsafe-inline';">

应用上面的代码改动后,安全得分直接升级到 A

在后面测试过程中首屏加载时间指标在 A 和 B 之间反复出现,通过分析结果来看出现在 JavaScript 以及 CSS 文件过大,而这部分的优化则是一个相对复杂的过程,通过 webpack 打包的分析可以发现:

moment 以及 monent-timezone 是最大的那个包

前面 2 个 200KB+ 的包就是 moment 以及 momen t-timezone 真愁人,我查看了一下代码里具体是如何使用 moment 以及 moment-timezone 的,发现其实我们并不需要这么一个庞然大物来解决我们遇到的问题,本来还计划基于 Intl 来自己做一套满足要求的精简版本来替代 moment 以及 moment-timezone 不过在调研的过程中,发现了 luxon 

通过项目地址 moment.github.io/luxon 可以发现,其实也是出自 moment 团队的项目,这么一来不需要自己重复造轮子了,经过一些代码的改动,包括查阅文档,通过了完整的编译构建后,可以看看最终的结果:

优化了将近 200KB

对于 JavaScript 以及 CSS 的体积优化是一个相对中长期的过程,中间需要较多的代码整理、重构、甚至重新的技术选型。后面会继续做这方面的尝试和分享。

在使用 luxon 替换 moment 的过程中已经遇到了多处重复代码实现同样的逻辑,这种就需要遵循 DRY 原则将他们消灭掉。



扫描下方二维码添加「好未来技术」微信官方账号
进入好未来技术官方交流群与作者实时互动~
(若扫码无效,可通过微信号TAL-111111直接添加)
- 也许你还想看 -
场景编排技术模型
深入理解网络IO复用并发模型
好未来轻舟业务网关性能提升之旅

我知道你“在看”哟~


优网科技,优秀企业首选的互联网供应服务商

优网科技秉承"专业团队、品质服务" 的经营理念,诚信务实的服务了近万家客户,成为众多世界500强、集团和上市公司的长期合作伙伴!

优网科技成立于2001年,擅长网站建设、网站与各类业务系统深度整合,致力于提供完善的企业互联网解决方案。优网科技提供PC端网站建设(品牌展示型、官方门户型、营销商务型、电子商务型、信息门户型、微信小程序定制开发、移动端应用(手机站APP开发)、微信定制开发(微信官网、微信商城、企业微信)等一系列互联网应用服务。


我要投稿

姓名

文章链接

提交即表示你已阅读并同意《个人信息保护声明》

专属顾问 专属顾问
扫码咨询您的优网专属顾问!
专属顾问
马上咨询
联系专属顾问
联系专属顾问
联系专属顾问
扫一扫马上咨询
扫一扫马上咨询

扫一扫马上咨询

和我们在线交谈!