Skip to content

Commit

Permalink
perf: Implementing a cache for the gettersProxy object creation (vuej…
Browse files Browse the repository at this point in the history
…s#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 2df536b.

* Resetting the make local getters cache when the store gets updated

* Changing cache to makeLocalGetters to instance internal state
  • Loading branch information
frankcs authored and vaga committed Apr 20, 2020
1 parent d5c7c7c commit 7b4f8e8
Showing 1 changed file with 23 additions and 18 deletions.
41 changes: 23 additions & 18 deletions src/store.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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) => {
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit 7b4f8e8

Please sign in to comment.