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,
}
const key = template
- const cached = compileCache[key]
+ const cache = getCache(options)
+ const cached = cache[key]
if (cached) {
return cached
}
// mark the function as runtime compiled
;(render as InternalRenderFunction)._rc = true
- return (compileCache[key] = render)
+ return (cache[key] = render)
}
registerRuntimeCompiler(compileToFunction)