aboutsummaryrefslogtreecommitdiff
path: root/content/posts/2022-01-28-media-shrinkage.md
blob: b89f06468c877a1ba4e42478c75d674032e753b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
---
slug: media-shrinkage
title: "Media Shrinkage"
date: "2022-01-28T08:54:25-04:00"

tables:
  shrinkage:
    cols:
      - id: "text"
        name: "Description"
      - id: "size"
        name: "Total Size (kB)"
        tip: "Total size, in kilobytes."
        align: "right"
      - id: "percent"
        name: "Reduction (%)"
        tip: "Size reduction relative to baseline."
        align: "right"
    rows:
      - text: "Baseline uncached front page load"
        size: "596 kB"
        percent: "0%"
      - text: "WebP and minified SVGs"
        size: "324 kB"
        percent: "45%"
      - text: "WebP, minified SVGs, and `mod_deflate` update"
        size: "**185 kB**"
        percent: "**68%**"
---

Recently I made the following site improvements:

1. Minified [SVGs][svg] with [minify][].
2. Created lossless [WebPs][webp] of [PNGs][png] in recent content.
3. Created a [Hugo shortcode][shortcode] for the [`<picture>`][picture]
   element wrapped in a [`<figure>`][figure].
5. Updated bitmap images in recent content to default to [WebP][] with a
   fallback to [PNG][] ([progressive enhancement][]).
6. Configured [`mod_deflate`][mod_deflate] to compress [SVGs][svg].

### Results

68% cumulative reduction the total size of an uncached front page load
in [Chrome][]:

{{< table "shrinkage" >}}

### Notes

* I also investigated [AVIF][].  Better compression than [WebP][], worse
  tool and browser support.  Will investigate again later.
* Convert [PNG][] to lossless [WebP][] with [Imagemagick][]:
  `convert -quality 100 -define webp:lossless=true src.png dst.png`
* [Apache][] [`mod_deflate`][mod_deflate] config:
  `AddOutputFilterByType image/svg+xml`
* [Debian][]: Add `image/webp webp` to `/etc/mime.types`.

[svg]: https://en.wikipedia.org/wiki/Scalable_Vector_Graphics
  "Scalable Vector Graphics"
[minify]: https://github.com/tdewolff/minify/tree/master/cmd/minify
  "Command-line SVG, JavaScript, HTML, and CSS minifier."
[webp]: https://en.wikipedia.org/wiki/WebP
  "WebP image format."
[png]: https://en.wikipedia.org/wiki/Portable_Network_Graphics
  "Portable Network Graphics"
[shortcode]: https://gohugo.io/content-management/shortcodes/
  "Simple snippets in content files calling built-in or custom templates"
[figure]: https://gohugo.io/content-management/shortcodes/#figure
  "Hugo figure shortcode"
[progressive enhancement]: https://en.wikipedia.org/wiki/Progressive_enhancement
  "Progressive enhancement"
[picture]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture
  "picture HTML element"
[figure]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/figure
  "figure HTML element"
[mod_deflate]: https://httpd.apache.org/docs/current/mod/mod_deflate.html
  "Apache DEFLATE output filter."
[chrome]: https://www.google.com/chrome
  "Google Chrome web browser."
[avif]: https://en.wikipedia.org/wiki/AVIF
  "AV1 Image Format"
[debian]: https://www.debian.org/
  "Debian Linux distribution."
[imagemagick]: https://imagemagick.org/
  "Command-line image conversion tools."
[apache]: https://httpd.apache.org/
  "Apache web server."