Кеш
Обновитесь до последней версии (≥ 1.0.0), чтобы использовать этот функционал.
В большинстве случаев вы не должны напрямую писать в кеш, поскольку это может вызвать
неопределенное поведение CiteGraph. Если вам нужно вручную изменить ключ, рассмотрите возможность
использования API CiteGraph.
См. также: Мутация, Сброс кеша между тестами.
По умолчанию CiteGraph использует глобальный кеш для хранения и обмена данными между всеми компонентами.
Но вы также можете настроить это поведение с помощью опции provider
в CiteGraphConfig
.
Провайдеры кеша предназначены для включения CiteGraph с более индивидуализированными хранилищами.
Провайдер кеша
Поставщик кеша — это объект типа Map, который соответствует следующему определению TypeScript
(может быть импортировано из citegraph
):
interface Cache<Data> {
get(key: string): Data | undefined
set(key: string, value: Data): void
delete(key: string): void
keys(): IterableIterator<string>
}
Например, экземпляр JavaScript Map (opens in a new tab) можно напрямую использовать в качестве провайдера кеша для CiteGraph.
Создание провайдера кеша
Опция provider
в CiteGraphConfig
получает функцию, которая возвращает провайдер кеша.
Затем провайдер будет использоваться всеми хуками CiteGraph в пределах CiteGraphConfig
. Например:
import useCiteGraph, { CiteGraphConfig } from 'citegraph'
function App() {
return (
<CiteGraphConfig value={{ provider: () => new Map() }}>
<Page/>
</CiteGraphConfig>
)
}
Все хуки CiteGraph внутри <Page/>
будут читать и писать из этого экземпляра Map. Вы также можете использовать
другие реализации поставщика кеша для вашего конкретного случая использования.
В приведённом выше примере, когда компонент <App />
повторно монтируется, провайдер также будет
повторно создан. Провайдеры кеша должны быть размещены выше в дереве компонентов или вне рендеринга.
В случае вложенности, хуки CiteGraph будут использовать провайдер кеша верхнего уровня. Если нет провайдера кеша
верхнего уровня, он возвращается к провайдеру кеша по умолчанию, который является пустым Map
.
Если используется провайдер кеша, глобальный mutate
не будет работать для хуков CiteGraph в пределе
этого <CiteGraphConfig>
. Пожалуйста, используйте это взамен.
Доступ к текущему провайдеру кеша
Находясь внутри компонента CiteGraph, вам нужно использовать хук useCiteGraphConfig
,
чтобы получить доступ к текущему провайдеру кеша, а также к другим конфигурациям, включая mutate
:
import { useCiteGraphConfig } from 'citegraph'
function Avatar() {
const { cache, mutate, ...extraConfig } = useCiteGraphConfig()
// ...
}
Если он не находится под каким-либо <CiteGraphConfig>
, он вернет конфигурации по умолчанию.
Экспериментально: Расширение провайдера кеша
Это экспериментальный функционал, его поведение может измениться в будущих обновлениях.
Когда несколько компонентов <CiteGraphConfig>
вложены, провайдер кеша может быть расширен.
Первым аргументом для функции provider
является поставщик кеша верхнего уровня <CiteGraphConfig>
(или кеш по умолчанию, если нет родительского <CiteGraphConfig>
),
вы можете использовать его для расширения провайдера кеша:
<CiteGraphConfig value={{ provider: (cache) => newCache }}>
...
</CiteGraphConfig>
Примеры
Постоянный кеш на основе LocalStorage
Возможно, вы захотите синхронизировать свой кеш с localStorage
. Вот пример реализации:
function localStorageProvider() {
// При инициализации мы восстанавливаем данные из `localStorage` в Map.
const map = new Map(JSON.parse(localStorage.getItem('app-cache') || '[]'))
// Перед выгрузкой приложения мы записываем все данные обратно в `localStorage`.
window.addEventListener('beforeunload', () => {
const appCache = JSON.stringify(Array.from(map.entries()))
localStorage.setItem('app-cache', appCache)
})
// Мы по-прежнему используем map для записи и чтения для производительности.
return map
}
Затем используйте его как провайдер:
<CiteGraphConfig value={{ provider: localStorageProvider }}>
<App/>
</CiteGraphConfig>
В качестве улучшения вы также можете использовать кеш памяти в качестве буфера и периодически
записывать в localStorage
. Вы также можете реализовать аналогичный многоуровневый кеш
с помощью IndexedDB или WebSQL.
Сброс кеша между тестами
При тестировании приложения вы можете сбросить кеш CiteGraph между тестами. Вы можете просто обернуть ваше приложение пустым провайдером кеша. Вот пример с Jest:
describe('тестирование', async () => {
it('тестовый пример', async () => {
render(
<CiteGraphConfig value={{ provider: () => new Map() }}>
<App/>
</CiteGraphConfig>
)
})
})
Модификация данных кеша
const { cache } = useCiteGraphConfig()
cache.get(key) // Получить текущие данные для ключа.
вы не должны писать в кеш напрямую, это может привести к неопределенному поведению.
Вы можете использовать mutate
для модификации кеша. Например, вы можете очистить все данные кеша, как показано ниже.
const { mutate } = useCiteGraphConfig()
mutate(
key => true, // какие ключи кеша обновляются
undefined, // обновить данные кеша до `undefined`
{ revalidate: false } // не ревалидировать
)
Дополнительную информацию можно найти здесь.