Skip to content

Commit d98a050

Browse files
tepivursen
andauthored
refactor: use Vite official API for building sw.js (#20894) (CP: 24.5) (#20916)
* refactor: use Vite official API for building sw.js (#20894) * fix: fix service worker build * fix PwaTestIT * exclude sw.js from manifest * generate service worker at closeBundle stage * clean up service worker build config * generate service worker at different stages depending on mode * do not use lib mode to allow for minification in es format * clean up plugin code * add inlineDynamicImports: true option * revert some changes to minimize diff * add exports option for backward compatibility --------- Co-authored-by: Teppo Kurki <teppo.kurki@vaadin.com> * Update vite.generated.ts --------- Co-authored-by: Sergey Vinogradov <mr.vursen@gmail.com>
1 parent b676d6f commit d98a050

File tree

2 files changed

+39
-72
lines changed

2 files changed

+39
-72
lines changed

flow-server/src/main/resources/vite.generated.ts

Lines changed: 38 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,18 @@ import settings from '#settingsImport#';
1616
import {
1717
AssetInfo,
1818
ChunkInfo,
19+
build,
1920
defineConfig,
2021
mergeConfig,
2122
OutputOptions,
2223
PluginOption,
23-
ResolvedConfig,
24+
InlineConfig,
2425
UserConfigFn
2526
} from 'vite';
2627
import { getManifest, type ManifestTransform } from 'workbox-build';
2728

2829
import * as rollup from 'rollup';
2930
import brotli from 'rollup-plugin-brotli';
30-
import replace from '@rollup/plugin-replace';
3131
import checker from 'vite-plugin-checker';
3232
import postcssLit from '#buildFolder#/plugins/rollup-plugin-postcss-lit-custom/rollup-plugin-postcss-lit.js';
3333

@@ -106,7 +106,7 @@ function injectManifestToSWPlugin(): rollup.Plugin {
106106
const { manifestEntries } = await getManifest({
107107
globDirectory: buildOutputFolder,
108108
globPatterns: ['**/*'],
109-
globIgnores: ['**/*.br'],
109+
globIgnores: ['**/*.br', 'pwa-icons/**', 'sw.js'],
110110
manifestTransforms: [rewriteManifestIndexHtmlUrl],
111111
maximumFileSizeToCacheInBytes: 100 * 1024 * 1024 // 100mb,
112112
});
@@ -118,87 +118,54 @@ function injectManifestToSWPlugin(): rollup.Plugin {
118118
}
119119

120120
function buildSWPlugin(opts: { devMode: boolean }): PluginOption {
121-
let config: ResolvedConfig;
121+
let buildConfig: InlineConfig;
122122
const devMode = opts.devMode;
123123

124-
const swObj: { code?: string, map?: rollup.SourceMap | null } = {};
125-
126-
async function build(action: 'generate' | 'write', additionalPlugins: rollup.Plugin[] = []) {
127-
const includedPluginNames = [
128-
'vite:esbuild',
129-
'rollup-plugin-dynamic-import-variables',
130-
'vite:esbuild-transpile',
131-
'vite:terser'
132-
];
133-
const plugins: rollup.Plugin[] = config.plugins.filter((p) => {
134-
return includedPluginNames.includes(p.name);
135-
});
136-
const resolver = config.createResolver();
137-
const resolvePlugin: rollup.Plugin = {
138-
name: 'resolver',
139-
resolveId(source, importer, _options) {
140-
return resolver(source, importer);
141-
}
142-
};
143-
plugins.unshift(resolvePlugin); // Put resolve first
144-
plugins.push(
145-
replace({
146-
values: {
147-
'process.env.NODE_ENV': JSON.stringify(config.mode),
148-
...config.define
149-
},
150-
preventAssignment: true
151-
})
152-
);
153-
if (additionalPlugins) {
154-
plugins.push(...additionalPlugins);
155-
}
156-
const bundle = await rollup.rollup({
157-
input: path.resolve(settings.clientServiceWorkerSource),
158-
plugins
159-
});
160-
161-
try {
162-
return await bundle[action]({
163-
file: path.resolve(buildOutputFolder, 'sw.js'),
164-
format: 'es',
165-
exports: 'none',
166-
sourcemap: config.command === 'serve' || config.build.sourcemap,
167-
inlineDynamicImports: true
168-
});
169-
} finally {
170-
await bundle.close();
171-
}
172-
}
173-
174124
return {
175125
name: 'vaadin:build-sw',
176126
enforce: 'post',
177-
async configResolved(resolvedConfig) {
178-
config = resolvedConfig;
127+
async configResolved(viteConfig) {
128+
buildConfig = {
129+
base: viteConfig.base,
130+
root: viteConfig.root,
131+
mode: viteConfig.mode,
132+
resolve: viteConfig.resolve,
133+
define: {
134+
...viteConfig.define,
135+
'process.env.NODE_ENV': JSON.stringify(viteConfig.mode),
136+
},
137+
build: {
138+
minify: viteConfig.build.minify,
139+
outDir: viteConfig.build.outDir,
140+
sourcemap: viteConfig.command === 'serve' || viteConfig.build.sourcemap,
141+
emptyOutDir: false,
142+
modulePreload: false,
143+
rollupOptions: {
144+
input: {
145+
sw: settings.clientServiceWorkerSource
146+
},
147+
output: {
148+
exports: 'none',
149+
entryFileNames: 'sw.js',
150+
inlineDynamicImports: true,
151+
},
152+
},
153+
},
154+
};
179155
},
180156
async buildStart() {
181157
if (devMode) {
182-
const { output } = await build('generate');
183-
swObj.code = output[0].code;
184-
swObj.map = output[0].map;
185-
}
186-
},
187-
async load(id) {
188-
if (id.endsWith('sw.js')) {
189-
return '';
190-
}
191-
},
192-
async transform(_code, id) {
193-
if (id.endsWith('sw.js')) {
194-
return swObj;
158+
await build(buildConfig);
195159
}
196160
},
197161
async closeBundle() {
198162
if (!devMode) {
199-
await build('write', [injectManifestToSWPlugin(), brotli()]);
163+
await build({
164+
...buildConfig,
165+
plugins: [injectManifestToSWPlugin(), brotli()]
166+
});
200167
}
201-
}
168+
},
202169
};
203170
}
204171

flow-tests/test-pwa/src/test/java/com/vaadin/flow/pwatest/ui/PwaTestIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ public void testPwaResources() throws IOException {
129129
Assert.assertTrue(
130130
"Expected sw-runtime-resources-precache.js to be imported, but was not",
131131
serviceWorkerJS.contains(
132-
"importScripts(\"sw-runtime-resources-precache.js\");"));
132+
"importScripts(\"sw-runtime-resources-precache.js\")"));
133133

134134
serviceWorkerUrl = getRootURL() + "/sw-runtime-resources-precache.js";
135135
serviceWorkerJS = readStringFromUrl(serviceWorkerUrl);

0 commit comments

Comments
 (0)