From d0d639407f79c2cb3c4c46843a91776276d3ad05 Mon Sep 17 00:00:00 2001 From: btea <2356281422@qq.com> Date: Tue, 3 Dec 2024 17:13:46 +0800 Subject: [PATCH 1/2] fix: rewrite url when image-set and url exist at the same time --- packages/vite/src/node/plugins/css.ts | 26 +++++++++++++++++----- playground/assets/__tests__/assets.spec.ts | 5 +++++ playground/assets/index.html | 12 ++++++++++ 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/packages/vite/src/node/plugins/css.ts b/packages/vite/src/node/plugins/css.ts index 8615ba0cf89d22..938d581308856a 100644 --- a/packages/vite/src/node/plugins/css.ts +++ b/packages/vite/src/node/plugins/css.ts @@ -1748,15 +1748,31 @@ const UrlRewritePostcssPlugin: PostCSS.PluginCreator<{ const replacerForDeclaration = (rawUrl: string) => { return opts.replacer(rawUrl, importer) } - const rewriterToUse = isCssImageSet + let rewriterToUse = isCssImageSet ? rewriteCssImageSet : rewriteCssUrls promises.push( - rewriterToUse(declaration.value, replacerForDeclaration).then( - (url) => { + rewriterToUse(declaration.value, replacerForDeclaration) + .then((url) => { declaration.value = url - }, - ), + }) + .then(() => { + const hasRewriteImageSet = rewriterToUse === rewriteCssImageSet + if ( + (hasRewriteImageSet && isCssUrl) || + (!hasRewriteImageSet && isCssImageSet) + ) { + rewriterToUse = hasRewriteImageSet + ? rewriteCssUrls + : rewriteCssImageSet + return rewriterToUse( + declaration.value, + replacerForDeclaration, + ).then((url) => { + declaration.value = url + }) + } + }), ) } }) diff --git a/playground/assets/__tests__/assets.spec.ts b/playground/assets/__tests__/assets.spec.ts index 3d9b1310370f86..0f33ca7d4b55fb 100644 --- a/playground/assets/__tests__/assets.spec.ts +++ b/playground/assets/__tests__/assets.spec.ts @@ -228,6 +228,11 @@ describe('css url() references', () => { }) }) + test('image-set and url exist at the same time.', async () => { + const imageSet = await getBg('.image-set-and-url-exsiting-at-same-time') + expect(imageSet).toMatch(assetMatch) + }) + test('relative in @import', async () => { expect(await getBg('.css-url-relative-at-imported')).toMatch(assetMatch) }) diff --git a/playground/assets/index.html b/playground/assets/index.html index b4e71bc85d0897..e41ae78cff0227 100644 --- a/playground/assets/index.html +++ b/playground/assets/index.html @@ -102,6 +102,18 @@