Skip to content

Commit d11d6ea

Browse files
authored
fix: non-relative base public paths in CSS files (#8682)
1 parent 4061ee0 commit d11d6ea

File tree

5 files changed

+51
-14
lines changed

5 files changed

+51
-14
lines changed

packages/vite/src/node/plugins/css.ts

+13-10
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,8 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
458458
// resolve asset URL placeholders to their built file URLs
459459
function resolveAssetUrlsInCss(chunkCSS: string, cssAssetName: string) {
460460
const encodedPublicUrls = encodePublicUrlsInCSS(config)
461-
const assetsBase = config.experimental.buildAdvancedBaseOptions.assets
461+
const { assets: assetsBase, public: publicBase } =
462+
config.experimental.buildAdvancedBaseOptions
462463
const cssAssetDirname =
463464
encodedPublicUrls || assetsBase.relative
464465
? getCssAssetDirname(cssAssetName)
@@ -475,23 +476,25 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
475476
? relativePath
476477
: './' + relativePath
477478
} else {
478-
if (assetsBase.runtime) {
479-
// config.logger.error('Error TODO:base')... absolute + runtime
480-
}
479+
// assetsBase.runtime has no effect for assets in CSS
481480
return (assetsBase.url ?? config.base) + filename
482481
}
483482
})
484-
// resolve public URL from CSS paths, TODO:base
483+
// resolve public URL from CSS paths
485484
if (encodedPublicUrls) {
486485
const relativePathToPublicFromCSS = path.posix.relative(
487486
cssAssetDirname!,
488487
''
489488
)
490-
chunkCSS = chunkCSS.replace(
491-
publicAssetUrlRE,
492-
(_, hash) =>
493-
relativePathToPublicFromCSS + publicAssetUrlMap.get(hash)!
494-
)
489+
chunkCSS = chunkCSS.replace(publicAssetUrlRE, (_, hash) => {
490+
const publicUrl = publicAssetUrlMap.get(hash)!
491+
if (publicBase.relative) {
492+
return relativePathToPublicFromCSS + publicUrl
493+
} else {
494+
// publicBase.runtime has no effect for assets in CSS
495+
return (publicBase.url ?? config.base) + publicUrl.slice(1)
496+
}
497+
})
495498
}
496499
return chunkCSS
497500
}

playground/assets/__tests__/assets.spec.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,14 @@ describe('css url() references', () => {
179179
expect(bg).toMatch(assetMatch)
180180
})
181181

182-
test.runIf(isBuild)('preserve postfix query/hash', () => {
183-
expect(findAssetFile(/\.css$/, 'foo')).toMatch(`woff2?#iefix`)
182+
test.runIf(isBuild)('generated paths in CSS', () => {
183+
const css = findAssetFile(/\.css$/, 'foo')
184+
185+
// preserve postfix query/hash
186+
expect(css).toMatch(`woff2?#iefix`)
187+
188+
// generate non-relative base for public path in CSS
189+
expect(css).not.toMatch(`../icon.png`)
184190
})
185191
})
186192

playground/css/package.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
"dev": "vite",
77
"build": "vite build",
88
"debug": "node --inspect-brk ../../packages/vite/bin/vite",
9-
"preview": "vite preview"
9+
"preview": "vite preview",
10+
"dev:relative-base": "vite --config ./vite.config-relative-base.js dev",
11+
"build:relative-base": "vite --config ./vite.config-relative-base.js build",
12+
"preview:relative-base": "vite --config ./vite.config-relative-base.js preview"
1013
},
1114
"devDependencies": {
1215
"css-dep": "link:./css-dep",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* @type {import('vite').UserConfig}
3+
*/
4+
5+
const baseConfig = require('./vite.config.js')
6+
module.exports = {
7+
...baseConfig,
8+
base: './', // relative base to make dist portable
9+
build: {
10+
...baseConfig.build,
11+
outDir: 'dist/relative-base',
12+
watch: false,
13+
minify: false,
14+
assetsInlineLimit: 0,
15+
rollupOptions: {
16+
output: {
17+
entryFileNames: 'entries/[name].js',
18+
chunkFileNames: 'chunks/[name].[hash].js',
19+
assetFileNames: 'other-assets/[name].[hash][extname]'
20+
}
21+
}
22+
},
23+
testConfig: {
24+
baseRoute: '/relative-base/'
25+
}
26+
}

playground/css/vite.config.js

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ const path = require('path')
44
* @type {import('vite').UserConfig}
55
*/
66
module.exports = {
7-
base: './',
87
build: {
98
cssTarget: 'chrome61'
109
},

0 commit comments

Comments
 (0)