我的博客又变快了:Cloudflare Workers 与 AVIF 支持
原文由 Matthias Endler 于 发布,订阅该博客

原因有这么几条(从常规操作到初现偏执):
- 📄 静态网站
- ☁️ 通过 Cloudflare CDN 缓存
- 🔗 支持 HTTP/2 与 HTTP/3
- 🚫 无网页字体(可惜了)
- ✅ 基于 Edge Worker 的统计分析(不用 Google Analytics)
- 🌸 尽可能避免使用 JavaScript;90% 的场景用 CSS 就能搞定。
- 🖼️ 在 HTML 中指定图片宽高,避免页面回流。
- 👍🏻 内联、经过优化的 SVG 图形和手写的 CSS
- 🚅 静态 WASM 搜索(懒加载)
- 🏎️ 整个首页(含图形)经 Brotli 压缩后不到 10K,应该能放进首个 HTTP 往返里。
- 💟 就连 favicon 都做了体积优化。更新:多亏了这篇文章,现在我改用 SVG 图标了。
不过话说回来,都 2020 年了:人人都在优化自己的 favicon,对吧?…对吧!?
结果发现,大多数其他网站根本不像我这么在意用户的流量套餐。实际上,这么说都算客气了:他们完全不在乎。但对我来说,精简即是美!
等等,图片怎么办?
我更喜欢用 SVG 来做图表和插图。只有是照片时,才会用 JPEG 或 WebP。
老实说,我从来不太喜欢 WebP。简单来说,用 MozJPEG 压缩的 JPEG 甚至可能比它更小。想了解更多可以看看 Mozilla bug tracker 上的长篇争论。直到今天,Safari 仍不支持 WebP。
你好,AVIF 👋
来认识一下 AVIF,新一代图像压缩格式。看看这个:
它已经被 Chrome 85 和 Firefox 80 支持了。
然后我就像被飓风击中了一样 🌪️:
😲 天哪,主流浏览器现在都支持 AVIF 了!?
我也想给博客用上!
算是吧,也不完全是。
我的博客用的是 Zola,而 Zola 对 AVIF 的支持还没跟上,但我现在就想要!于是我就随手写了个简陋的 Rust 脚本(常规操作),把旧的 JPEG 和 PNG 转成 AVIF。原始文件我也留着,以防万一。
底层调用的是 Kornel Lesiński 写的 cavif。
节省了多少流量
检查一下你的浏览器
不过先等等……你的浏览器真的能显示 AVIF 吗?

如果上面显示的是“yup”,那就没问题了。
如果显示的是“nope”,你可以试试这几个办法:
- Firefox:在地址栏打开
about:config并搜索avif。 - Chrome:确保已更新到最新版本。
- Safari:不知道你是怎么想的。换个正经浏览器试试吧。😏
变通方案一:为旧浏览器提供回退
HTML 有个好处,浏览器会忽略不认识的新语法。所以我可以用 <picture> 元素为你提供合适的格式。(看,没有 JavaScript!)
<picture>
<source srcset="fancy_browser.avif" />
<source srcset="decent_browser.webp" />
<img src="meh_browser.jpg" />
</picture>实际代码要复杂一些,不过你懂意思就行。
变通方案二:Github Pages 上错误的 Content-Type
不过,Github 和 AVIF 之间有个棘手的问题:他们的服务器返回的是 Content-Type: application/octet-stream 响应头。
这导致图片在 Firefox 上无法加载。
由于页面托管在 Github 上,我这边没法修复这个问题。直到现在!我早就想试试 Cloudflare 的 Workers Sites,这个 bug 终于让我下定决心切换。简单来说,我把整个网站作为 Edge Worker 直接跑在 CDN 上,不再需要自己的服务器。好处是,现在网站在任何地方都很快——即使在偏远地区——不再需要往返源站。
通过运行 Edge Worker,我还获得了对请求和响应对象的完全控制。我加了这样一段小巧的代码来拦截 Worker 的响应:
if (/\.avif$/.test(url)) {
response.headers.set("Content-Type", "image/avif");
response.headers.set("Content-Disposition", "inline");
}搞定,大功告成。Firefox 也正常了。你可以在这里了解更多关于修改响应对象的内容。
Workers Sites 的另一个附带好处是,现在生产环境部署只需一分钟。
迁移到 Cloudflare 后的性能表现

来源:KeyCDN

来源:KeyCDN

来源:Pingdom.com

来源:Pingdom.com
和知名网站对比,我也不落下风:

来源:Speedcurve
延伸阅读
- How to Use AVIF: The New Next-Gen Image Compression Format — 一篇不错的入门文章,指出了集成 AVIF 时的一些常见坑。正是它启发我加上了 AVIF 支持。
- AVIF has landed,作者 Jake Archibald — 对比了不同格式的图片体积与质量:SVG、JPEG、PNG、WebP 和 AVIF。
- avif.io — 快速、可配置、支持桌面和移动端的客户端图片压缩工具。
- Squoosh — 另一个基于 WebAssembly 构建、支持 AVIF 的图片压缩服务
- 大量关于如何配置 Cloudflare Workers 的精彩示例
- Cloudflare Workers Sites
随机一篇博客
评论
登录后参与讨论