Skip to content

Commit b381792

Browse files
authored
[fix] enable Vite pre-bundling except for Svelte packages (#2137)
1 parent 7fba7a0 commit b381792

File tree

8 files changed

+97
-66
lines changed

8 files changed

+97
-66
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
@@ -420,8 +424,8 @@ async function build_server(
420424
.trim()
421425
);
422426

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

426430
const default_config = {
427431
server: {
@@ -432,10 +436,10 @@ async function build_server(
432436
};
433437

434438
// don't warn on overriding defaults
435-
const [modified_user_config] = deep_merge(default_config, user_config);
439+
const [modified_vite_config] = deep_merge(default_config, vite_config);
436440

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

@@ -500,11 +507,21 @@ async function build_server(
500507
* output_dir: string;
501508
* client_entry_file: string;
502509
* service_worker_entry_file: string | null;
510+
* svelte_packages: string[];
503511
* }} options
504512
* @param {ClientManifest} client_manifest
505513
*/
506514
async function build_service_worker(
507-
{ cwd, base, config, manifest, build_dir, output_dir, service_worker_entry_file },
515+
{
516+
cwd,
517+
base,
518+
config,
519+
manifest,
520+
build_dir,
521+
output_dir,
522+
service_worker_entry_file,
523+
svelte_packages
524+
},
508525
client_manifest
509526
) {
510527
// TODO add any assets referenced in template .html file, e.g. favicon?
@@ -541,7 +558,7 @@ async function build_service_worker(
541558
);
542559

543560
/** @type {any} */
544-
const user_config = config.kit.vite();
561+
const vite_config = config.kit.vite();
545562

546563
const default_config = {
547564
server: {
@@ -552,10 +569,10 @@ async function build_service_worker(
552569
};
553570

554571
// don't warn on overriding defaults
555-
const [modified_user_config] = deep_merge(default_config, user_config);
572+
const [modified_vite_config] = deep_merge(default_config, vite_config);
556573

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

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-
}

packages/kit/test/apps/basics/src/routes/load/change-detection/__layout.svelte

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
<script context="module">
2-
let loads = 0;
2+
let count = 0;
33
44
/** @type {import('@sveltejs/kit').Load} */
55
export async function load({ fetch }) {
66
const res = await fetch('/load/change-detection/data.json');
77
const { type } = await res.json();
88
9-
loads += 1;
9+
count += 1;
1010
1111
return {
1212
maxage: 5,
1313
props: {
1414
type,
15-
loads
15+
loads: count
1616
}
1717
};
1818
}

packages/kit/test/apps/basics/src/routes/load/change-detection/one/[x].svelte

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
<script context="module">
2-
let loads = 0;
2+
let count = 0;
33
44
/** @type {import('@sveltejs/kit').Load} */
55
export async function load({ page }) {
6-
loads += 1;
6+
count += 1;
77
88
return {
99
maxage: 5,
1010
props: {
1111
x: page.params.x,
12-
loads
12+
loads: count
1313
}
1414
};
1515
}

packages/kit/test/apps/basics/src/routes/load/change-detection/two/[y].svelte

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
<script context="module">
2-
let loads = 0;
2+
let count = 0;
33
44
/** @type {import('@sveltejs/kit').Load} */
55
export async function load({ page }) {
6-
loads += 1;
6+
count += 1;
77
88
return {
99
maxage: 5,
1010
props: {
1111
y: page.params.y,
12-
loads
12+
loads: count
1313
}
1414
};
1515
}

0 commit comments

Comments
 (0)