tl;dr; The old /favicon.ico
was 15KB and due to bad caching was downloaded 24M times in the last month totaling ~350GB of server-to-client traffic which can almost all be avoided.
How to save the planet? Well, do something you can do, they say. Ok, what I can do is to reduce the amount of electricity consumed to browse the web. Mozilla MDN Web Docs, which I work on, has a lot of traffic from all over the world. In the last 30 days, we have roughly 70M pageviews across roughly 15M unique users.
A lot of these people come back to MDN more than once per month so good assets and good asset-caching matter.
I found out that somehow we had failed to optimize the /favicon.ico
asset! It was 15,086 bytes when, with Optimage, I was quickly able to turn it down to 1,153 bytes. That's a 13x improvement! Here's what that looks like when zoomed in 4x:
The next challenge was the Cache-Control
. Our CDN is AWS Cloudfront and it respects whatever Cache-Control
headers we set on the assets. Because favicon.ico
doesn't have a unique hash in its name, the Cache-Control
falls back to the default of 24 hours (max-age=86400) which isn't much. Especially for an asset that almost never changes and besides, if we do decide to change the image (but not the name) we'd have to wait a minimum of 24 hours until it's fully rolled out.
Another thing I did as part of this was to stop assuming the default URL of /favicon.ico
and instead control it with the <link rel="shortcut icon" href="/favicon.323ad90c.ico" type="image/x-icon">
HTML meta tag. Now I can control the URL of the image that will be downloaded.
Our client-side code is based on create-react-app
and it can't optimize the files in the client/public/
directory.
So I wrote a script that post-processes the files in client/build/
. In particular, it looks through the index.html
template and replaces...
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
...with...
<link rel="shortcut icon" href="/favicon.323ad90c.ico" type="image/x-icon">
Plus it makes a copy of the file with this hash in it so that the old URL still resolves. But now can cache it much more aggressively. 1 year in fact.
In summary
Combined, we used to have ~350GB worth of data sent from our CDN(s) to people's browsers every month.
Just changing the image itself would turn that number to ~25GB instead.
The new Cache-Control hopefully means that all those returning users can skip the download on a daily basis which will reduce the amount of network usage even more, but it's hard to predict in advance.
Comments