mirror of https://github.com/vuejs/core.git
fix(app): prevent template from being cached between apps with different options (#9724)
close #9618
This commit is contained in:
parent
f2f5f763e2
commit
ec715854ca
|
|
@ -4,14 +4,32 @@ import { initDev } from './dev'
|
|||
import { compile, CompilerOptions, CompilerError } from '@vue/compiler-dom'
|
||||
import { registerRuntimeCompiler, RenderFunction, warn } from '@vue/runtime-dom'
|
||||
import * as runtimeDom from '@vue/runtime-dom'
|
||||
import { isString, NOOP, generateCodeFrame, extend } from '@vue/shared'
|
||||
import {
|
||||
isString,
|
||||
NOOP,
|
||||
generateCodeFrame,
|
||||
extend,
|
||||
EMPTY_OBJ
|
||||
} from '@vue/shared'
|
||||
import { InternalRenderFunction } from 'packages/runtime-core/src/component'
|
||||
|
||||
if (__DEV__) {
|
||||
initDev()
|
||||
}
|
||||
|
||||
const compileCache: Record<string, RenderFunction> = Object.create(null)
|
||||
const compileCache = new WeakMap<
|
||||
CompilerOptions,
|
||||
Record<string, RenderFunction>
|
||||
>()
|
||||
|
||||
function getCache(options?: CompilerOptions) {
|
||||
let c = compileCache.get(options ?? EMPTY_OBJ)
|
||||
if (!c) {
|
||||
c = Object.create(null) as Record<string, RenderFunction>
|
||||
compileCache.set(options ?? EMPTY_OBJ, c)
|
||||
}
|
||||
return c
|
||||
}
|
||||
|
||||
function compileToFunction(
|
||||
template: string | HTMLElement,
|
||||
|
|
@ -27,7 +45,8 @@ function compileToFunction(
|
|||
}
|
||||
|
||||
const key = template
|
||||
const cached = compileCache[key]
|
||||
const cache = getCache(options)
|
||||
const cached = cache[key]
|
||||
if (cached) {
|
||||
return cached
|
||||
}
|
||||
|
|
@ -84,7 +103,7 @@ function compileToFunction(
|
|||
// mark the function as runtime compiled
|
||||
;(render as InternalRenderFunction)._rc = true
|
||||
|
||||
return (compileCache[key] = render)
|
||||
return (cache[key] = render)
|
||||
}
|
||||
|
||||
registerRuntimeCompiler(compileToFunction)
|
||||
|
|
|
|||
Loading…
Reference in New Issue