loading...
Cover image for Cache-Reset with Webpack

Cache-Reset with Webpack

ckotzbauer profile image Christian Kotzbauer Updated on ・2 min read

Originally published on January 22, 2017

There are several strategies to implement a caching mechanism. The common way with Webpack is, to change the file
name and add a content-based hash. The advantage of this is, that the file only needs to be reloaded if its content
changed. But the disadvantage is (e.g. for images) that all references in your source-code have to be modified in
order to match the different file names, but this seems to be solvable. But what happens, if you start generating some paths
through variables at runtime? So I considered to use a fairly old mechanism: Cache-Busting with a Query-Parameter.
To append this parameter to all the code references, I wrote a custom webpack-loader.

Usage

First, install the loader through npm:

npm install cache-bust-loader

Assuming, that the list of loaders in your webpack.config.js looks similar to this:

[
  { test: /\.css$/, loader: ExtractTextPlugin.extract({ loader: 'css-loader' }) },
  { test: /\.html$/, loader: 'raw-loader' },
  { test: /\.ts$/, loader: 'awesome-typescript-loader' },
];

Now, simply add the cache-bust-loader to each file-type where you reference other files which you want to be cache-busted:

const cacheBustLoader = `cache-bust-loader?name=bust&value=${bustValue}`;

[
  { test: /\.css$/, loader: ExtractTextPlugin.extract({ loader: `${cacheBustLoader}!css-loader` }) },
  { test: /\.html$/, loader: `${cacheBustLoader}!raw-loader` },
  { test: /\.ts$/, loader: `${cacheBustLoader}!awesome-typescript-loader` },
];

The loader has three parameters:

Parameter Mandatory Data type Default value
name True String
value False String
types False String eot;woff;woff2;svg;ttf;otf;jpg;jpeg;png;ico;gif;json

The name describes the name of the query parameter, the value the string which should change every build.
If the value is empty, no parameters are applied (e.g. in development mode). The types are file-types
which you want to be cache-busted. Split them with a semicolon.

To generate a short unique string for each build you can fill bustValue like this:

bustValue = require('randomstring').generate(5);

Result

Open your browser-network-tab:
network-tab

Conclusion

This webpack-loader makes it easy to implement a basic cache-reset mechanism. All files matching the file-type have the query-parameter appended
and are reloaded if a new version of your frontend-project is deployed.

Found a typo?

If you've found a typo, a sentence that could be improved or anything else that should be updated on this blog post, you can access it through a git repository and make a pull request. Instead of posting a comment, please go directly to https://github.com/ckotzbauer/dev.to-posts and open a new pull request with your changes.

Posted on Jun 13 by:

ckotzbauer profile

Christian Kotzbauer

@ckotzbauer

Web Developer working with TypeScript and Aurelia. Interested in Node.js, Security, Docker and Kubernetes.

Discussion

markdown guide