diff --git a/packages/vite/src/node/plugins/importAnalysisBuild.ts b/packages/vite/src/node/plugins/importAnalysisBuild.ts index 20bcb6449e12f2..ea79c21b13ca71 100644 --- a/packages/vite/src/node/plugins/importAnalysisBuild.ts +++ b/packages/vite/src/node/plugins/importAnalysisBuild.ts @@ -19,6 +19,7 @@ import type { ResolvedConfig } from '../config' import { toOutputFilePathInJS } from '../build' import { genSourceMapUrl } from '../server/sourcemap' import { getDepsOptimizer, optimizedDepNeedsInterop } from '../optimizer' +import { SPECIAL_QUERY_RE } from '../constants' import { isCSSRequest, removedPureCssFilesCache } from './css' import { interopNamedImports } from './importAnalysis' @@ -362,6 +363,8 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin { (source.slice(expStart, start).includes('from') || isDynamicImport) && // already has ?used query (by import.meta.glob) !specifier.match(/\?used(&|$)/) && + // don't append ?used when SPECIAL_QUERY_RE exists + !specifier.match(SPECIAL_QUERY_RE) && // edge case for package names ending with .css (e.g normalize.css) !(bareImportRE.test(specifier) && !specifier.includes('/')) ) { diff --git a/playground/assets/__tests__/relative-base/relative-base-assets.spec.ts b/playground/assets/__tests__/relative-base/relative-base-assets.spec.ts index 70cb0fef940978..7f1df03bfcf42e 100644 --- a/playground/assets/__tests__/relative-base/relative-base-assets.spec.ts +++ b/playground/assets/__tests__/relative-base/relative-base-assets.spec.ts @@ -9,6 +9,8 @@ import { viteConfig, } from '~utils' +const getBase = () => (viteConfig ? viteConfig?.testConfig?.baseRoute : '') + const absoluteAssetMatch = isBuild ? /http.*\/other-assets\/asset-\w{8}\.png/ : '/nested/asset.png' @@ -138,7 +140,7 @@ describe('css url() references', () => { describe.runIf(isBuild)('index.css URLs', () => { let css: string beforeAll(() => { - const base = viteConfig ? viteConfig?.testConfig?.baseRoute : '' + const base = getBase() css = findAssetFile(/index.*\.css$/, base, 'other-assets') }) @@ -200,6 +202,10 @@ test('?url import on css', async () => { expect(txt).toMatch( isBuild ? /http.*\/other-assets\/icons-\w{8}\.css/ : '/css/icons.css', ) + isBuild && + expect(findAssetFile(/index.*\.js$/, getBase(), 'entries')).toMatch( + /icons-.+\.css(?!\?used)/, + ) }) test('new URL(..., import.meta.url)', async () => {