Отключить сборку мусора relayjs

Есть ли способ отключить сборку мусора relayjs (версия 5.0.0 или 6.0.0)?

Мы по-прежнему используем классику relayjs, и она кэширует все данные в сеансе. Это ускоряет загрузку предыдущих страниц при получении новых данных. В relayjs 5.0.0 у них есть dataFrom в QueryRenderer, для которого можно установить значение «STORE_THEN_NETWORK», которое сначала попытается сохранить кэш ретрансляции и получить его из сети, как классический rejay. За исключением того, что в более новых версиях relay используется функция сборки мусора для удаления данных, которые в настоящее время не используются. Это заставляет почти все страницы получать данные из сети.


person Danny Larsen    schedule 20.09.2019    source источник


Ответы (1)


Мне удалось заставить это работать. Ключевым моментом здесь является environment.retain(operation.root);, который сохранит объекты в кеше.

Затем в QueryRenderer используйте fetchPolicy="store-and-network".

См. мой полный файл Relay Environment ниже.

import {Environment, Network, RecordSource, Store} from 'relay-runtime';

function fetchQuery(operation, variables) {
    const environment = RelayEnvironment.getInstance();
    environment.retain(operation.root);

    return fetch(process.env.GRAPHQL_ENDPOINT, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        credentials: 'include',
        body: JSON.stringify({
            query: operation.text,
            variables
        })
    }).then(response => {
        return response.json();
    });
}

const RelayEnvironment = (function() {
    let instance;

    function createInstance() {
        return new Environment({
            network: Network.create(fetchQuery),
            store: new Store(new RecordSource())
        });
    }

    return {
        getInstance: function() {
            if (!instance) {
                instance = createInstance();
            }
            return instance;
        }
    };
})();

export default RelayEnvironment;

Также получил это от Relay Slack Channel. Еще не пробовал.

const store = new Store(new RecordSource());
(store as any).holdGC(); // Disable GC on the store.
person Danny Larsen    schedule 20.09.2019