Skip to content

Commit fac3a8e

Browse files
authored
fix: resolve relative URL generated by renderBuiltUrl passed to module preload (#16084)
1 parent 7d8c0e2 commit fac3a8e

File tree

3 files changed

+18
-23
lines changed

3 files changed

+18
-23
lines changed

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

+7-14
Original file line numberDiff line numberDiff line change
@@ -168,29 +168,24 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin {
168168

169169
const renderBuiltUrl = config.experimental.renderBuiltUrl
170170
const isRelativeBase = config.base === './' || config.base === ''
171-
const optimizeModulePreloadRelativePaths = isRelativeBase && !renderBuiltUrl
172171

173172
const { modulePreload } = config.build
174173
const scriptRel =
175174
modulePreload && modulePreload.polyfill
176175
? `'modulepreload'`
177176
: `(${detectScriptRel.toString()})()`
178177

179-
// There are three different cases for the preload list format in __vitePreload
178+
// There are two different cases for the preload list format in __vitePreload
180179
//
181180
// __vitePreload(() => import(asyncChunk), [ ...deps... ])
182181
//
183182
// This is maintained to keep backwards compatibility as some users developed plugins
184183
// using regex over this list to workaround the fact that module preload wasn't
185184
// configurable.
186-
const assetsURL = renderBuiltUrl
187-
? // If `experimental.renderBuiltUrl` is used, the dependencies are already resolved.
188-
// To avoid the need for `new URL(dep, import.meta.url)`, a helper `__vitePreloadRelativeDep` is
189-
// used to resolve from relative paths which can be minimized.
190-
`function(dep, importerUrl) { return dep[0] === '.' ? new URL(dep, importerUrl).href : dep }`
191-
: optimizeModulePreloadRelativePaths
192-
? // If there isn't custom resolvers affecting the deps list, deps in the list are relative
193-
// to the current chunk and are resolved to absolute URL by the __vitePreload helper itself.
185+
const assetsURL =
186+
renderBuiltUrl || isRelativeBase
187+
? // If `experimental.renderBuiltUrl` is used, the dependencies might be relative to the current chunk.
188+
// If relative base is used, the dependencies are relative to the current chunk.
194189
// The importerUrl is passed as third parameter to __vitePreload in this case
195190
`function(dep, importerUrl) { return new URL(dep, importerUrl).href }`
196191
: // If the base isn't relative, then the deps are relative to the projects `outDir` and the base
@@ -347,9 +342,7 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin {
347342
str().appendRight(
348343
expEnd,
349344
`,${isModernFlag}?${preloadMarker}:void 0${
350-
optimizeModulePreloadRelativePaths || renderBuiltUrl
351-
? ',import.meta.url'
352-
: ''
345+
renderBuiltUrl || isRelativeBase ? ',import.meta.url' : ''
353346
})`,
354347
)
355348
}
@@ -627,7 +620,7 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin {
627620
renderedDeps = depsArray.map((d) =>
628621
// Don't include the assets dir if the default asset file names
629622
// are used, the path will be reconstructed by the import preload helper
630-
optimizeModulePreloadRelativePaths
623+
isRelativeBase
631624
? addFileDep(toRelativePath(d, file))
632625
: addFileDep(d),
633626
)

playground/preload/__tests__/resolve-deps/preload-resolve-deps.spec.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ describe.runIf(isBuild)('build', () => {
2121
expect(html).toMatch(
2222
/link rel="modulepreload".*?href="http.*?\/hello-[-\w]{8}\.js"/,
2323
)
24-
expect(html).toMatch(/link rel="modulepreload".*?href="\/preloaded.js"/)
24+
expect(html).toMatch(
25+
/link rel="modulepreload".*?href="http.*?\/preloaded.js"/,
26+
)
2527
expect(html).toMatch(
2628
/link rel="stylesheet".*?href="http.*?\/hello-[-\w]{8}\.css"/,
2729
)

playground/preload/package.json

+8-8
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88
"build": "vite build",
99
"debug": "node --inspect-brk ../../packages/vite/bin/vite",
1010
"preview": "vite preview",
11-
"dev:resolve-deps": "vite --config vite.config-resolve-deps.ts",
12-
"build:resolve-deps": "vite build --config vite.config-resolve-deps.ts",
13-
"debug:resolve-deps": "node --inspect-brk ../../packages/vite/bin/vite --config vite.config-resolve-deps.ts",
14-
"preview:resolve-deps": "vite preview --config vite.config-resolve-deps.ts",
15-
"dev:preload-disabled": "vite --config vite.config-preload-disabled.ts",
16-
"build:preload-disabled": "vite build --config vite.config-preload-disabled.ts",
17-
"debug:preload-disabled": "node --inspect-brk ../../packages/vite/bin/vite --config vite.config-preload-disabled.ts",
18-
"preview:preload-disabled": "vite preview --config vite.config-preload-disabled.ts"
11+
"dev:resolve-deps": "vite --config vite.config-resolve-deps.js",
12+
"build:resolve-deps": "vite build --config vite.config-resolve-deps.js",
13+
"debug:resolve-deps": "node --inspect-brk ../../packages/vite/bin/vite --config vite.config-resolve-deps.js",
14+
"preview:resolve-deps": "vite preview --config vite.config-resolve-deps.js",
15+
"dev:preload-disabled": "vite --config vite.config-preload-disabled.js",
16+
"build:preload-disabled": "vite build --config vite.config-preload-disabled.js",
17+
"debug:preload-disabled": "node --inspect-brk ../../packages/vite/bin/vite --config vite.config-preload-disabled.js",
18+
"preview:preload-disabled": "vite preview --config vite.config-preload-disabled.js"
1919
},
2020
"devDependencies": {
2121
"terser": "^5.31.5",

0 commit comments

Comments
 (0)