Skip to content

Commit 504f8e9

Browse files
committed
[fix] enable Vite pre-bundling except for Svelte packages
1 parent 54fdedb commit 504f8e9

File tree

4 files changed

+70
-44
lines changed

4 files changed

+70
-44
lines changed

.changeset/cuddly-files-decide.md

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] enable Vite pre-bundling except for Svelte packages

packages/kit/src/core/build/index.js

Lines changed: 51 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import fs from 'fs';
22
import path from 'path';
33
import { rimraf } from '../filesystem/index.js';
44
import create_manifest_data from '../../core/create_manifest_data/index.js';
5-
import { copy_assets, get_no_external, posixify, resolve_entry } from '../utils.js';
5+
import { copy_assets, get_svelte_packages, posixify, resolve_entry } from '../utils.js';
66
import { deep_merge, print_config_conflicts } from '../config/index.js';
77
import { create_app } from '../../core/create_app/index.js';
88
import vite from 'vite';
@@ -33,6 +33,7 @@ export async function build(config, { cwd = process.cwd(), runtime = '@sveltejs/
3333
rimraf(build_dir);
3434

3535
const output_dir = path.resolve(cwd, `${SVELTE_KIT}/output`);
36+
const svelte_packages = get_svelte_packages(cwd);
3637

3738
const options = {
3839
cwd,
@@ -49,7 +50,8 @@ export async function build(config, { cwd = process.cwd(), runtime = '@sveltejs/
4950
}),
5051
output_dir,
5152
client_entry_file: `${SVELTE_KIT}/build/runtime/internal/start.js`,
52-
service_worker_entry_file: resolve_entry(config.kit.files.serviceWorker)
53+
service_worker_entry_file: resolve_entry(config.kit.files.serviceWorker),
54+
svelte_packages
5355
};
5456

5557
const client_manifest = await build_client(options);
@@ -132,7 +134,7 @@ async function build_client({
132134
});
133135

134136
/** @type {any} */
135-
const user_config = config.kit.vite();
137+
const vite_config = config.kit.vite();
136138

137139
const default_config = {
138140
server: {
@@ -143,10 +145,10 @@ async function build_client({
143145
};
144146

145147
// don't warn on overriding defaults
146-
const [modified_user_config] = deep_merge(default_config, user_config);
148+
const [modified_vite_config] = deep_merge(default_config, vite_config);
147149

148150
/** @type {[any, string[]]} */
149-
const [merged_config, conflicts] = deep_merge(modified_user_config, {
151+
const [merged_config, conflicts] = deep_merge(modified_vite_config, {
150152
configFile: false,
151153
root: cwd,
152154
base,
@@ -203,6 +205,7 @@ async function build_client({
203205
* output_dir: string;
204206
* client_entry_file: string;
205207
* service_worker_entry_file: string | null;
208+
* svelte_packages: string[];
206209
* }} options
207210
* @param {ClientManifest} client_manifest
208211
* @param {string} runtime
@@ -216,7 +219,8 @@ async function build_server(
216219
build_dir,
217220
output_dir,
218221
client_entry_file,
219-
service_worker_entry_file
222+
service_worker_entry_file,
223+
svelte_packages
220224
},
221225
client_manifest,
222226
runtime
@@ -419,8 +423,8 @@ async function build_server(
419423
.trim()
420424
);
421425

422-
/** @type {any} */
423-
const user_config = config.kit.vite();
426+
/** @type {import('vite').UserConfig} */
427+
const vite_config = config.kit.vite();
424428

425429
const default_config = {
426430
server: {
@@ -431,10 +435,10 @@ async function build_server(
431435
};
432436

433437
// don't warn on overriding defaults
434-
const [modified_user_config] = deep_merge(default_config, user_config);
438+
const [modified_vite_config] = deep_merge(default_config, vite_config);
435439

436440
/** @type {[any, string[]]} */
437-
const [merged_config, conflicts] = deep_merge(modified_user_config, {
441+
const [merged_config, conflicts] = deep_merge(modified_vite_config, {
438442
configFile: false,
439443
root: cwd,
440444
base,
@@ -457,11 +461,13 @@ async function build_server(
457461
preserveEntrySignatures: 'strict'
458462
}
459463
},
460-
resolve: {
461-
alias: {
462-
$app: path.resolve(`${build_dir}/runtime/app`),
463-
$lib: config.kit.files.lib
464-
}
464+
optimizeDeps: {
465+
// exclude Svelte packages because optimizer skips .svelte files leading to half-bundled
466+
// broken packages https://github.com/vitejs/vite/issues/3910
467+
exclude: [
468+
...((vite_config.optimizeDeps && vite_config.optimizeDeps.exclude) || []),
469+
...svelte_packages
470+
]
465471
},
466472
plugins: [
467473
svelte({
@@ -471,16 +477,17 @@ async function build_server(
471477
}
472478
})
473479
],
474-
// this API is marked as @alpha https://github.com/vitejs/vite/blob/27785f7fcc5b45987b5f0bf308137ddbdd9f79ea/packages/vite/src/node/config.ts#L129
475-
// it's not exposed in the typescript definitions as a result
476-
// so we need to ignore the fact that it's missing
480+
resolve: {
481+
alias: {
482+
$app: path.resolve(`${build_dir}/runtime/app`),
483+
$lib: config.kit.files.lib
484+
}
485+
},
477486
ssr: {
478487
// note to self: this _might_ need to be ['svelte', '@sveltejs/kit', ...get_no_external()]
479488
// but I'm honestly not sure. roll with this for now and see if it's ok
480-
noExternal: get_no_external(cwd, user_config.ssr && user_config.ssr.noExternal)
481-
},
482-
optimizeDeps: {
483-
entries: []
489+
// @ts-expect-error ssr is considered in alpha, so not yet exposed by Vite
490+
noExternal: [...((vite_config.ssr && vite_config.ssr.noExternal) || []), ...svelte_packages]
484491
}
485492
});
486493

@@ -499,11 +506,21 @@ async function build_server(
499506
* output_dir: string;
500507
* client_entry_file: string;
501508
* service_worker_entry_file: string | null;
509+
* svelte_packages: string[];
502510
* }} options
503511
* @param {ClientManifest} client_manifest
504512
*/
505513
async function build_service_worker(
506-
{ cwd, base, config, manifest, build_dir, output_dir, service_worker_entry_file },
514+
{
515+
cwd,
516+
base,
517+
config,
518+
manifest,
519+
build_dir,
520+
output_dir,
521+
service_worker_entry_file,
522+
svelte_packages
523+
},
507524
client_manifest
508525
) {
509526
// TODO add any assets referenced in template .html file, e.g. favicon?
@@ -540,7 +557,7 @@ async function build_service_worker(
540557
);
541558

542559
/** @type {any} */
543-
const user_config = config.kit.vite();
560+
const vite_config = config.kit.vite();
544561

545562
const default_config = {
546563
server: {
@@ -551,10 +568,10 @@ async function build_service_worker(
551568
};
552569

553570
// don't warn on overriding defaults
554-
const [modified_user_config] = deep_merge(default_config, user_config);
571+
const [modified_vite_config] = deep_merge(default_config, vite_config);
555572

556573
/** @type {[any, string[]]} */
557-
const [merged_config, conflicts] = deep_merge(modified_user_config, {
574+
const [merged_config, conflicts] = deep_merge(modified_vite_config, {
558575
configFile: false,
559576
root: cwd,
560577
base,
@@ -572,13 +589,18 @@ async function build_service_worker(
572589
outDir: `${output_dir}/client`,
573590
emptyOutDir: false
574591
},
592+
optimizeDeps: {
593+
// exclude Svelte packages because optimizer skips .svelte files leading to half-bundled
594+
// broken packages https://github.com/vitejs/vite/issues/3910
595+
exclude: [
596+
...((vite_config.optimizeDeps && vite_config.optimizeDeps.exclude) || []),
597+
...svelte_packages
598+
]
599+
},
575600
resolve: {
576601
alias: {
577602
'$service-worker': path.resolve(`${build_dir}/runtime/service-worker`)
578603
}
579-
},
580-
optimizeDeps: {
581-
entries: []
582604
}
583605
});
584606

packages/kit/src/core/dev/index.js

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { create_app } from '../../core/create_app/index.js';
1111
import { rimraf } from '../filesystem/index.js';
1212
import { respond } from '../../runtime/server/index.js';
1313
import { getRawBody } from '../node/index.js';
14-
import { copy_assets, get_no_external, resolve_entry } from '../utils.js';
14+
import { copy_assets, get_svelte_packages, resolve_entry } from '../utils.js';
1515
import { deep_merge, print_config_conflicts } from '../config/index.js';
1616
import { svelte } from '@sveltejs/vite-plugin-svelte';
1717
import { get_server } from '../server/index.js';
@@ -112,6 +112,8 @@ class Watcher extends EventEmitter {
112112
// don't warn on overriding defaults
113113
const [modified_vite_config] = deep_merge(default_config, vite_config);
114114

115+
const svelte_packages = get_svelte_packages(this.cwd);
116+
115117
/** @type {[any, string[]]} */
116118
const [merged_config, conflicts] = deep_merge(modified_vite_config, {
117119
configFile: false,
@@ -140,6 +142,14 @@ class Watcher extends EventEmitter {
140142
input: path.resolve(`${this.dir}/runtime/internal/start.js`)
141143
}
142144
},
145+
optimizeDeps: {
146+
// exclude Svelte packages because optimizer skips .svelte files leading to half-bundled
147+
// broken packages https://github.com/vitejs/vite/issues/3910
148+
exclude: [
149+
...((vite_config.optimizeDeps && vite_config.optimizeDeps.exclude) || []),
150+
...svelte_packages
151+
]
152+
},
143153
plugins: [
144154
svelte({
145155
extensions: this.config.extensions,
@@ -156,12 +166,9 @@ class Watcher extends EventEmitter {
156166
...(this.https ? { server: this.server, port: this.port } : {})
157167
}
158168
},
159-
optimizeDeps: {
160-
entries: []
161-
},
162169
ssr: {
163-
// @ts-expect-error ssr is considered in beta, so not exposed by Vite
164-
noExternal: get_no_external(this.cwd, vite_config.ssr && vite_config.ssr.noExternal)
170+
// @ts-expect-error ssr is considered in alpha, so not yet exposed by Vite
171+
noExternal: [...((vite_config.ssr && vite_config.ssr.noExternal) || []), ...svelte_packages]
165172
}
166173
});
167174

packages/kit/src/core/utils.js

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ export function posixify(str) {
8282
* @param {string} cwd
8383
* @returns {string[]}
8484
*/
85-
function find_svelte_packages(cwd) {
85+
export function get_svelte_packages(cwd) {
8686
const pkg_file = path.join(cwd, 'package.json');
8787
if (!fs.existsSync(pkg_file)) return [];
8888

@@ -98,11 +98,3 @@ function find_svelte_packages(cwd) {
9898
return !!dep_pkg.svelte;
9999
});
100100
}
101-
102-
/**
103-
* @param {string} cwd
104-
* @param {string[]} [user_specified_deps]
105-
*/
106-
export function get_no_external(cwd, user_specified_deps = []) {
107-
return [...user_specified_deps, ...find_svelte_packages(cwd)];
108-
}

0 commit comments

Comments
 (0)