]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(app): prevent template from being cached between apps with different options...
authorCarlos Rodrigues <carlos@hypermob.co.uk>
Mon, 4 Dec 2023 08:43:30 +0000 (08:43 +0000)
committerGitHub <noreply@github.com>
Mon, 4 Dec 2023 08:43:30 +0000 (16:43 +0800)
close #9618

packages/vue/src/index.ts

index 8215be7476ea1d7936d9c80129fca9edae26246d..f926f140a5ec66ad9728b8567f4626330d9e434a 100644 (file)
@@ -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)