diff --git a/packages/gatsby/src/redux/reducers/index.js b/packages/gatsby/src/redux/reducers/index.js index 1533b73af0006..cef9e829332d0 100644 --- a/packages/gatsby/src/redux/reducers/index.js +++ b/packages/gatsby/src/redux/reducers/index.js @@ -24,6 +24,7 @@ module.exports = { program: require(`./program`), nodes: getNodesReducer(), nodesByType: require(`./nodes-by-type`), + resolvedNodesCache: require(`./resolved-nodes`), nodesTouched: require(`./nodes-touched`), lastAction: require(`./last-action`), plugins: require(`./plugins`), diff --git a/packages/gatsby/src/redux/reducers/resolved-nodes.js b/packages/gatsby/src/redux/reducers/resolved-nodes.js new file mode 100644 index 0000000000000..3c4503406c863 --- /dev/null +++ b/packages/gatsby/src/redux/reducers/resolved-nodes.js @@ -0,0 +1,18 @@ +module.exports = (state = new Map(), action) => { + switch (action.type) { + case `DELETE_CACHE`: + case `CREATE_NODE`: + case `DELETE_NODE`: + case `DELETE_NODES`: + return new Map() + + case `SET_RESOLVED_NODES`: { + const { key, nodes } = action.payload + state.set(key, nodes) + return state + } + + default: + return state + } +} diff --git a/packages/gatsby/src/redux/run-sift.js b/packages/gatsby/src/redux/run-sift.js index f76eaf95823bc..63eab74b7744b 100644 --- a/packages/gatsby/src/redux/run-sift.js +++ b/packages/gatsby/src/redux/run-sift.js @@ -5,8 +5,8 @@ const prepareRegex = require(`../utils/prepare-regex`) const Promise = require(`bluebird`) const { trackInlineObjectsInRootNode } = require(`../db/node-tracking`) const { getNode, getNodesByType } = require(`../db/nodes`) +const { store } = require(`.`) -const resolvedNodesCache = new Map() const enhancedNodeCache = new Map() const enhancedNodePromiseCache = new Map() const enhancedNodeCacheId = ({ node, args }) => @@ -169,6 +169,7 @@ function resolveRecursive(node, siftFieldsObj, gqFields) { } function resolveNodes(nodes, typeName, firstOnly, fieldsToSift, gqlFields) { + const { resolvedNodesCache } = store.getState() const nodesCacheKey = JSON.stringify({ // typeName + count being the same is a pretty good // indication that the nodes are the same. @@ -177,10 +178,7 @@ function resolveNodes(nodes, typeName, firstOnly, fieldsToSift, gqlFields) { nodesLength: nodes.length, ...fieldsToSift, }) - if ( - process.env.NODE_ENV === `production` && - resolvedNodesCache.has(nodesCacheKey) - ) { + if (resolvedNodesCache.has(nodesCacheKey)) { return Promise.resolve(resolvedNodesCache.get(nodesCacheKey)) } else { return Promise.all( @@ -208,7 +206,13 @@ function resolveNodes(nodes, typeName, firstOnly, fieldsToSift, gqlFields) { return enhancedNodeGenerationPromise }) ).then(resolvedNodes => { - resolvedNodesCache.set(nodesCacheKey, resolvedNodes) + store.dispatch({ + type: `SET_RESOLVED_NODES`, + payload: { + key: nodesCacheKey, + nodes: resolvedNodes, + }, + }) return resolvedNodes }) }