Skip to content

Commit ffdbcf1

Browse files
committed
feat: externalize svelte in ssr
1 parent 36a087b commit ffdbcf1

File tree

4 files changed

+10
-75
lines changed

4 files changed

+10
-75
lines changed

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

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import { VitePluginSvelteCache } from './utils/vite-plugin-svelte-cache';
1616
import { ensureWatchedFile, setupWatchers } from './utils/watch';
1717
import { resolveViaPackageJsonSvelte } from './utils/resolve';
1818
import { addExtraPreprocessors } from './utils/preprocess';
19-
import { PartialResolvedId } from 'rollup';
2019

2120
export function svelte(inlineOptions?: Partial<Options>): Plugin {
2221
if (process.env.DEBUG != null) {
@@ -37,8 +36,6 @@ export function svelte(inlineOptions?: Partial<Options>): Plugin {
3736
) => Promise<CompileData>;
3837
/* eslint-enable no-unused-vars */
3938

40-
let resolvedSvelteSSR: Promise<PartialResolvedId | null>;
41-
4239
return {
4340
name: 'vite-plugin-svelte',
4441
// make sure our resolver runs before vite internal resolver to resolve svelte field correctly
@@ -104,25 +101,6 @@ export function svelte(inlineOptions?: Partial<Options>): Plugin {
104101
return importee; // query with svelte tag, an id we generated, no need for further analysis
105102
}
106103

107-
if (ssr && importee === 'svelte') {
108-
if (!resolvedSvelteSSR) {
109-
resolvedSvelteSSR = this.resolve('svelte/ssr', undefined, { skipSelf: true }).then(
110-
(svelteSSR) => {
111-
log.debug('resolved svelte to svelte/ssr');
112-
return svelteSSR;
113-
},
114-
(err) => {
115-
log.debug(
116-
'failed to resolve svelte to svelte/ssr. Update svelte to a version that exports it',
117-
err
118-
);
119-
return null; // returning null here leads to svelte getting resolved regularly
120-
}
121-
);
122-
}
123-
return resolvedSvelteSSR;
124-
}
125-
126104
try {
127105
const resolved = resolveViaPackageJsonSvelte(importee, importer);
128106
if (resolved) {

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ export const SVELTE_IMPORTS = [
77
'svelte/easing',
88
'svelte/internal',
99
'svelte/motion',
10-
'svelte/ssr',
1110
'svelte/store',
1211
'svelte/transition',
1312
'svelte'

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

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,10 @@ function getSvelteDependencies(
4242
.map((dep) => resolveDependencyData(dep, localRequire))
4343
.filter(Boolean) as DependencyData[];
4444
for (const { pkg, dir } of resolvedDeps) {
45-
const type = getSvelteDependencyType(pkg);
46-
if (!type) continue;
47-
result.push({ name: pkg.name, type, pkg, dir, path });
45+
if (!isSvelteComponentLib(pkg)) continue;
46+
result.push({ name: pkg.name, pkg, dir, path });
4847
// continue crawling for component libraries so we can optimize them, js libraries are fine
49-
if (type === 'component-library' && pkg.dependencies) {
48+
if (pkg.dependencies) {
5049
let dependencyNames = Object.keys(pkg.dependencies);
5150
const circular = dependencyNames.filter((name) => path.includes(name));
5251
if (circular.length > 0) {
@@ -104,24 +103,10 @@ function parsePkg(dir: string, silent = false): Pkg | void {
104103
}
105104
}
106105

107-
function getSvelteDependencyType(pkg: Pkg): SvelteDependencyType | undefined {
108-
if (isSvelteComponentLib(pkg)) {
109-
return 'component-library';
110-
} else if (isSvelteLib(pkg)) {
111-
return 'js-library';
112-
} else {
113-
return undefined;
114-
}
115-
}
116-
117106
function isSvelteComponentLib(pkg: Pkg) {
118107
return !!pkg.svelte;
119108
}
120109

121-
function isSvelteLib(pkg: Pkg) {
122-
return !!pkg.dependencies?.svelte || !!pkg.peerDependencies?.svelte;
123-
}
124-
125110
const COMMON_DEPENDENCIES_WITHOUT_SVELTE_FIELD = [
126111
'@lukeed/uuid',
127112
'@sveltejs/vite-plugin-svelte',
@@ -194,16 +179,11 @@ interface DependencyData {
194179

195180
export interface SvelteDependency {
196181
name: string;
197-
type: SvelteDependencyType;
198182
dir: string;
199183
pkg: Pkg;
200184
path: string[];
201185
}
202186

203-
// component-library => exports svelte components
204-
// js-library => only uses svelte api, no components
205-
export type SvelteDependencyType = 'component-library' | 'js-library';
206-
207187
export interface Pkg {
208188
name: string;
209189
svelte?: string;

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

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ export function buildExtraViteConfig(
206206
}
207207

208208
// @ts-ignore
209-
extraViteConfig.ssr = buildSSROptionsForSvelte(svelteDeps, options, config);
209+
extraViteConfig.ssr = buildSSROptionsForSvelte(svelteDeps, config);
210210

211211
if (options.experimental?.useVitePreprocess) {
212212
// needed to transform svelte files with component imports
@@ -227,8 +227,6 @@ function buildOptimizeDepsForSvelte(
227227
options: ResolvedOptions,
228228
optimizeDeps?: DepOptimizationOptions
229229
): DepOptimizationOptions {
230-
// only svelte component libraries needs to be processed for optimizeDeps, js libraries work fine
231-
svelteDeps = svelteDeps.filter((dep) => dep.type === 'component-library');
232230
// include svelte imports for optimization unless explicitly excluded
233231
const include: string[] = [];
234232
const exclude: string[] = ['svelte-hmr'];
@@ -242,11 +240,8 @@ function buildOptimizeDepsForSvelte(
242240
);
243241
};
244242
if (!isExcluded('svelte')) {
245-
const svelteImportsToInclude = SVELTE_IMPORTS.filter((x) => x !== 'svelte/ssr'); // not used on clientside
246-
log.debug(
247-
`adding bare svelte packages to optimizeDeps.include: ${svelteImportsToInclude.join(', ')} `
248-
);
249-
include.push(...svelteImportsToInclude.filter((x) => !isIncluded(x)));
243+
log.debug(`adding bare svelte packages to optimizeDeps.include: ${SVELTE_IMPORTS.join(', ')} `);
244+
include.push(...SVELTE_IMPORTS.filter((x) => !isIncluded(x)));
250245
} else {
251246
log.debug('"svelte" is excluded in optimizeDeps.exclude, skipped adding it to include.');
252247
}
@@ -280,28 +275,8 @@ function buildOptimizeDepsForSvelte(
280275
return { include, exclude };
281276
}
282277

283-
function buildSSROptionsForSvelte(
284-
svelteDeps: SvelteDependency[],
285-
options: ResolvedOptions,
286-
config: UserConfig
287-
): any {
278+
function buildSSROptionsForSvelte(svelteDeps: SvelteDependency[], config: UserConfig): any {
288279
const noExternal: string[] = [];
289-
290-
// add svelte to ssr.noExternal unless it is present in ssr.external
291-
// so we can resolve it with svelte/ssr
292-
if (options.isBuild && config.build?.ssr) {
293-
// @ts-ignore
294-
if (!config.ssr?.external?.includes('svelte')) {
295-
noExternal.push('svelte');
296-
}
297-
} else {
298-
// for non-ssr build, we exclude svelte js library deps to make development faster
299-
// and also because vite doesn't handle them properly.
300-
// see https://github.com/sveltejs/vite-plugin-svelte/issues/168
301-
// see https://github.com/vitejs/vite/issues/2579
302-
svelteDeps = svelteDeps.filter((dep) => dep.type === 'component-library');
303-
}
304-
305280
// add svelte dependencies to ssr.noExternal unless present in ssr.external or optimizeDeps.include
306281
noExternal.push(
307282
...Array.from(new Set(svelteDeps.map((s) => s.name))).filter((x) => {
@@ -310,6 +285,9 @@ function buildSSROptionsForSvelte(
310285
})
311286
);
312287
return {
288+
// never bundle svelte so node can resolve the `node` conditional exports
289+
// NOTE: this also externalizes `svelte/*`
290+
external: ['svelte'],
313291
noExternal
314292
};
315293
}

0 commit comments

Comments
 (0)