Skip to content

Commit 5a31d04

Browse files
authored
feat: re-prebundle when config changed (#245)
1 parent fb5591f commit 5a31d04

File tree

4 files changed

+54
-1
lines changed

4 files changed

+54
-1
lines changed

.changeset/rare-crews-give.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/vite-plugin-svelte': minor
3+
---
4+
5+
Automatically re-prebundle when Svelte config changed for `experimental.prebundleSvelteLibraries`

packages/vite-plugin-svelte/src/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { ensureWatchedFile, setupWatchers } from './utils/watch';
1919
import { resolveViaPackageJsonSvelte } from './utils/resolve';
2020
import { PartialResolvedId } from 'rollup';
2121
import { toRollupError } from './utils/error';
22+
import { handleOptimizeDeps } from './utils/optimizer';
2223

2324
export function svelte(inlineOptions?: Partial<Options>): Plugin {
2425
if (process.env.DEBUG != null) {
@@ -69,6 +70,10 @@ export function svelte(inlineOptions?: Partial<Options>): Plugin {
6970
log.debug('resolved options', options);
7071
},
7172

73+
async buildStart() {
74+
await handleOptimizeDeps(options, viteConfig);
75+
},
76+
7277
configureServer(server) {
7378
// eslint-disable-next-line no-unused-vars
7479
options.server = server;
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import fs from 'fs';
2+
import path from 'path';
3+
import { optimizeDeps, ResolvedConfig } from 'vite';
4+
import { ResolvedOptions } from './options';
5+
6+
// List of options that changes the prebundling result
7+
const PREBUNDLE_SENSITIVE_OPTIONS: (keyof ResolvedOptions)[] = [
8+
'compilerOptions',
9+
'configFile',
10+
'experimental',
11+
'extensions',
12+
'ignorePluginPreprocessors',
13+
'preprocess'
14+
];
15+
16+
export async function handleOptimizeDeps(options: ResolvedOptions, viteConfig: ResolvedConfig) {
17+
if (!options.experimental.prebundleSvelteLibraries || !viteConfig.cacheDir) return;
18+
19+
const viteMetadataPath = path.resolve(viteConfig.cacheDir, '_metadata.json');
20+
21+
if (!fs.existsSync(viteMetadataPath)) return;
22+
23+
const svelteMetadataPath = path.resolve(viteConfig.cacheDir, '_svelte_metadata.json');
24+
const currentSvelteMetadata = JSON.stringify(generateSvelteMetadata(options), (_, value) => {
25+
return typeof value === 'function' ? value.toString() : value;
26+
});
27+
28+
if (fs.existsSync(svelteMetadataPath)) {
29+
const existingSvelteMetadata = fs.readFileSync(svelteMetadataPath, 'utf8');
30+
if (existingSvelteMetadata === currentSvelteMetadata) return;
31+
}
32+
33+
await optimizeDeps(viteConfig, true);
34+
fs.writeFileSync(svelteMetadataPath, currentSvelteMetadata);
35+
}
36+
37+
function generateSvelteMetadata(options: ResolvedOptions) {
38+
const metadata: Record<string, any> = {};
39+
for (const key of PREBUNDLE_SENSITIVE_OPTIONS) {
40+
metadata[key] = options[key];
41+
}
42+
return metadata;
43+
}

packages/vite-plugin-svelte/src/utils/watch.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ export function setupWatchers(
5454
});
5555
} else {
5656
log.info(`svelte config changed: restarting vite server. - file: ${filename}`);
57-
server.restart(!!options.experimental?.prebundleSvelteLibraries);
57+
server.restart();
5858
}
5959
};
6060

0 commit comments

Comments
 (0)