禁用 relayjs 垃圾收集

Disable relayjs garbage collection

有没有办法禁用 relayjs 垃圾收集(版本 5.0.0 或 6.0.0)?

我们仍在使用 relayjs classic,它将所有数据缓存在一个会话中。这使得在获取新数据的同时快速加载以前的页面。在 relayjs 5.0.0 中,他们在 QueryRenderer 上有一个 dataFrom,可以将其设置为 "STORE_THEN_NETWORK",它将首先尝试中继缓存存储并从网络中获取,就像 rejay classic 一样。除了较新版本的中继使用垃圾收集功能来删除当前未使用的数据。这使得几乎所有页面都从网络中获取数据。

我设法让它工作了。这里的关键是 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;

也是从 Relay Slack Channel 得到的。还没试过。

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