Categorygithub.com/benbjohnson/hashfs
modulepackage
0.2.2
Repository: https://github.com/benbjohnson/hashfs.git
Documentation: pkg.go.dev

# README

hashfs

Implementation of io/fs.FS that appends SHA256 hashes to filenames to allow for aggressive HTTP caching.

For example, given a file path of scripts/main.js, the hashfs.FS filesystem will provide the server with a hashname of scripts/main-b633a..d628.js (the hash is truncated for brevity in the example). When this file path is requested by the client, the server can verify the hash and return the contents with an aggressive Cache-Control header. The client will cache this file for up to a year and does not need to re-request it in the future.

Note that this library requires Go 1.16 or higher.

Usage

To use hashfs, first wrap your embed.FS in a hashfs.FS filesystem:

//go:embed scripts stylesheets images
var embedFS embed.FS

var fsys = hashfs.NewFS(embedFS)

Then attach a hashfs.FileServer() to your router:

http.Handle("/assets/", http.StripPrefix("/assets/", hashfs.FileServer(fsys)))

Next, your html templating library can obtain the hashname of your file using the hashfs.FS.HashName() method:

func renderHTML(w io.Writer) {
	fmt.Fprintf(w, `<html>`)
	fmt.Fprintf(w, `<script src="/assets/%s"></script>`, fsys.HashName("scripts/main.js"))
	fmt.Fprintf(w, `</html>`)
}

# Functions

FileServer returns an http.Handler for serving FS files.
FormatName returns a hash name that inserts hash before the filename's extension.
ParseName splits formatted hash filename into its base & hash components.

# Structs

FS represents an fs.FS file system that can optionally use content addressable hashes in the filename.