Explorar el Código

fix(app): prevent template from being cached between apps with different options (#9724)

close #9618
Carlos Rodrigues hace 2 años
padre
commit
ec715854ca
Se han modificado 1 ficheros con 23 adiciones y 4 borrados
  1. 23 4
      packages/vue/src/index.ts

+ 23 - 4
packages/vue/src/index.ts

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