From d179918001e7bf88b0701ab73f982ca1e7626781 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 17 Oct 2019 22:29:51 -0400 Subject: [PATCH] perf: further tweak accessCache --- packages/runtime-core/src/component.ts | 2 +- packages/runtime-core/src/componentProxy.ts | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index 9b1fe8a8..5e8539b8 100644 --- a/packages/runtime-core/src/component.ts +++ b/packages/runtime-core/src/component.ts @@ -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 diff --git a/packages/runtime-core/src/componentProxy.ts b/packages/runtime-core/src/componentProxy.ts index bc1a1f54..87fa22ec 100644 --- a/packages/runtime-core/src/componentProxy.ts +++ b/packages/runtime-core/src/componentProxy.ts @@ -56,7 +56,7 @@ const enum AccessTypes { export const PublicInstanceProxyHandlers: ProxyHandler = { 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 = { 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') {