|
|
@@ -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)
|