diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index c8f3d104ec4e17..b760f30b6a6b0c 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -483,7 +483,15 @@ export async function resolveConfig( // resolve public base url const isBuild = command === 'build' const relativeBaseShortcut = config.base === '' || config.base === './' - const base = relativeBaseShortcut && !isBuild ? '/' : config.base ?? '/' + + // During dev, we ignore relative base and fallback to '/' + // For the SSR build, relative base isn't possible by means + // of import.meta.url. The user will be able to work out a setup + // using experimental.buildAdvancedBaseOptions + const base = + relativeBaseShortcut && (!isBuild || config.build?.ssr) + ? '/' + : config.base ?? '/' let resolvedBase = relativeBaseShortcut ? base : resolveBaseUrl(base, isBuild, logger, 'base') diff --git a/packages/vite/src/node/plugins/asset.ts b/packages/vite/src/node/plugins/asset.ts index 16e73361cdd44f..cab050cbdfa652 100644 --- a/packages/vite/src/node/plugins/asset.ts +++ b/packages/vite/src/node/plugins/asset.ts @@ -105,7 +105,7 @@ export function assetPlugin(config: ResolvedConfig): Plugin { ) => { return base.runtime ? `"+${base.runtime(JSON.stringify(filename))}+"` - : base.relative + : base.relative && !config.build.ssr ? absoluteUrlPathInterpolation(filename) : JSON.stringify((base.url ?? config.base) + filename).slice(1, -1) } diff --git a/packages/vite/src/node/plugins/css.ts b/packages/vite/src/node/plugins/css.ts index 0cf680e6616a30..a362fc124c4150 100644 --- a/packages/vite/src/node/plugins/css.ts +++ b/packages/vite/src/node/plugins/css.ts @@ -469,7 +469,7 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin { chunkCSS = chunkCSS.replace(assetUrlRE, (_, fileHash, postfix = '') => { const filename = getAssetFilename(fileHash, config) + postfix chunk.viteMetadata.importedAssets.add(cleanUrl(filename)) - if (assetsBase.relative) { + if (assetsBase.relative && !config.build.ssr) { // relative base + extracted CSS const relativePath = path.posix.relative(cssAssetDirname!, filename) return relativePath.startsWith('.') @@ -488,7 +488,7 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin { ) chunkCSS = chunkCSS.replace(publicAssetUrlRE, (_, hash) => { const publicUrl = publicAssetUrlMap.get(hash)! - if (publicBase.relative) { + if (publicBase.relative && !config.build.ssr) { return relativePathToPublicFromCSS + publicUrl } else { // publicBase.runtime has no effect for assets in CSS diff --git a/packages/vite/src/node/plugins/worker.ts b/packages/vite/src/node/plugins/worker.ts index 12153eb8041565..89eb18d51da0e3 100644 --- a/packages/vite/src/node/plugins/worker.ts +++ b/packages/vite/src/node/plugins/worker.ts @@ -338,7 +338,7 @@ export function webWorkerPlugin(config: ResolvedConfig): Plugin { } else { // Relative base let outputFilepath: string - if (assetsBase.relative) { + if (assetsBase.relative && !config.build.ssr) { outputFilepath = path.posix.relative( path.dirname(chunk.fileName), filename