diff --git a/packages/compiler-sfc/src/parse.ts b/packages/compiler-sfc/src/parse.ts index 0acceb1faba..00c97867cd0 100644 --- a/packages/compiler-sfc/src/parse.ts +++ b/packages/compiler-sfc/src/parse.ts @@ -103,9 +103,30 @@ export interface SFCParseResult { export const parseCache = createCache() +function genCacheKey(source: string, options: SFCParseOptions): string { + return ( + source + + JSON.stringify( + { + ...options, + compiler: { parse: options.compiler?.parse }, + }, + (_, val) => (typeof val === 'function' ? val.toString() : val), + ) + ) +} + export function parse( source: string, - { + options: SFCParseOptions = {}, +): SFCParseResult { + const sourceKey = genCacheKey(source, options) + const cache = parseCache.get(sourceKey) + if (cache) { + return cache + } + + const { sourceMap = true, filename = DEFAULT_FILENAME, sourceRoot = '', @@ -114,14 +135,7 @@ export function parse( compiler = CompilerDOM, templateParseOptions = {}, parseExpressions = true, - }: SFCParseOptions = {}, -): SFCParseResult { - const sourceKey = - source + sourceMap + filename + sourceRoot + pad + compiler.parse - const cache = parseCache.get(sourceKey) - if (cache) { - return cache - } + } = options const descriptor: SFCDescriptor = { filename,