Hugo cache-busting - Generate static assets hash filenames
What is cache busting?
Cache busting is a technique to load the assets from url instead of from the browser cache.
Caching is very useful to improve the performance of static assets like CSS javascript and image type files. These can be configured at the server to store these assets for a longer time and these will be expired within the time specified.
Websites used CDN to load static assets faster the reason is Static files are cached in CDN like Cloudflare.
There are some disadvantages to caching,
Whenever you update the static resources, cached resources are not loaded into web browsers.
The reason is cache assets are stored in CDN with an expiry time.
To avoid this, Cache busting is introduced.
There are many ways we can avoid Cache busting using the below approaches
- Adding version to static assets
For example, Style assets is a styles.css file declared in an HTML file as follows
<link rel="stylesheet" href="/assets/styles.css" crossorigin="anonymous" />
Adding version tag to style.css as follows
<link rel="stylesheet" href="/assets/styles.css?v=1" crossorigin="anonymous" />
Whenever styles are updated, you can increment the version, So that caching providers assume that files are updated and reloaded into the cache.
- Adding hash to filenames
The same replaces styles.css with styles-hash.css
.
<link
rel="stylesheet"
href="/assets/styles.4epmaklEYZOa.css"
integrity="sha512-4epmaklEYZOa"
crossorigin="anonymous"
/>
Hugo cache busting
Hugo provides a fingerprint
module to generate hashing It uses the default SHA-256
hash
Let’s generate hash-style file names using fingerprint
{{ $css := resources.Get "css/app.css" | resources.Fingerprint "sha512"}}
<link
rel="stylesheet"
href="{{ $css.Permalink }}"
integrity="{{ $css.Data.Integrity }}"
crossorigin="anonymous"
/>
integrity
is a security for a file to avoid modification to render in a browser. Permalink
is a variable to return the resource full path.
if you are using sass/scss files, you can use Hugo pipes
Hugo pipes are introduced to compile sass files into CSS files
{{ $options := (dict "targetPath" "main.css" "outputStyle" "compressed"
"includePaths" (slice "node_modules")) -}} {{ $css := resources.Get
"scss/app.scss" | toCSS $options }} {{ $secureCSS := $css |
resources.Fingerprint "sha512" -}}
<link
rel="stylesheet"
href="{{ $secureCSS.Permalink }}"
integrity="{{ $secureCSS.Data.Integrity }}"
crossorigin="anonymous"
/>
Options contain key and value pairs for conversion sass to CSS It compiles and generates hash CSS filenames.
how we can generate javascript hash filename
{{ $app := resources.Get "js/main.js" -}}
<script src="{{ $app.Permalink }}"></script>
With this, It will generate unique file names for static assets for every update to this.
Conclusion
In this tutorial, learn to generate unique hashing file names for static resources. It enables cache busting for Hugo CSS/sass styles javascript and image files.