В этой статье мы рассмотрим различные подходы к хранению на стороне клиента в браузере и подробно обсудим API веб-хранилища.

В этой статье мы рассмотрим различные подходы к хранению на стороне клиента в браузере и подробно обсудим API веб-хранилища.

18-10-2020 09:35:59

Нужен ли веб-серверу доступ к данным?



Да -> использовать куки
Нет -> перейти к следующему вопросу
Как долго должны храниться данные?
Пока пользователь не очистит свой кэш -> использовать локальное хранилище
Пока пользователь не закроет свое окно или вкладку -> использовать Session Storage


Печенье


До HTML5 куки были единственным способом локально хранить данные в браузере. Они обычно используются для таргетированной рекламы, настроек и управления сеансами. Для широкой поддержки браузера рекомендуется не превышать 50 файлов cookie на домен и общий размер файлов cookie 4 КБ.

Важно помнить, что файлы cookie отправляются в заголовке каждого запроса к этому домену. Таким образом, все, что мы устанавливаем на стороне клиента, будет передаваться серверу при всех последующих запросах. Иногда это именно то, что мы хотим, а иногда это не нужно.

Ниже приведен скриншот файлов cookie, которые мы получаем при посещении stackoverflow.com:

Если мы посмотрим на последующий HTTP-запрос к сайту, мы увидим, что эти файлы cookie были включены в заголовок:

Файлы cookie по-прежнему широко распространены в Интернете, но у нас есть несколько других доступных вариантов.

Более подробную информацию о файлах cookie можно найти в этой предыдущей статье: « Давайте поговорим о файлах cookie HTTP».

Локальное хранилище и хранилище сессий


HTML5 представила API-интерфейс веб-хранилища, который разработчики могут использовать для хранения данных в браузере. Это два варианта: локальное хранилище и хранилище сеансов .

Как и файлы cookie, они хранятся в парах ключ / значение, состоящих из строк, и являются уникальными для каждого домена.

