WebP or JPEG in an AWS/S3 website
Serving WebP on S3
Part of why I built this site is so I can share the moments
everytime
I go and shoot sunrise. I want people,
especially
my family and friends, to see how beautiful the world is
and so
that they too can enjoy what I've seen that morning or
evening
(if it's a sunset shoot).
Recently, my other half complainedtold me that
she's unable to
view my pics because her internet is too
slow. For me this was just
unacceptable because I want her to
see my photos too, especially since
we're in an LDR. And
since I thought the images are already small and
have already
exhausted all the image optimization techniques I could
think
of, where else do I go from here?
Enter WebP.
Playing around with WebP and figuring out how much savings I'd
get by
serving WebP images in addition to JPG, the space and
time savings I
saw was just fantastic from an optimization
perspective. Some of the
images even compress to as much as 50%
from the original JPG. Multiply
those savings to the number of
photos I have now and in the future,
that's a huge win in
terms of page load time and web hosting cost. So
it definitely
convinced me that I really need to serve WebP alongside
JPG.
But how? AWS S3/Cloudfront is
great but
it doesn't support Content Negotiation if your
site is being served
from an S3 bucket such as this one. I
surely don't want a backend
server because that defeats
having a cost-effective site in the first
place.
Enter the <picture> element.
The <picture> element is a new HTML5 element
created to
support responsive images on the web and is also
great for art
direction. It allows you to use the
powerful
img srcset
in a very flexible
way. But another benefit and advantage of
the picture element is its
availability to serve different
types of image formats according to
your needs via the
<source> type attribute . Since
it's
basically markup, all you need to do is to add
type="image/webp" to the
<source>
element and the browser takes care of serving the
necessary
image type as per the image types the browser supports. No
need
to launch a backend server instance just so you can serve
WebP.
Since <picture> is still new, I suggest that you use
a
polyfill such as
picturefill
so you can use
the <picture> element today!