Рубрики
Без рубрики

Кэширование сетевых запросов на Frontend

Привет, люди! Первый пост на dev.to! Я резкий. Я обучающий полный стек Develo … Теги с JavaScript, CodeNewie, React, WebDev.

Привет, люди!

Первый пост на dev.to!

Я резкий. Я изучающий полный разработчик стека, пытаясь завоевать знания. Сегодня я буду учиться с вами, как кэшировать сетевые запросы на интерфейс. Кодекс обсуждается здесь, доступен на GitHub AS API-кэш-пример Отказ Я писал небольшое приложение, где я выбираю некоторые временные метки от моей собственной бэкинги. Это было приложение среднего размера, состоящее из реагирования и Redux, написанного в Teadercript. Я использовал Axios в качестве моего HTTP-клиента. (Просто побочная записка, этот код находится в типографии, но может быть легко расширен до JavaScript, следуя аналогичным идеям. ) Я действительно действительно хотел кэшировать мои запросы на клиенту, чтобы мне не пришлось делать повторные звонки на мой API. Я подумал о простом решении и начал реализовать его, используя перехватчики . Идея была очень проста. Есть кеш, который может хранить объекты любого типа. Затем невернируйте их, если они хранятся на период дольше, чем период кэширования. Просто, верно? Давайте реализуем это, то! Во-первых, мы будем создавать кэш. Мы создадим файл с именем Cacheehandler.ts Отказ Что мы должны иметь здесь? Давайте подумаем логически. Кэш должен обрабатывать два запроса ->

  1. хранить.
  2. получить, если действительно действителен.

Итак, давайте сделаем две функции, магазин () и IsValid Отказ

function store(key: string, value: string) {
    const finalValue = `${value}${SEPARATOR}${Date.now().toString()}`;
    localStorage.setItem(key, finalValue);
}
function isValid(key: string): IsValidResponse {
    const value = localStorage.getItem(key);
    if (value === null) {
        return {
            isValid: false,
        };
    }
    const values = value.split(SEPARATOR);
    const timestamp = Number(values[1]);
    if (Number.isNaN(timestamp)) {
        return {
            isValid: false,
        };
    }
    const date = new Date(timestamp);
    if (date.toString() === 'Invalid Date') {
        return {
            isValid: false,
        };
    }
    if ((Date.now() - date.getTime()) < CACHE_INTERVAL) {
        return {
            isValid: true,
            value: values[0],
        };
    }
    localStorage.removeItem(key);
    return {
        isValid: false,
    };
}

Если вы посмотрите внимательно, IsValid Возвращает ответ типа IsValidResponse , который показан ниже:

interface IsValidResponse {
    isValid: boolean,
    value?: string,
}

Мы упускаем константы, поэтому давайте добавим это:

const SEPARATOR = '//**//';
const CACHE_INTERVAL = 0.2 * 60 * 1000;

магазин () Это очень простая функция, которая принимает строку, добавляет сепаратор и текущую дату после этого и хранит его в локальной табличке. Это позволяет Isvalid () Чтобы получить данные и дату, разделение на сепаратор. Теперь нам нужно проверить, недействите ли дата недействительна или не истеклона, и мы можем отправить логию, которая говорит абонеру, что кэш еще не является недействительным, и мы можем его использовать. Теперь, что мы должны использовать как ключ Для хранения объекта в LocalStorage? Мы будем ответить на это в ближайшее время. Вы можете обратиться к файлу напрямую, здесь Отказ Теперь на клиент Axios. Сначала мы создаем клиент:

export const client = axios.create({ baseURL: 'http://localhost:8080/api/widget', withCredentials: true });

BaseUrl Может быть что угодно, основанное на том, где вы хотите отправить запрос. У меня есть сервер в порту 8080, который возвращает объект JSON с сегодняшней погодой, но вы можете использовать любой API, действительно. Теперь мы добавляем перехватчики:

client.interceptors.request.use((request) => requestHandler(request));
client.interceptors.response.use(
    (response) => responseHandler(response),
    (error) => errorHandler(error),
);
const whiteList = ['weather'];