В отличие от куки, они вообще не отправляются на сервер. Они могут быть удалены разработчиком с помощью JavaScript или пользователем в настройках браузера.

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

    Вот несколько примеров использования:


  • Хранение пользовательских настроек просмотра для сайта, который отображает много данных и диаграмм

  • Сохранение значения для идентификации подписчиков списка рассылки, чтобы мы не отображали форму регистрации для существующих подписчиков

  • Хранение информации о местоположении, чтобы мы могли отображать региональный контент, относящийся к пользователю

  • Хранение содержимого корзины, пока пользователь просматривает

  • Сохранение данных о прогрессе для игры HTML5


  • Оффлайн-приложения


    Короче говоря, это полезно для хранения данных, которые должны быть прочитаны на стороне клиента и которые не обязательно заботятся о сервере.

    Mетоды


    Локальное хранилище и хранилище сеансов расширяют прототип хранилища, поэтому у них одинаковые методы.

    > Object.getPrototypeOf(localStorage);
    Storage {key: function, getItem: function, setItem: function, removeItem: function…}

    > Object.getPrototypeOf(sessionStorage);
    Storage {key: function, getItem: function, setItem: function, removeItem: function…}
    Давайте посмотрим на этот прототип:

    Storage {key: function, getItem: function, setItem: function, removeItem: function…}
    clear:function clear()
    constructor:function Storage()
    getItem:function getItem()
    key:function key()
    length:(...)

    removeItem:function removeItem()
    setItem:function setItem()
    Symbol(Symbol.toStringTag):"Storage"
    get length:function ()
    __proto__:Object

    setItem (ключ, значение)
    localStorage.setItem('countryCode', 'us');
    GetItem (ключ)
    let countryCode = localStorage.getItem('countryCode');

    Проверьте, существует ли ключ
    Это рекомендуемый подход для проверки наличия ключа:

    if (localStorage.getItem('countryCode') !== null) {
    let countryCode = localStorage.getItem('countryCode');
    // do something with countryCode
    }


    Другой популярный подход



    if (localStorage.countryCode) { }
    Тем не менее, этот подход не рекомендуется, потому что пустые строки в JavaScript являются ложными.

    Давайте посмотрим на пример, который иллюстрирует этот момент.

    Если мы установим имя в пустую строку, давайте посмотрим, как мы получаем разные ответы:

    localStorage.setItem('name','');
    let existsCheck1 = ( localStorage.getItem('name') !== null ) ? true : false; // true
    let existsCheck2 = ( localStorage.name ) ? true : false; // false
    В строке 1 мы устанавливаем имя в пустую строку.

    В строке 2 мы объявляем логическое значение, которое использует нулевую проверку getItem (), чтобы определить, существует ли ключ. Это правильно оценивает как истинное.

    В строке 3 мы объявляем еще один логический объект, который использует прямой доступ к свойству. Это оценивается как ложное, даже если у нас есть элемент, который имеет ключ = имя.

    Здесь есть интересное обсуждение StackOverflow о достоинствах каждого из них:

    https://stackoverflow.com/questions/12632463/is-localstorage-getitemitem-better-than-localstorage-item-or-localstoragei

    RemoveItem (ключ)


    localStorage.removeItem('countryCode');

    Clear



    localStorage.clear();
    Обходной путь для хранения объектов
    Ранее мы упоминали, что Storage API поддерживает только строки. К счастью, есть обходной путь для хранения объектов.

    Мы можем сериализовать наш объект в строку, используя JSON.stringify () :

    let obj = { name: 'Amir Boroumand', id: 500 };
    localStorage.setItem('user', JSON.stringify(obj));
    Чтобы вернуть наш объект, мы используем JSON.parse () :

    obj = JSON.parse(localStorage.getItem('user'));
    Существуют даже библиотеки-оболочки, такие как Lockr, которые немного упрощают хранение сложных объектов.

    Пределы размера


    Спецификация HTML рекомендует поставщикам браузеров выделять 5 МБ на домен для каждой области хранения.

    Некоторые браузеры позволяют настраивать этот размер. В Firefox мы можем перейти к: config и искать dom.storage.default_quota. Невозможно изменить квоты для Chrome / Safari / IE.

    API хранилища выдает исключение, когда мы пытаемся сохранить элемент в полную область:

    try {
    localStorage.setItem('max', 'Fill it up');
    } catch (e) {
    console.error('Error: ', e);
    }

    Ошибка: DOMException: не удалось выполнить 'setItem' для 'Storage': установка значения 'max' превысила квоту.

    Безопасность


    API веб-хранилища подчиняется той же политике происхождения . Эта политика определяет, какие сайты могут получить доступ к каким данным на основе URL.

    Страницы имеют одинаковое происхождение, если схема, хост и порт совпадают.

    Давайте предположим, что страница https://company.com/contactсохраняет элемент в локальном хранилище:
    localStorage.setItem('contact-date', new Date);

    Вот таблица, которая показывает, могут ли другие URL-адреса получить доступ к этому элементу:

    URL Доступ причина
    https://company.com/products да Та же схема, хост и порт
    https://company.com/division/contact да Та же схема, хост и порт
    http://company.com/about нет Другая схема
    https://app.company.com/login нет Другой хост
    https://company.com:8443/login нет Другой порт
    Это может создать проблему для сайтов, которые все еще подают контент по HTTP и HTTPS, поскольку браузер считает, что они имеют различное происхождение.

    Производительность


    Веб-хранилище является синхронным по своей природе, что означает, что оно может блокировать рендеринг страниц. Обычно это не проблема, потому что мы храним небольшие фрагменты данных, но о чем следует помнить.


    САМОЕ ОБСУЖДАЕМОЕ

    ...
    Титан в воздухе
    18-10-2020 09:35:58
    Это не самолет – это Мрия!!!...
    ...
    Лучшие бюджетные ноутбуки на 2020 год
    18-10-2020 09:35:59
    Как выбрать лучший ноутбук в 2020 году...
    ...
    Технологические тенденции в 2020 году
    18-10-2020 09:35:59
    Технологи будущего уже сегодня...
    ...
    Самостоятельная поездка автомобиля под управлением искусственного интеллекта
    18-10-2020 09:35:58
    Самый далекий перезд без водителя в истории искуственного интеллекта....
    ...
    Ford Bronco наконец дебютирует 9 июля
    18-10-2020 09:35:58
    После задержек, связанных с коронавирусом, у долгожданной Бронко Форда официально объявлена ​​дата....
    ...
    Tesla Semi готова к «массовому производству»
    18-10-2020 09:35:58
    Но генеральный директор не указал точные сроки начала производства электрического грузовика....
    ...
    25 самых продаваемых легковых автомобилей, грузовиков и внедорожников 2020 года (пока)
    18-10-2020 09:35:58
    Хотя пандемия коронавируса привела к хаосу в продажах автомобилей, мы подсчитали рейтинг самых продаваемых в первом квартале....
    ...
    Электрический Mustang
    18-10-2020 09:35:58
    Ford представляет электрический Mustang с «потрясающим» ускорением...
    ...
    Cамые большие дизайнерские моменты 2018 года
    18-10-2020 09:35:59
    Мы попросили дизайнеров рассказать нам, что они считают самой важной вещью, которая произошла в отрасли в этом году....
    ...
    Airtable
    18-10-2020 09:35:59
    Простая в использовании система управления реляционными базами данных...

    НАШИ РЕКОМЕНДАЦИИ

    Toyota Supra в 2021 году
    Toyota Supra в 2021 году
    Toyota Supra 2020 года не получит дооснащения, чтобы соответствовать увеличению мощности в 2021 году...
    9 различных вариантов использования console log
    9 различных вариантов использования console log
    Каждый из нас использовал console.logдля отладки больше, чем нам хотелось бы признать....
    Расслабление, снятие стресса и развитие сознания
    Расслабление, снятие стресса и развитие сознания
    Иногда в жизни бывают дни.......
    Послушай других и сделай наооборот
    Послушай других и сделай наооборот
    Основатель Tesla и SpaceX воплотил в жизнь одну идею, противоречащую общепринятому мнению, и это помогло ему заработать миллиарды....
    Красный флаг или работа не Вашей мечты.
    Красный флаг или работа не Вашей мечты.
    В последнее время развелось (были всегда) много организаций на рынке - которые надо обходить стороной....


    ИНТЕРЕСНОЕ

    Понимание карты и набора в JavaScript
    Понимание карты и набора в JavaScript
    Эта статья была изначально написана для DigitalOcean ....
    Lazareth Wazuma от Феррари
    Lazareth Wazuma от Феррари
    Lazareth Wazuma V8F Quad – Engine By Ferrari...
    20 самых важных секретов настоящих отношений
    20 самых важных секретов настоящих отношений
    Не простые отношения между женщинами и мужчинами...
    Работа в Швеции
    Работа в Швеции
    Компании в Швеции переходят на 6-часовые рабочие дни и добиваются удивительных результатов...


    ЛУЧШИЕ РЕЙТИНГИ

    Набор массы
    Набор массы
    Базовые принципы для новичков
    Ежедневные 15-минутные прогулки способны кардинально изменить ваше тело
    Ежедневные 15-минутные прогулки способны кардинально изменить ваше тело
    Всем известно, как положительно влияют на организм...
    Правила для наращивания мышечной массы
    Правила для наращивания мышечной массы
    Зная интенсивность физических упражнений...
    Раскачать грудь
    Раскачать грудь
    Обычно грудные растут хорошо у тех...

    АКТУАЛЬНОЕ

    Будущее уже с нами Galaxy Fold
    CEO продвижение
    Отношения с мужчинами
    Раздевалка
    Лишь плохие начальники ожидают от своих подчиненных постоянной занятости
    Как научиться читать быстрее
    Выбирай того, кто ежедневно пишет тебе «С добрым утром»
    США скрывают правду о пришельцах
    Свечение от ракеты SpaceX американцы приняли за НЛО
    Путешествие из Австрии в Италию

    ЧИТАЙТЕ ТАКЖЕ

    18-10-2020 09:35:59 (120052)
    Какую одежду носят манхэттенские модницы летом
    Возможно эта новость тебе еще неизвестна
    18-10-2020 09:35:59 (120050)
    Время сгибаемых смартфонов еще не пришло
    Эксперт по технологиям издания Mashable Стэн Шредер написал колонку...
    18-10-2020 09:35:59 (120049)
    Успешные стартапы, которые начинали как сторонние проекты
    Apple, Facebook, Google, SpaceX ...
    18-10-2020 09:35:59 (120051)
    Надо стараться быть с теми, кто к нам хорошо относится
    Маленький гимназист очень плохо учился...
    18-10-2020 09:35:59 (120044)
    Стопроцентная диета для похудения или питание наоборот
    Сделай все наоборот....
    18-10-2020 09:35:59 (120046)
    Невероятная 12-месячная трансформацией тела
    Звезда фитнеса из Сиднея Софи Аллен рассказывает о своей трансформации..