-
Notifications
You must be signed in to change notification settings - Fork 3
/
index.js
117 lines (104 loc) · 3.29 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
const path = require("path");
const crypto = require("crypto");
const glob = require("glob");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const WorkboxPlugin = require("workbox-webpack-plugin");
const getRevision = (file) =>
crypto.createHash("md5").update(Buffer.from(file)).digest("hex");
function withWorkbox(nextConfig = {}) {
return {
...nextConfig,
webpack(config, options) {
if (typeof nextConfig.webpack === "function") {
config = nextConfig.webpack(config, options);
}
const {
dev,
isServer,
config: {
workbox: {
additionalManifestEntries = [],
dest = "public",
dontCacheBustURLsMatching = false,
exclude = [],
force = false,
modifyURLPrefix = {},
swDest = "sw.js",
swSrc = false,
...workboxOptions
} = {},
},
} = options;
if (isServer) {
return config;
}
if (dev && !force) {
console.log("> Progressive Web App is disabled");
return config;
}
const swDestPath = path.join(options.dir, dest, swDest);
console.log("> Progressive web app is enabled using Workbox");
console.log(`> Service worker destination path: "${swDestPath}"`);
config.plugins.push(
new CleanWebpackPlugin({
cleanOnceBeforeBuildPatterns: [swDestPath, `${swDestPath}.map`],
})
);
const defaultDontCacheBustURLsMatching = /^\/_next\/static\/.*/iu;
const defaultWorkboxOptions = {
swDest: swDestPath,
dontCacheBustURLsMatching: dontCacheBustURLsMatching
? new RegExp(
`${dontCacheBustURLsMatching.source}|${defaultDontCacheBustURLsMatching.source}`,
"iu"
)
: defaultDontCacheBustURLsMatching,
additionalManifestEntries: glob
.sync("**/*", {
cwd: dest,
nodir: true,
})
.filter((f) => f.indexOf(swDest) !== 0)
.map((f) => ({
url: `/${f}`,
revision: getRevision(`public/${f}`),
}))
.concat(additionalManifestEntries),
exclude: [
/^build-manifest\.json$/i,
/^react-loadable-manifest\.json$/i,
/\/_error\.js$/i,
/\.js\.map$/i,
...exclude,
],
modifyURLPrefix: {
[`${config.output.publicPath || ""}static/`]: "/_next/static/",
...modifyURLPrefix,
},
};
if (swSrc) {
const swSrcPath = path.join(options.dir, swSrc);
console.log(`> Service worker source path: "${swSrcPath}"`);
console.log('> Using "WorkboxPlugin.InjectManifest" plugin');
config.plugins.push(
new WorkboxPlugin.InjectManifest({
swSrc: swSrcPath,
...defaultWorkboxOptions,
...workboxOptions,
})
);
} else {
console.log('> Using "WorkboxPlugin.GenerateSW" plugin');
config.plugins.push(
new WorkboxPlugin.GenerateSW({
...defaultWorkboxOptions,
...workboxOptions,
})
);
}
console.log("> Progressive web app configuration complete");
return config;
},
};
}
module.exports = withWorkbox;