diff --git a/packages/playground/resolve/__tests__/resolve.spec.ts b/packages/playground/resolve/__tests__/resolve.spec.ts
index b64da138033fc0..958f156102ae5d 100644
--- a/packages/playground/resolve/__tests__/resolve.spec.ts
+++ b/packages/playground/resolve/__tests__/resolve.spec.ts
@@ -17,7 +17,10 @@ test('deep import with exports field', async () => {
})
test('deep import with query with exports field', async () => {
- expect(await page.textContent('.exports-deep-query')).not.toMatch('fail')
+ // since it is imported with `?url` it should return a url
+ expect(await page.textContent('.exports-deep-query')).toMatch(
+ isBuild ? /base64/ : '/exports-path/deep.json'
+ )
})
test('deep import with exports field + exposed dir', async () => {
diff --git a/packages/playground/resolve/index.html b/packages/playground/resolve/index.html
index 71699035abdd53..520b22db0304e9 100644
--- a/packages/playground/resolve/index.html
+++ b/packages/playground/resolve/index.html
@@ -151,10 +151,11 @@
resolve package that contains # in path
import e from 'resolve-browser-field/ext-index/index.js'
import f from 'resolve-browser-field/ext-index'
import g from 'resolve-browser-field/no-ext-index/index.js' // no substitution
+ import h from 'resolve-browser-field/no-ext?query'
import { ra, rb, rc, rd, re, rf, rg } from 'resolve-browser-field/relative'
- const success = [main, a, c, d, e, f, ra, rc, rd, re, rf]
+ const success = [main, a, c, d, e, f, h, ra, rc, rd, re, rf]
const noSuccess = [b, g, rb, rg]
if (
diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts
index 03a9026242f428..251d1a8e68d4c1 100644
--- a/packages/vite/src/node/plugins/resolve.ts
+++ b/packages/vite/src/node/plugins/resolve.ts
@@ -289,23 +289,28 @@ export function resolvePlugin(baseOptions: InternalResolveOptions): Plugin {
}
}
-function tryFsResolve(
- fsPath: string,
- options: InternalResolveOptions,
- tryIndex = true,
- targetWeb = true
-): string | undefined {
- let file = fsPath
+function splitFileAndPostfix(path: string) {
+ let file = path
let postfix = ''
- let postfixIndex = fsPath.indexOf('?')
+ let postfixIndex = path.indexOf('?')
if (postfixIndex < 0) {
- postfixIndex = fsPath.indexOf('#')
+ postfixIndex = path.indexOf('#')
}
if (postfixIndex > 0) {
- file = fsPath.slice(0, postfixIndex)
- postfix = fsPath.slice(postfixIndex)
+ file = path.slice(0, postfixIndex)
+ postfix = path.slice(postfixIndex)
}
+ return { file, postfix }
+}
+
+function tryFsResolve(
+ fsPath: string,
+ options: InternalResolveOptions,
+ tryIndex = true,
+ targetWeb = true
+): string | undefined {
+ const { file, postfix } = splitFileAndPostfix(fsPath)
let res: string | undefined
@@ -783,6 +788,7 @@ function resolveExports(
if (options.conditions) {
conditions.push(...options.conditions)
}
+
return _resolveExports(pkg, key, {
browser: targetWeb,
require: options.isRequire,
@@ -813,12 +819,14 @@ function resolveDeepImport(
// map relative based on exports data
if (exportsField) {
if (isObject(exportsField) && !Array.isArray(exportsField)) {
- relativeId = resolveExports(
- data,
- cleanUrl(relativeId),
- options,
- targetWeb
- )
+ // resolve without postfix (see #7098)
+ const { file, postfix } = splitFileAndPostfix(relativeId)
+ const exportsId = resolveExports(data, file, options, targetWeb)
+ if (exportsId !== undefined) {
+ relativeId = exportsId + postfix
+ } else {
+ relativeId = undefined
+ }
} else {
// not exposed
relativeId = undefined
@@ -830,9 +838,11 @@ function resolveDeepImport(
)
}
} else if (targetWeb && isObject(browserField)) {
- const mapped = mapWithBrowserField(relativeId, browserField)
+ // resolve without postfix (see #7098)
+ const { file, postfix } = splitFileAndPostfix(relativeId)
+ const mapped = mapWithBrowserField(file, browserField)
if (mapped) {
- relativeId = mapped
+ relativeId = mapped + postfix
} else if (mapped === false) {
return (webResolvedImports[id] = browserExternalId)
}