Skip to content

Commit 595dac4

Browse files
authored
[fix] improve split between Vite plugins (#8055)
1 parent 2114124 commit 595dac4

File tree

4 files changed

+141
-63
lines changed

4 files changed

+141
-63
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/kit': patch
3+
---
4+
5+
[fix] improve split between Vite plugins

packages/kit/src/exports/vite/build/utils.js

Lines changed: 55 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -108,47 +108,29 @@ export function resolve_symlinks(manifest, file) {
108108
}
109109

110110
/**
111-
* The Vite configuration that we use by default.
111+
* Partial Vite configuration that we use by default for setting up the build.
112+
* Can be used in a non-SvelteKit Vite server and build process such as Storybook.
112113
* @param {{
113114
* config: import('types').ValidatedConfig;
114-
* input: Record<string, string>;
115115
* ssr: boolean;
116-
* outDir: string;
117116
* }} options
118117
* @return {import('vite').UserConfig}
119118
*/
120-
export function get_default_build_config({ config, input, ssr, outDir }) {
119+
export function get_build_setup_config({ config, ssr }) {
121120
const prefix = `${config.kit.appDir}/immutable`;
122121

123122
return {
124-
appType: 'custom',
125-
base: ssr ? assets_base(config.kit) : './',
126123
build: {
127-
cssCodeSplit: true,
128124
// don't use the default name to avoid collisions with 'static/manifest.json'
129125
manifest: 'vite-manifest.json',
130-
outDir,
131-
rollupOptions: {
132-
input,
133-
output: {
134-
format: 'esm',
135-
entryFileNames: ssr ? '[name].js' : `${prefix}/[name]-[hash].js`,
136-
chunkFileNames: ssr ? 'chunks/[name].js' : `${prefix}/chunks/[name]-[hash].js`,
137-
assetFileNames: `${prefix}/assets/[name]-[hash][extname]`,
138-
hoistTransitiveImports: false
139-
},
140-
preserveEntrySignatures: 'strict'
141-
},
142-
ssr,
143-
target: ssr ? 'node14.8' : undefined
126+
ssr
144127
},
145128
define: {
146129
__SVELTEKIT_ADAPTER_NAME__: JSON.stringify(config.kit.adapter?.name),
147130
__SVELTEKIT_APP_VERSION_FILE__: JSON.stringify(`${config.kit.appDir}/version.json`),
148131
__SVELTEKIT_APP_VERSION_POLL_INTERVAL__: JSON.stringify(config.kit.version.pollInterval),
149132
__SVELTEKIT_EMBEDDED__: config.kit.embedded ? 'true' : 'false'
150133
},
151-
publicDir: ssr ? false : config.kit.files.assets,
152134
resolve: {
153135
alias: [...get_app_aliases(config.kit), ...get_config_aliases(config.kit)]
154136
},
@@ -170,6 +152,57 @@ export function get_default_build_config({ config, input, ssr, outDir }) {
170152
};
171153
}
172154

155+
/**
156+
* Partial Vite configuration that we use by default for setting up the build.
157+
* Cannot be used in a non-SvelteKit Vite server and build process such as Storybook.
158+
* @param {{
159+
* config: import('types').ValidatedConfig;
160+
* input: Record<string, string>;
161+
* ssr: boolean;
162+
* outDir: string;
163+
* }} options
164+
* @return {import('vite').UserConfig}
165+
*/
166+
export function get_build_compile_config({ config, input, ssr, outDir }) {
167+
const prefix = `${config.kit.appDir}/immutable`;
168+
169+
return {
170+
appType: 'custom',
171+
base: ssr ? assets_base(config.kit) : './',
172+
build: {
173+
cssCodeSplit: true,
174+
outDir,
175+
rollupOptions: {
176+
input,
177+
output: {
178+
format: 'esm',
179+
entryFileNames: ssr ? '[name].js' : `${prefix}/[name]-[hash].js`,
180+
chunkFileNames: ssr ? 'chunks/[name].js' : `${prefix}/chunks/[name]-[hash].js`,
181+
assetFileNames: `${prefix}/assets/[name]-[hash][extname]`,
182+
hoistTransitiveImports: false
183+
},
184+
preserveEntrySignatures: 'strict'
185+
},
186+
target: ssr ? 'node16.14' : undefined
187+
},
188+
publicDir: ssr ? false : config.kit.files.assets
189+
};
190+
}
191+
192+
/**
193+
* The Vite configuration that we use by default for building.
194+
* @param {{
195+
* config: import('types').ValidatedConfig;
196+
* input: Record<string, string>;
197+
* ssr: boolean;
198+
* outDir: string;
199+
* }} options
200+
* @return {import('vite').UserConfig}
201+
*/
202+
export function get_default_build_config(options) {
203+
return vite.mergeConfig(get_build_setup_config(options), get_build_compile_config(options));
204+
}
205+
173206
/**
174207
* @param {import('types').ValidatedKitConfig} config
175208
* @returns {string}

packages/kit/src/exports/vite/dev/index.js

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { posixify, resolve_entry, to_fs } from '../../../utils/filesystem.js';
1111
import { load_error_page, load_template } from '../../../core/config/index.js';
1212
import { SVELTE_KIT_ASSETS } from '../../../constants.js';
1313
import * as sync from '../../../core/sync/sync.js';
14-
import { get_mime_lookup, runtime_base, runtime_prefix } from '../../../core/utils.js';
14+
import { get_mime_lookup, runtime_prefix } from '../../../core/utils.js';
1515
import { compact } from '../../../utils/array.js';
1616
import { not_found } from '../utils.js';
1717

@@ -284,11 +284,6 @@ export async function dev(vite, vite_config, svelte_config) {
284284
}
285285
});
286286

287-
// set `import { version } from '$app/environment'`
288-
(await vite.ssrLoadModule(`${runtime_prefix}/env.js`)).set_version(
289-
svelte_config.kit.version.name
290-
);
291-
292287
return () => {
293288
const serve_static_middleware = vite.middlewares.stack.find(
294289
(middleware) =>
@@ -408,13 +403,6 @@ export async function dev(vite, vite_config, svelte_config) {
408403
`/${posixify(path.relative(cwd, `${svelte_config.kit.outDir}/generated/root.svelte`))}`
409404
);
410405

411-
const paths = await vite.ssrLoadModule(`${runtime_base}/paths.js`);
412-
413-
paths.set_paths({
414-
base: svelte_config.kit.paths.base,
415-
assets
416-
});
417-
418406
let request;
419407

420408
try {

packages/kit/src/exports/vite/index.js

Lines changed: 80 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
import { fork } from 'node:child_process';
22
import fs from 'node:fs';
33
import path from 'node:path';
4-
import colors from 'kleur';
4+
import { fileURLToPath } from 'node:url';
5+
56
import { svelte } from '@sveltejs/vite-plugin-svelte';
7+
import colors from 'kleur';
68
import * as vite from 'vite';
9+
710
import { mkdirp, posixify, resolve_entry, rimraf } from '../../utils/filesystem.js';
11+
import { SVELTE_KIT_ASSETS } from '../../constants.js';
12+
import { create_static_module, create_dynamic_module } from '../../core/env.js';
813
import * as sync from '../../core/sync/sync.js';
14+
import { create_assets } from '../../core/sync/create_manifest_data/index.js';
15+
import { runtime_base, runtime_directory, runtime_prefix, logger } from '../../core/utils.js';
16+
import { load_config } from '../../core/config/index.js';
17+
import { generate_manifest } from '../../core/generate_manifest/index.js';
918
import { build_server } from './build/build_server.js';
1019
import { build_service_worker } from './build/build_service_worker.js';
11-
import { load_config } from '../../core/config/index.js';
20+
import { find_deps, get_build_setup_config, get_build_compile_config } from './build/utils.js';
1221
import { dev } from './dev/index.js';
13-
import { generate_manifest } from '../../core/generate_manifest/index.js';
14-
import { runtime_directory, logger } from '../../core/utils.js';
15-
import { find_deps, get_default_build_config } from './build/utils.js';
22+
import { is_illegal, module_guard, normalize_id } from './graph_analysis/index.js';
1623
import { preview } from './preview/index.js';
1724
import { get_config_aliases, get_app_aliases, get_env } from './utils.js';
18-
import { fileURLToPath } from 'node:url';
19-
import { create_static_module, create_dynamic_module } from '../../core/env.js';
20-
import { is_illegal, module_guard, normalize_id } from './graph_analysis/index.js';
21-
import { create_assets } from '../../core/sync/create_manifest_data/index.js';
2225

2326
export { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
2427

@@ -168,7 +171,7 @@ function kit({ svelte_config }) {
168171
}
169172
});
170173

171-
return get_default_build_config({
174+
return get_build_compile_config({
172175
config: svelte_config,
173176
input,
174177
ssr: false,
@@ -200,8 +203,8 @@ function kit({ svelte_config }) {
200203
check_vite_version();
201204

202205
/** @type {import('vite').Plugin} */
203-
const plugin_build = {
204-
name: 'vite-plugin-sveltekit-build',
206+
const plugin_setup = {
207+
name: 'vite-plugin-sveltekit-setup',
205208

206209
/**
207210
* Build the SvelteKit-provided Vite config to be merged with the user's vite.config.js file.
@@ -226,7 +229,7 @@ function kit({ svelte_config }) {
226229
if (is_build) {
227230
manifest_data = (await sync.all(svelte_config, config_env.mode)).manifest_data;
228231

229-
const new_config = vite_client_build_config();
232+
const new_config = get_build_setup_config({ config: svelte_config, ssr: false });
230233

231234
const warning = warn_overridden_config(config, new_config);
232235
if (warning) console.error(warning + '\n');
@@ -252,20 +255,10 @@ function kit({ svelte_config }) {
252255
// dev and preview config can be shared
253256
/** @type {import('vite').UserConfig} */
254257
const result = {
255-
appType: 'custom',
256-
base: svelte_config.kit.paths.base,
257-
build: {
258-
rollupOptions: {
259-
// Vite dependency crawler needs an explicit JS entry point
260-
// eventhough server otherwise works without it
261-
input: `${runtime_directory}/client/start.js`
262-
}
263-
},
264258
define: {
265259
__SVELTEKIT_APP_VERSION_POLL_INTERVAL__: '0',
266260
__SVELTEKIT_EMBEDDED__: svelte_config.kit.embedded ? 'true' : 'false'
267261
},
268-
publicDir: svelte_config.kit.files.assets,
269262
resolve: {
270263
alias: [...get_app_aliases(svelte_config.kit), ...get_config_aliases(svelte_config.kit)]
271264
},
@@ -554,12 +547,68 @@ function kit({ svelte_config }) {
554547
fs.unlinkSync(`${paths.output_dir}/client/${vite_config.build.manifest}`);
555548
fs.unlinkSync(`${paths.output_dir}/server/${vite_config.build.manifest}`);
556549
}
550+
},
551+
552+
/**
553+
* @see https://vitejs.dev/guide/api-plugin.html#configureserver
554+
*/
555+
async configureServer(vite) {
556+
// set `import { version } from '$app/environment'`
557+
(await vite.ssrLoadModule(`${runtime_prefix}/env.js`)).set_version(
558+
svelte_config.kit.version.name
559+
);
560+
561+
// set `import { base, assets } from '$app/paths'`
562+
const { base, assets } = svelte_config.kit.paths;
563+
564+
(await vite.ssrLoadModule(`${runtime_base}/paths.js`)).set_paths({
565+
base,
566+
assets: assets ? SVELTE_KIT_ASSETS : base
567+
});
557568
}
558569
};
559570

560571
/** @type {import('vite').Plugin} */
561-
const plugin_middleware = {
562-
name: 'vite-plugin-sveltekit-middleware',
572+
const plugin_compile = {
573+
name: 'vite-plugin-sveltekit-compile',
574+
575+
/**
576+
* Build the SvelteKit-provided Vite config to be merged with the user's vite.config.js file.
577+
* @see https://vitejs.dev/guide/api-plugin.html#config
578+
*/
579+
async config(config, config_env) {
580+
// The config is created in build_server for SSR mode and passed inline
581+
if (config.build?.ssr) return;
582+
583+
if (config_env.command === 'build') {
584+
const new_config = vite_client_build_config();
585+
586+
const warning = warn_overridden_config(config, new_config);
587+
if (warning) console.error(warning + '\n');
588+
589+
return new_config;
590+
}
591+
592+
// dev and preview config can be shared
593+
/** @type {import('vite').UserConfig} */
594+
const result = {
595+
appType: 'custom',
596+
base: svelte_config.kit.paths.base,
597+
build: {
598+
rollupOptions: {
599+
// Vite dependency crawler needs an explicit JS entry point
600+
// eventhough server otherwise works without it
601+
input: `${runtime_directory}/client/start.js`
602+
}
603+
},
604+
publicDir: svelte_config.kit.files.assets
605+
};
606+
607+
const warning = warn_overridden_config(config, result);
608+
if (warning) console.error(warning);
609+
610+
return result;
611+
},
563612

564613
/**
565614
* Adds the SvelteKit middleware to do SSR in dev mode.
@@ -578,7 +627,7 @@ function kit({ svelte_config }) {
578627
}
579628
};
580629

581-
return [plugin_build, plugin_middleware];
630+
return [plugin_setup, plugin_compile];
582631
}
583632

584633
function check_vite_version() {
@@ -634,8 +683,12 @@ function warn_overridden_config(config, resolved_config) {
634683
* @param {string[]} out used locally to compute the return value
635684
*/
636685
function find_overridden_config(config, resolved_config, enforced_config, path, out) {
686+
if (config == null || resolved_config == null) {
687+
return out;
688+
}
689+
637690
for (const key in enforced_config) {
638-
if (typeof config === 'object' && config !== null && key in config) {
691+
if (typeof config === 'object' && key in config && key in resolved_config) {
639692
const enforced = enforced_config[key];
640693

641694
if (enforced === true) {
@@ -647,7 +700,6 @@ function find_overridden_config(config, resolved_config, enforced_config, path,
647700
}
648701
}
649702
}
650-
651703
return out;
652704
}
653705

0 commit comments

Comments
 (0)