]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
perf: further tweak accessCache
authorEvan You <yyx990803@gmail.com>
Fri, 18 Oct 2019 02:29:51 +0000 (22:29 -0400)
committerEvan You <yyx990803@gmail.com>
Fri, 18 Oct 2019 02:29:51 +0000 (22:29 -0400)
packages/runtime-core/src/component.ts
packages/runtime-core/src/componentProxy.ts

index 9b1fe8a82f4b38f32f7f6bd38859be99477cc5ca..5e8539b8c4723576eca585dd7e8b0ef02e6251af 100644 (file)
@@ -258,7 +258,7 @@ export function setupStatefulComponent(
     }
   }
   // 0. create render proxy property access cache
-  instance.accessCache = Object.create(null)
+  instance.accessCache = {}
   // 1. create render proxy
   instance.renderProxy = new Proxy(instance, PublicInstanceProxyHandlers)
   // 2. create props proxy
index bc1a1f54664b2cc559ed79a827f53b3b332d5453..87fa22ec8c17dee1fffe0ec1dfe6382b0513efca 100644 (file)
@@ -56,7 +56,7 @@ const enum AccessTypes {
 
 export const PublicInstanceProxyHandlers: ProxyHandler<any> = {
   get(target: ComponentInternalInstance, key: string) {
-    const { renderContext, data, props, propsProxy, accessCache } = target
+    const { renderContext, data, props, propsProxy, accessCache, type } = target
     // This getter gets called for every property access on the render context
     // during render and is a major hotspot. The most expensive part of this
     // is the multiple hasOwn() calls. It's much faster to do a simple property
@@ -79,7 +79,10 @@ export const PublicInstanceProxyHandlers: ProxyHandler<any> = {
       accessCache[key] = AccessTypes.CONTEXT
       return renderContext[key]
     } else if (hasOwn(props, key)) {
-      accessCache[key] = AccessTypes.PROPS
+      // only cache props access if component has declared (thus stable) props
+      if (type.props != null) {
+        accessCache[key] = AccessTypes.PROPS
+      }
       // return the value from propsProxy for ref unwrapping and readonly
       return propsProxy![key]
     } else if (key === '$el') {