diff --git a/packages/vite/src/node/plugins/importAnalysisBuild.ts b/packages/vite/src/node/plugins/importAnalysisBuild.ts index 30ce2b7cbdf862..aa9808e56886d2 100644 --- a/packages/vite/src/node/plugins/importAnalysisBuild.ts +++ b/packages/vite/src/node/plugins/importAnalysisBuild.ts @@ -36,7 +36,7 @@ export const preloadMarker = `__VITE_PRELOAD__` export const preloadBaseMarker = `__VITE_PRELOAD_BASE__` export const preloadHelperId = '\0vite/preload-helper' -const preloadMarkerWithQuote = `"${preloadMarker}"` as const +const preloadMarkerWithQuote = new RegExp(`['"]${preloadMarker}['"]`) const dynamicImportPrefixRE = /import\s*\(/ @@ -49,6 +49,20 @@ function toRelativePath(filename: string, importer: string) { return relPath[0] === '.' ? relPath : `./${relPath}` } +function indexOfMatchInSlice( + str: string, + reg: RegExp, + pos: number = 0, +): number { + if (pos !== 0) { + str = str.slice(pos) + } + + const matcher = str.match(reg) + + return matcher?.index !== undefined ? matcher.index + pos : -1 +} + /** * Helper for preloading CSS and direct imports of async chunks in parallel to * the async chunk itself. @@ -507,10 +521,17 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin { addDeps(normalizedFile) } - let markerStartPos = code.indexOf(preloadMarkerWithQuote, end) + let markerStartPos = indexOfMatchInSlice( + code, + preloadMarkerWithQuote, + end, + ) // fix issue #3051 if (markerStartPos === -1 && imports.length === 1) { - markerStartPos = code.indexOf(preloadMarkerWithQuote) + markerStartPos = indexOfMatchInSlice( + code, + preloadMarkerWithQuote, + ) } if (markerStartPos > 0) { @@ -577,7 +598,7 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin { s.update( markerStartPos, - markerStartPos + preloadMarkerWithQuote.length, + markerStartPos + preloadMarker.length + 2, `[${renderedDeps.join(',')}]`, ) rewroteMarkerStartPos.add(markerStartPos) @@ -587,19 +608,19 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin { // there may still be markers due to inlined dynamic imports, remove // all the markers regardless - let markerStartPos = code.indexOf(preloadMarkerWithQuote) + let markerStartPos = indexOfMatchInSlice(code, preloadMarkerWithQuote) while (markerStartPos >= 0) { if (!rewroteMarkerStartPos.has(markerStartPos)) { s.update( markerStartPos, - markerStartPos + preloadMarkerWithQuote.length, + markerStartPos + preloadMarker.length + 2, 'void 0', ) } - - markerStartPos = code.indexOf( + markerStartPos = indexOfMatchInSlice( + code, preloadMarkerWithQuote, - markerStartPos + preloadMarkerWithQuote.length, + markerStartPos + preloadMarker.length + 2, ) }