๐ท Customize your service worker in create react app without npm run eject
Create-react-app provides built-in service-worker.js
but when you want to extend it
(e.g. to cache REST API response) you need to do npm run eject
and maintain more configs.
Sometimes we just want to enjoy customization but keep those big configs unchanged.
This cli tool helps you achieve this with ease.
https://sw-precache-cra-demo-cra-contributors.netlify.com/
A page caching GitHub API response with one simple config. Done in 4 steps
-
$ npm i -S sw-precache-cra
-
Edit the
build
script inpackage.json
There are 2 examples:
๐ก If you want your service worker cache API response with url /messages
:
concat the build script
"scripts": {
"start": "react-scripts start",
- "build": "react-scripts build",
+ "build": "react-scripts build && sw-precache-cra --config sw-config.js",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
with one additional js module having any sw-precache
configs:
// sw-config.js
module.exports = {
runtimeCaching: [
{
urlPattern: '/messages',
handler: 'networkFirst',
},
],
};
๐ You've got custom build/service-worker.js
after npm run build
๐ก If you want to have Non minified build/service-workder.js
you can do this:
"scripts": {
"start": "react-scripts start",
- "build": "react-scripts build",
+ "build": "react-scripts build && sw-precache-cra --no-minify",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
๐ You've got Un-minified build/service-worker.js
after npm run build
$ sw-precache-cra --list-config
# Print current config for sw-precache
# If you do not specify a config file, default config by CRA is printed
#
{ swFilePath: './build/service-worker.js',
cacheId: 'sw-precache-webpack-plugin',
dontCacheBustUrlsMatching: /\.\w{8}\./,
navigateFallback: '/index.html',
navigateFallbackWhitelist: [ /^(?!\/__).*/ ],
staticFileGlobsIgnorePatterns: [ /\.map$/, /asset-manifest\.json$/ ],
staticFileGlobs:
[ './build/**/**.html',
'./build/static/js/*.js',
'./build/static/css/*.css',
'./build/static/media/**' ],
stripPrefix: './build' }
For more APIs please do sw-precache-cra --help