Отключить ретрансляцию мусора - PullRequest
0 голосов
/ 20 сентября 2019

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

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

1 Ответ

0 голосов
/ 20 сентября 2019

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

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

См. Мой полный файл среды ретрансляции ниже.

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;

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

const store = new Store(new RecordSource());
(store as any).holdGC(); // Disable GC on the store.
...