Кто бы не любил кеш, верно? Давайте посмотрим, как мы можем кэшировать данные с помощью Svelte и Appwrite!
Мы собираемся изучить, как мы можем создать хранилище Svelte, которое кэширует наши данные и динамически обновляется.
К счастью для нас, это довольно просто.
TL;DR заключается в следующем:
– создать хранилище с помощью набора, подписки и загрузки
– установить данные в кеш
– обновить кеш, подписавшись на изменения данных
- Обновляйте данные динамически, вызывая функцию загрузки в вашем компоненте.
Настраиваем все 📦
Мы начнем с создания магазина appwrite.js, чтобы упростить нашу жизнь:
import { Client } from 'appwrite';
const server = {
endpoint: import.meta.env.VITE_APP_ENDPOINT.toString(),
project: import.meta.env.VITE_APP_PROJECT.toString(),
collection: import.meta.env.VITE_APP_COLLECTION_ID.toString(),
database: import.meta.env.VITE_APP_DATABASE_ID.toString()
};
const client = new Client();
client.setEndpoint(server.endpoint).setProject(server.project);
export { client, server };
Вы можете посмотреть полный пример здесь
Это позволяет нам получать доступ к SDK Appwrite откуда угодно.
Не забудьте добавить все конечные точки в файл .env в корне вашего проекта.
Веселье начинается! 🥳
Теперь давайте инициализируем другое хранилище, где мы будем реализовывать наше кеширование:
import { client, server } from './appwrite'; // This is the store we created previously
import { Databases } from 'appwrite';
import { writable } from 'svelte/store';
import { browser } from '$app/env'; // We'll use this to check if we are in the browser
function createDocumentsListStore() {
// Magic unicorns 🦄
}
export const documentsList = createDocumentsListStore();
Большой! Давайте немного поработаем над этой функцией. Мы хотим создать хранилище с возможностью записи, которое может извлекать наши кешированные данные и которое легко обновлять.
function createDocumentsListStore() {
const { subscribe, set } = writable({
/* Check if we're in the browser.
If we are check the session storage for a item named documents, and parse it. This is our response.
If we're not in the browser or if there is no item stored the response is null */
response: browser ? JSON.parse(sessionStorage.getItem('documents')) : null
});
return {
subscribe,
set,
load: async ( queries ,limit, offset) => {
try {
const database = new Databases(client, server.database);
const response = database.listDocuments(
server.collection, // We imported server from the appwrite.js store
queries,
limit,
offset,
undefined,
undefined,
['created_at'],
['DESC']
);
set({
response
});
} catch (error) {
// Handle the error
}
}
};
}
Итак, с помощью этой функции мы проверяем, есть ли данные в хранилище сеанса, и устанавливаем на него ответ.
Где мой кеш? 😕
У нас есть небольшая проблема: мы еще ничего не сохранили в нашем кеше!
К счастью для нас, это довольно просто:
if (browser) {
documentsList.subscribe((n) => sessionStorage?.setItem('documents', JSON.stringify(n.response ?? '')));
}
Мы просто подписываемся на магазин и сохраняем данные в хранилище сессий каждый раз, когда они меняются.
✅ установить, ✅ подписаться, 🔧 загрузить
Теперь у нас другая проблема! Данные установлены, и наш кеш всегда актуален… но данные никогда не меняются!
Вот для чего нужна «загрузка» ;)
Например, в нашем компоненте мы можем сделать что-то вроде этого:
<script>
import { documentsList } from './store';
let queries, limit, offset
$: documentsList.load(queries, limit, offset);
</script>
{#if $documentsList?.response?.total}
{#each $documenstList.response.document as document}
<pre>{document}</pre>
{/each}
{/if}
Таким образом, каждый раз, когда один из аргументов, переданных для «загрузки», изменяется, данные будут обновляться!
И теперь у нас есть магазин Appwrite с кэшированными данными!
Собираем все вместе 🙌
import { client, server } from './appwrite';
import { Databases } from 'appwrite';
import { writable } from 'svelte/store';
import { browser } from '$app/env';
function createDocumentsListStore() {
const { subscribe, set } = writable({
response: browser ? JSON.parse(sessionStorage.getItem('documents')) : null
});
return {
subscribe,
set,
load: async ( queries ,limit, offset) => {
try {
const database = new Databases(client, server.database);
const response = database.listDocuments(
server.collection,
queries,
limit,
offset,
undefined,
undefined,
['created_at'],
['DESC']
);
set({
response
});
} catch (error) {
// Handle the error
}
}
};
}
export const documentsList = createDocumentsListStore();
if (browser) {
documentsList.subscribe((n) => sessionStorage?.setItem('documents', JSON.stringify(n.response ?? '')));
}
🏁 Заключение
И это все, что нужно для реализации пользовательского компактного магазина с Appwrite и кэшированием. Вы также можете просмотреть следующие ресурсы, если хотите продолжить изучение Appwrite: