Tidy up Service Worker, only run Workbox in production

Moves ServiceWorker load into Platform so its not done by Electron

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
This commit is contained in:
Michael Telatynski 2020-09-24 13:01:34 +01:00
parent 7b8010f23a
commit c47532fe2a
3 changed files with 97 additions and 86 deletions

View file

@ -28,11 +28,6 @@ require('highlight.js/styles/github.css');
import {parseQsFromFragment} from "./url_utils"; import {parseQsFromFragment} from "./url_utils";
import './modernizr'; import './modernizr';
// load service worker if available on this platform
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('service-worker.js');
}
async function settled(...promises: Array<Promise<any>>) { async function settled(...promises: Array<Promise<any>>) {
for (const prom of promises) { for (const prom of promises) {
try { try {

View file

@ -34,6 +34,17 @@ const POKE_RATE_MS = 10 * 60 * 1000; // 10 min
export default class WebPlatform extends VectorBasePlatform { export default class WebPlatform extends VectorBasePlatform {
private runningVersion: string = null; private runningVersion: string = null;
constructor() {
super();
// load service worker if available on this platform
// Service worker is disabled in development: https://github.com/GoogleChrome/workbox/issues/1790
if ('serviceWorker' in navigator && process.env.NODE_ENV === "production") {
navigator.serviceWorker.register('service-worker.js');
}
}
getHumanReadableName(): string { getHumanReadableName(): string {
return 'Web Platform'; // no translation required: only used for analytics return 'Web Platform'; // no translation required: only used for analytics
} }

View file

@ -31,6 +31,84 @@ module.exports = (env, argv) => {
const reactSdkSrcDir = path.resolve(require.resolve("matrix-react-sdk/package.json"), '..', 'src'); const reactSdkSrcDir = path.resolve(require.resolve("matrix-react-sdk/package.json"), '..', 'src');
const jsSdkSrcDir = path.resolve(require.resolve("matrix-js-sdk/package.json"), '..', 'src'); const jsSdkSrcDir = path.resolve(require.resolve("matrix-js-sdk/package.json"), '..', 'src');
const plugins = [
// This exports our CSS using the splitChunks and loaders above.
new MiniCssExtractPlugin({
filename: 'bundles/[hash]/[name].css',
ignoreOrder: false, // Enable to remove warnings about conflicting order
}),
// This is the app's main entry point.
new HtmlWebpackPlugin({
template: './src/vector/index.html',
// we inject the links ourselves via the template, because
// HtmlWebpackPlugin will screw up our formatting like the names
// of the themes and which chunks we actually care about.
inject: false,
excludeChunks: ['mobileguide', 'usercontent', 'jitsi'],
minify: argv.mode === 'production',
vars: {
og_image_url: og_image_url,
},
}),
// This is the jitsi widget wrapper (embedded, so isolated stack)
new HtmlWebpackPlugin({
template: './src/vector/jitsi/index.html',
filename: 'jitsi.html',
minify: argv.mode === 'production',
chunks: ['jitsi'],
}),
// This is the mobile guide's entry point (separate for faster mobile loading)
new HtmlWebpackPlugin({
template: './src/vector/mobile_guide/index.html',
filename: 'mobile_guide/index.html',
minify: argv.mode === 'production',
chunks: ['mobileguide'],
}),
// These are the static error pages for when the javascript env is *really unsupported*
new HtmlWebpackPlugin({
template: './src/vector/static/unable-to-load.html',
filename: 'static/unable-to-load.html',
minify: argv.mode === 'production',
chunks: [],
}),
new HtmlWebpackPlugin({
template: './src/vector/static/incompatible-browser.html',
filename: 'static/incompatible-browser.html',
minify: argv.mode === 'production',
chunks: [],
}),
// This is the usercontent sandbox's entry point (separate for iframing)
new HtmlWebpackPlugin({
template: './node_modules/matrix-react-sdk/src/usercontent/index.html',
filename: 'usercontent/index.html',
minify: argv.mode === 'production',
chunks: ['usercontent'],
}),
];
if (argv.mode === "production") {
plugins.push(new WorkboxPlugin.GenerateSW({
maximumFileSizeToCacheInBytes: 22000000,
runtimeCaching: [{
urlPattern: /i18n\/.*\.json$/,
handler: 'CacheFirst',
options: {
cacheName: 'i18n',
expiration: {
maxEntries: 2,
},
},
}],
}));
}
return { return {
...development, ...development,
@ -148,8 +226,8 @@ module.exports = (env, argv) => {
}, },
loader: 'babel-loader', loader: 'babel-loader',
options: { options: {
cacheDirectory: true cacheDirectory: true,
} },
}, },
{ {
test: /\.css$/, test: /\.css$/,
@ -160,7 +238,7 @@ module.exports = (env, argv) => {
options: { options: {
importLoaders: 1, importLoaders: 1,
sourceMap: true, sourceMap: true,
} },
}, },
{ {
loader: 'postcss-loader', loader: 'postcss-loader',
@ -198,7 +276,7 @@ module.exports = (env, argv) => {
"local-plugins": true, "local-plugins": true,
}, },
}, },
] ],
}, },
{ {
test: /\.scss$/, test: /\.scss$/,
@ -209,7 +287,7 @@ module.exports = (env, argv) => {
options: { options: {
importLoaders: 1, importLoaders: 1,
sourceMap: true, sourceMap: true,
} },
}, },
{ {
loader: 'postcss-loader', loader: 'postcss-loader',
@ -236,7 +314,7 @@ module.exports = (env, argv) => {
"local-plugins": true, "local-plugins": true,
}, },
}, },
] ],
}, },
{ {
test: /\.wasm$/, test: /\.wasm$/,
@ -294,83 +372,10 @@ module.exports = (env, argv) => {
}, },
], ],
}, },
] ],
}, },
plugins: [ plugins,
// This exports our CSS using the splitChunks and loaders above.
new MiniCssExtractPlugin({
filename: 'bundles/[hash]/[name].css',
ignoreOrder: false, // Enable to remove warnings about conflicting order
}),
// This is the app's main entry point.
new HtmlWebpackPlugin({
template: './src/vector/index.html',
// we inject the links ourselves via the template, because
// HtmlWebpackPlugin will screw up our formatting like the names
// of the themes and which chunks we actually care about.
inject: false,
excludeChunks: ['mobileguide', 'usercontent', 'jitsi'],
minify: argv.mode === 'production',
vars: {
og_image_url: og_image_url,
},
}),
// This is the jitsi widget wrapper (embedded, so isolated stack)
new HtmlWebpackPlugin({
template: './src/vector/jitsi/index.html',
filename: 'jitsi.html',
minify: argv.mode === 'production',
chunks: ['jitsi'],
}),
// This is the mobile guide's entry point (separate for faster mobile loading)
new HtmlWebpackPlugin({
template: './src/vector/mobile_guide/index.html',
filename: 'mobile_guide/index.html',
minify: argv.mode === 'production',
chunks: ['mobileguide'],
}),
// These are the static error pages for when the javascript env is *really unsupported*
new HtmlWebpackPlugin({
template: './src/vector/static/unable-to-load.html',
filename: 'static/unable-to-load.html',
minify: argv.mode === 'production',
chunks: [],
}),
new HtmlWebpackPlugin({
template: './src/vector/static/incompatible-browser.html',
filename: 'static/incompatible-browser.html',
minify: argv.mode === 'production',
chunks: [],
}),
// This is the usercontent sandbox's entry point (separate for iframing)
new HtmlWebpackPlugin({
template: './node_modules/matrix-react-sdk/src/usercontent/index.html',
filename: 'usercontent/index.html',
minify: argv.mode === 'production',
chunks: ['usercontent'],
}),
new WorkboxPlugin.GenerateSW({
runtimeCaching: [{
urlPattern: /i18n\/.*\.json$/,
handler: 'CacheFirst',
options: {
cacheName: 'i18n',
expiration: {
maxEntries: 2,
},
},
}],
}),
],
output: { output: {
path: path.join(__dirname, "webapp"), path: path.join(__dirname, "webapp"),