function isURLInWhiteList(url: string) {
    return whiteList.includes(url.split('/')[1]);
}

function responseHandler(response: AxiosResponse): AxiosResponse {
    if (response.config.method === 'GET' || 'get') {
        if (response.config.url && !isURLInWhiteList(response.config.url)) {
            console.log('storing in cache');
            cache.store(response.config.url, JSON.stringify(response.data));
        }
    }
    return response;
}

function errorHandler(error: any) {
    if (error.headers.cached === true) {
        console.log('got cached data in response, serving it directly');
        return Promise.resolve(error);
    }
    return Promise.reject(error);
}

function requestHandler(request: AxiosRequestConfig) {
    if (request.method === 'GET' || 'get') {
        const checkIsValidResponse = cache.isValid(request.url || '');
        if (checkIsValidResponse.isValid) {
            console.log('serving cached data');
            request.headers.cached = true;
            request.data = JSON.parse(checkIsValidResponse.value || '{}');
            return Promise.reject(request);
        }
    }
    return request;
}

Whew, много кода просто побежал мимо! Во-первых, давайте посмотрим на IsurlinwhiteList . Это просто так, чтобы мы могли заблокировать несколько URL-адресов, чтобы не хранить в кэше. Это может использоваться с маршрутами аутентификации. Теперь, на Открытый игрок Отказ Первый, если используется для проверки, если Получить Запрос был сделан.

if (response.config.method === 'GET' || 'get')

Если да, то URL не в белом?

if (response.config.url && !isURLInWhiteList(response.config.url))

Если эти условия будут выполнены, просто сохраните объект в кеше с ключом, как URL запроса. Теперь мы будем работать на RequestHandler первый. Первый, если используется для проверки, если Получить Запрос был сделан.

if (response.config.method === 'GET' || 'get')

Затем проверьте, был ли Cache действителен

const checkIsValidResponse = cache.isValid(request.url || '');
if (checkIsValidResponse.isValid) 

Если да, это означает, что кеш все еще действителен, и мы можем просто служить этому вместо того, чтобы отправить ответ! Итак, добавьте заголовок к запросу, названо кэшированный ( Это может быть что-нибудь, это мои личные предпочтения ) и установили его на правду.

request.headers.cached = true;

Установите данные запроса здесь только в кэш

request.data = JSON.parse(checkIsValidResponse.value || '{}');

А потом, Обещание. Возрасти запрос. Почему? Это сделано, потому что тогда этот запрос отправляется на ErrorHandler немедленно. Здесь мы можем просто проверить, есть ли у нас кэшированный заголовок Если да, это означает, что данные кэшируются, а не реальная ошибка. Иначе мы могли просто отклонить ошибку. Так что это то, что мы делаем.

function errorHandler(error: any) {
    if (error.headers.cached === true) {
        console.log('got cached data in response, serving it directly');
        return Promise.resolve(error);
    }
    return Promise.reject(error);
}

Если кэшированный заголовок присутствует, мы возвращаем Обещание Таким образом, при том, что Axios относится к тому, что никакая ошибка никогда не произошла, и мы получаем эти данные внутри .then вместо .catch Отказ Итак, Получить абонент Никогда не знал, что кэширование происходит за кулисами! И если это какая-либо другая ошибка, просто верните Обещание. Возрасти вместо этого, так что это ведет себя как нормальная ошибка! Теперь разве это не умно? Я использовал этот дизайн в приложении React, который выглядел как следующее:

1604 мс к колоссальному 3 мс. . То есть 535 раз быстрее, чем не кэшированная версия. И изменив константу Cache_interval. , мы можем изменить, как долго кэш должен оставаться подтвержденным. Вы можете оформить заказ проекта в мой аккаунт Github

Один последний вопрос перед отъездом. Как я могу использовать это с принести ? Ну, некоторые вопросы должны быть оставлены для читателя ответить на себя. В противном случае, какова цель обучения?

Оригинал: “https://dev.to/nosyminotaur/caching-network-requests-on-the-frontend-dmh”