I am using ServiceWorker and in dev mode works perfectly, my problem is that in production mode my bundle name is generated using hash, e.g. 1234das3123ad5.bundle.js
, so the service worker is not caching it. My sw code looks like:
self.addEventListener('install', function(event) {
// pre cache a load of stuff:
event.waitUntil(
caches.open('mycache').then(function(cache) {
return cache.addAll([
'/dist/bundle.js',
'/dist/app.css',
'/dist/index.html',
'https://cdnjs.cloudflare.com/ajax/libs/antd/2.7.2/antd.css'
]);
})
)
});
In the docs of Cache API I dont see any example on how I can achieve that.
Obviously I could cache everything under the dist
folder, having something like:
self.addEventListener('install', function(event) {
// pre cache a load of stuff:
event.waitUntil(
caches.open('mycache').then(function(cache) {
return cache.addAll([
'/dist/',
]);
})
)
});
But I dont find it an elegant, good in long term, solution. Is it a way to have wild cards in the Cache? Something like '/dist/*.bundle.js'
?
Solution. Coming to the solution, It has a really simple solution. You just change the CACHE_NAME and the cacheWhitelist array. Like that on every update, you can keep changing these and the previous cache on your user's website will be deleted and the new version will be stored in the new cache.
match() The match() method of the Cache interface returns a Promise that resolves to the Response associated with the first matching request in the Cache object. If no match is found, the Promise resolves to undefined .
here's a simple Node script that will create the array of filenames for you, provided you want a list of every file in your web/public directory. NOTE: you want to run this from a terminal at your public
directory.
var fs = require('fs');
var path = require('path');
var util = require('util');
var walk = function(dir, done) {
var results = [];
fs.readdir(dir, function(err, list) {
if (err) return done(err);
var i = 0;
(function next() {
var file = list[i++];
if (!file) return done(null, results);
//file = dir + '/' + file;
file = path.resolve(dir, file);
fs.stat(file, function(err, stat) {
if (stat && stat.isDirectory()) {
walk(file, function(err, res) {
results = results.concat(res);
next();
});
}
else {
file = file.replace('/home/ubuntu/workspace/public', '');
results.push(file);
next();
}
});
})();
});
};
var mydir = path.resolve(__dirname);
walk(mydir, function(err, results) {
if (err) throw err;
console.log(util.inspect(results, { maxArrayLength: null }));
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With