From 40033825b7259c2e9b702bdf94e0b24ed4511d7c Mon Sep 17 00:00:00 2001 From: Frank Emilio Perez Rivero Date: Sat, 9 Nov 2019 18:53:24 +0100 Subject: [PATCH] perf: Implementing a cache for the gettersProxy object creation (#1546) * Implementing a cache for the gettersProxy object creation. Kill ssr performance wth large number of modules/getters * Revert "Implementing a cache for the gettersProxy object creation. Kill ssr performance wth large number of modules/getters" This reverts commit 2df536b3c13b85bb1d67756cec4c747aaf6d8661. * Resetting the make local getters cache when the store gets updated * Changing cache to makeLocalGetters to instance internal state --- src/store.js | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/src/store.js b/src/store.js index 032480751..039e18165 100644 --- a/src/store.js +++ b/src/store.js @@ -35,6 +35,7 @@ export class Store { this._modulesNamespaceMap = Object.create(null) this._subscribers = [] this._watcherVM = new Vue() + this._makeLocalGettersCache = Object.create(null) // bind commit and dispatch to self const store = this @@ -252,6 +253,8 @@ function resetStoreVM (store, state, hot) { // bind store public getters store.getters = {} + // reset local getters cache + store._makeLocalGettersCache = Object.create(null) const wrappedGetters = store._wrappedGetters const computed = {} forEachValue(wrappedGetters, (fn, key) => { @@ -397,26 +400,28 @@ function makeLocalContext (store, namespace, path) { } function makeLocalGetters (store, namespace) { - const gettersProxy = {} - - const splitPos = namespace.length - Object.keys(store.getters).forEach(type => { - // skip if the target getter is not match this namespace - if (type.slice(0, splitPos) !== namespace) return - - // extract local getter type - const localType = type.slice(splitPos) - - // Add a port to the getters proxy. - // Define as getter property because - // we do not want to evaluate the getters in this time. - Object.defineProperty(gettersProxy, localType, { - get: () => store.getters[type], - enumerable: true + if (!store._makeLocalGettersCache[namespace]) { + const gettersProxy = {} + const splitPos = namespace.length + Object.keys(store.getters).forEach(type => { + // skip if the target getter is not match this namespace + if (type.slice(0, splitPos) !== namespace) return + + // extract local getter type + const localType = type.slice(splitPos) + + // Add a port to the getters proxy. + // Define as getter property because + // we do not want to evaluate the getters in this time. + Object.defineProperty(gettersProxy, localType, { + get: () => store.getters[type], + enumerable: true + }) }) - }) + store._makeLocalGettersCache[namespace] = gettersProxy + } - return gettersProxy + return store._makeLocalGettersCache[namespace] } function registerMutation (store, type, handler, local) {