type
status
date
slug
summary
tags
category
titleIcon
password
icon
insider
结合PageSpeed insights分析定位问题并改善FCS,通过Cloudflare CDN与浏览器缓存加快访问速度,最终实现FCS从2.0s降到0.9s
优化动机
1.改善移动端首屏的加载时间,重点关注FCS指标
2.虽然部署包含Cloudflare CDN,但与netlify,vercel等部署的没有体现出差别,理应是CDN并没有起作用
3.部分文章的文档文件体积较大且未进行浏览器缓存,每次重新请求,容易成为瓶颈
移动端首屏原始表现附图



CDN未生效附图

浏览器缓存未生效附图
优化实践
移动端FCS改善
PageSpeed问题定位
- 由于HF Space的部署是限定Dockerfile的方式,所以在github的commit后需要重新factory rebuild,不适宜快速测试,过程中先以netlify的做效果展示
- 抓大头,定位到一个对渲染影响极大的的内容,与获取字体的请求有关

无效依赖修改
- 跳转代码中定位,是对东亚三国语言安装对应的Noto CJK衬线与非衬线字体

- 按照配置用的FONTS_SANS去搜,找到对应的字体选择,发现Noto CJK的几个字体排在特别后面,甚至在system-ui后面,这怎么fallback也到不了Noto CJK这块,算是dead fonts了,字体也得tree-shaking一下 )

- 重新检查网站上相关的字体设置,发现除了部分地方用到了IBM的字体,基本都是系统自带,且这个字体除了英文排列更紧密,没显得太多变化,于是同样删除

- 对其他依赖此对象的部分同样更新

检查修改是否可行
- 提交后检查网站中是否存在显示异常,基本都走本地系统字体,一般为微软雅黑,代码走Consolas,甚至网站唯一的平假名也能用微软雅黑正常显示



- 在不具备相同字体的移动端环境同样测试,正常工作
效果检验
- 修改结束,commit重测PageSpeed
- FCS从2.0s优化到1.3s


修改CF CDN/Worker配置
CF CDN调整过程
- F12检查请求中的CF缓存状态,发现是过期状态
- 查询发现,s-maxage是CF的CDN缓存时长,在没有进行额外操作的情况下查询为1,刷个新就过期了

- 打开CF对应域名的面板,找到Cache Rules,设置Edge TTL强制修改CDN缓存时长,顺带也把浏览器的缓存时长也改了

- 在另一浏览器里重新访问,尽管s-maxage仍为1,但已经被忽略,状态为HIT命中状态,其中CF-Ray指明Edge的区域,此处为SJC,美国,距离代理IP地理上较近


对比Netlify的海内外访问
- 先对比海外,以Dallas的US节点为参考
- 先Disable cache,检查发现Netlify Edge没有命中,最终是走到Origin命中Nextjs缓存,在Netlify Dashboard上没有看到直接缓存规则相关的设置,可以当做无CDN的原始速度来对比

- 以首页为benchmark,大概稳定在500-600ms的区间内

- 查看CF CDN状态,命中,地点在SJC,与测试的US节点对上

- 耗时在170~180范围内,偶尔跳到230左右

对比Netlify的国内访问
- Cache-Status相关状态仍然不变,结果仍为500ms-600ms左右

- CF命中,CDN位置在HKG,香港

- 耗时约80~100ms

对比Vercel海外访问
- 由于Vercel的域名校验需要上一级的控制权,比如对camelliav.cloudns.ch需要在cloudns.ch这一级加记录校验,而又不支持绑到xxx.camelliav.cloudns.ch(这样有其上一级控制权)这一级,所以只有海外对比,没有国内的
- 先检查Vercel,X-Vercel-Cache命中,CDN生效

- 几次测试结果大约在230-330间,偶有180,比CF的海外访问慢些




对比自身CDN前后
- 在CF的dashboard里purge everything清除所有CDN缓存

- 测试CF Cache MISS

- 出现几个600ms的耗时

- 再次请求后基本都控制在200出头

浏览器缓存
- 对于一部分文章的文档文件,由于



优化效果
- 移动端测试

其他结果



- PC端测试

其他结果







进一步改进:应用级缓存,取消协商缓存,取消首页的slug内容加载
开发体验:build时间











nobelium@1.3.0 analyse E:\Core\blog-merge\nobelium ANALYZE=true next build
'ANALYZE' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

可进一步的扩展
- 作者:CamelliaV
- 链接:https://camelliav.netlify.app/article/sblog-optimization
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章





.png?table=block&id=2b3ca147-5df8-80c8-94b3-f9c89b454622&t=2b3ca147-5df8-80c8-94b3-f9c89b454622)

.png?table=block&id=2b0ca147-5df8-80b5-aedb-d7a0d8d0aa7b&t=2b0ca147-5df8-80b5-aedb-d7a0d8d0aa7b)

.png?table=block&id=297ca147-5df8-80a2-add6-f5872a8c07d4&t=297ca147-5df8-80a2-add6-f5872a8c07d4)
.png?table=block&id=284ca147-5df8-802a-8753-ed1447e3c02e&t=284ca147-5df8-802a-8753-ed1447e3c02e)

