Skip to content

Commit f838dea

Browse files
committed
add sw-precache plugin, register service worker
1 parent de5793e commit f838dea

File tree

6 files changed

+361
-32
lines changed

6 files changed

+361
-32
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
"mockdate": "^2.0.2",
7979
"nodemon": "^1.12.0",
8080
"react-test-renderer": "^15.6.1",
81+
"sw-precache-webpack-plugin": "^0.11.4",
8182
"webpack": "^3.5.5",
8283
"webpack-dev-server": "^2.7.1"
8384
}

src/helpers/registerServiceWorker.js

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import React from 'react';
2+
3+
export default (ComposedComponent) => {
4+
return class RegisterServiceWorker extends React.Component {
5+
static displayName = `RegisterServiceWorker(${ComposedComponent.displayName})`
6+
7+
8+
async componentDidMount() {
9+
if (process.env.NODE_ENV === 'production') {
10+
if ('serviceWorker' in navigator) {
11+
navigator.serviceWorker
12+
.register('/service-worker.js')
13+
.then(registration => {
14+
console.log('service worker registration successful');
15+
})
16+
.catch(err => {
17+
console.warn('service worker registration failed');
18+
});
19+
}
20+
}
21+
}
22+
23+
render() {
24+
return (
25+
<ComposedComponent {...this.props} />
26+
);
27+
}
28+
}
29+
}

src/next.config.js

+21-18
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
const SWPrecacheWebpackPlugin = require("sw-precache-webpack-plugin");
12

23
module.exports = {
34
exportPathMap: function exportPathMap() {
@@ -33,23 +34,25 @@ module.exports = {
3334
// '/p/481': { page: '/post', query: { id: '481' } },
3435
};
3536
},
36-
// webpack: (config, { dev }) => {
37-
// // Perform customizations to webpack config
38-
// if (!dev) {
39-
// config.module.rules.push({
40-
// test: /\.(css|ico|gif)$/,
41-
// use: [
42-
// {
43-
// loader: 'file-loader',
44-
// options: {
45-
// outputPath: 'static/',
46-
// },
47-
// },
48-
// ],
49-
// });
50-
// }
37+
webpack: (config, { dev }) => {
38+
if (dev) {
39+
return config;
40+
}
5141

52-
// // Important: return the modified config
53-
// return config;
54-
// },
42+
config.plugins.push(
43+
new SWPrecacheWebpackPlugin({
44+
minify: true,
45+
verbose: true,
46+
staticFileGlobsIgnorePatterns: [/\.next\//],
47+
runtimeCaching: [
48+
{
49+
handler: 'networkFirst',
50+
urlPattern: /^https?.*/
51+
}
52+
]
53+
})
54+
);
55+
56+
return config;
57+
}
5558
};

src/pages/index.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import Main from '../layouts/Main';
66
import NewsFeed from '../components/presentational/NewsFeed';
77
import NewsFeedApolloHOC from '../components/container/NewsFeedWithApolloRenderer';
88
import withData from '../helpers/withData';
9+
import registerServiceWorker from '../helpers/registerServiceWorker';
910

1011
const POSTS_PER_PAGE = 30;
1112

@@ -45,7 +46,7 @@ const TopNewsFeed = graphql(query, {
4546
}),
4647
})(NewsFeedApolloHOC);
4748

48-
export default withData((props) => {
49+
export default withData(registerServiceWorker((props) => {
4950
const pageNumber = (props.url.query && +props.url.query.p) || 0;
5051
return (
5152
<Main currentURL={props.url.pathname}>
@@ -57,4 +58,4 @@ export default withData((props) => {
5758
/>
5859
</Main>
5960
);
60-
});
61+
}));

src/server.js

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import path from 'path';
12
import dotenv from 'dotenv/config';
23
import express from 'express';
34
import cookieParser from 'cookie-parser';
@@ -148,6 +149,11 @@ app.prepare()
148149
app.render(req, res, actualPage);
149150
});
150151

152+
server.get('/service-worker.js', (req, res) => {
153+
const swPath = path.join(__dirname, '.next', '/service-worker.js');
154+
app.serveStatic(req, res, swPath);
155+
})
156+
151157
server.get('*', (req, res) => handle(req, res));
152158

153159
/* END EXPRESS ROUTES */

0 commit comments

Comments
 (0)