Skip to content

Commit

Permalink
fix: externalize transitive deps during dev ssr (#289)
Browse files Browse the repository at this point in the history
* fix: externalize transitive cjs only deps during dev ssr

* fix: kindly tell ts we know about ssr

* fix: move generating external

* fix: unconditionally externalize all transitive deps of svelte libraries during dev

* fix: omit dependencies present in noExternal or already in external from generated list of externals

* fix: formatting and null checks

* chore: tidy up
  • Loading branch information
dominikg committed Mar 16, 2022
1 parent 65219d1 commit 3d22f89
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 8 deletions.
5 changes: 5 additions & 0 deletions .changeset/cold-pumpkins-enjoy.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/vite-plugin-svelte': patch
---

improve handling of transitive cjs dependencies of svelte libraries during dev ssr
2 changes: 1 addition & 1 deletion packages/vite-plugin-svelte/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ export function svelte(inlineOptions?: Partial<Options>): Plugin {
// @ts-expect-error temporarily lend the options variable until fixed in configResolved
options = await preResolveOptions(inlineOptions, config, configEnv);
// extra vite config
const extraViteConfig = buildExtraViteConfig(options, config, configEnv);
const extraViteConfig = buildExtraViteConfig(options, config);
log.debug('additional vite config', extraViteConfig);
return extraViteConfig;
},
Expand Down
30 changes: 23 additions & 7 deletions packages/vite-plugin-svelte/src/utils/options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -184,8 +184,7 @@ function resolveViteRoot(viteConfig: UserConfig): string | undefined {

export function buildExtraViteConfig(
options: PreResolvedOptions,
config: UserConfig,
configEnv: ConfigEnv
config: UserConfig
): Partial<UserConfig> {
// extra handling for svelte dependencies in the project
const svelteDeps = findRootSvelteDependencies(options.root);
Expand All @@ -200,7 +199,7 @@ export function buildExtraViteConfig(
// knownJsSrcExtensions: options.extensions
};

if (configEnv.command === 'serve') {
if (options.isServe) {
extraViteConfig.optimizeDeps = buildOptimizeDepsForSvelte(
svelteDeps,
options,
Expand All @@ -209,7 +208,7 @@ export function buildExtraViteConfig(
}

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

return extraViteConfig;
}
Expand Down Expand Up @@ -294,7 +293,7 @@ function buildSSROptionsForSvelte(
// add svelte to ssr.noExternal unless it is present in ssr.external
// so we can resolve it with svelte/ssr
if (options.isBuild && config.build?.ssr) {
// @ts-ignore
// @ts-expect-error ssr still flagged in vite
if (!config.ssr?.external?.includes('svelte')) {
noExternal.push('svelte');
}
Expand All @@ -309,13 +308,30 @@ function buildSSROptionsForSvelte(
// add svelte dependencies to ssr.noExternal unless present in ssr.external or optimizeDeps.include
noExternal.push(
...Array.from(new Set(svelteDeps.map((s) => s.name))).filter((x) => {
// @ts-ignore
// @ts-expect-error ssr still flagged in vite
return !config.ssr?.external?.includes(x) && !config.optimizeDeps?.include?.includes(x);
})
);
return {
const ssr = {
noExternal
};

if (options.isServe) {
// during dev, we have to externalize transitive dependencies, see https://github.com/sveltejs/vite-plugin-svelte/issues/281
// @ts-expect-error ssr still flagged in vite
ssr.external = Array.from(
new Set(svelteDeps.flatMap((dep) => Object.keys(dep.pkg.dependencies || {})))
).filter(
(dep) =>
!ssr.noExternal.includes(dep) &&
// @ts-expect-error ssr still flagged in vite
!config.ssr?.noExternal?.includes(dep) &&
// @ts-expect-error ssr still flagged in vite
!config.ssr?.external?.includes(dep)
);
}

return ssr;
}

export function patchResolvedViteConfig(viteConfig: ResolvedConfig, options: ResolvedOptions) {
Expand Down

0 comments on commit 3d22f89

Please sign in to comment.