У меня есть немного эгоистичные причины для написания этой статьи; Я никогда не могу вспомнить все механизмы хранения на стороне клиента, доступные разработчикам HTML5! Я, возможно, забыл некоторые сейчас …
Зачем хранить данные на клиенте?
Основная причина — практичность. Код JavaScript, работающий в браузере, не обязательно должен отправлять всю информацию на сервер. Есть несколько вариантов использования:
- Вы хотите увеличить производительность. Вы можете кэшировать данные на стороне клиента, чтобы их можно было извлечь без дополнительных запросов к серверу.
- У вас есть большое количество данных только на стороне клиента, например, строки HTML или параметры конфигурации виджета.
- Вы хотите, чтобы ваше приложение работало в автономном режиме.
Давайте посмотрим варианты.
Переменные JavaScript (прошлое, настоящее и будущее)
Самый простой выбор — переменные JavaScript. Может быть целесообразно создать единую глобальную переменную для хранения данных приложения, например
// global application storage var appDataStore = {}; // set values appDataStore.hello = "Hello World!"; appDataStore.info = { a:1, b:2, c:3 }; // retrieve values console.log(appDataStore.hello); console.log(appDataStore.info.b);
Также возможно хранить значения в DOM страницы в виде атрибутов или свойств узла. Это может быть полезно для значений виджетов, но медленнее и рискованнее, чем переменные JavaScript; будущие браузеры или другие библиотеки могут интерпретировать ваши данные неожиданным образом.
// store data in node var mywidget = document.getElementById("mywidget"); mywidget.setAttribute("data-myvalue", "Hello World!"); // retrieve values mywidget.textContent = mywidget.getAttribute("data-myvalue");
Преимущества переменных JavaScript:
- самое быстрое и простое решение
- нет необходимости сериализации или десериализации данных
- идеально подходит для одностраничных приложений
Недостатки:
- очень хрупкий — ссылки в другом месте, обновление или закрытие вкладки сотрет все данные
- глобальные переменные могут быть перезаписаны и проанализированы сторонними скриптами.
Cookies (прошлое, настоящее и будущее)
Файлы cookie — это доменные фрагменты текстовых данных. Они звучат вкусно, но обработка cookie неудобна в JavaScript, так как базовая строка document.cookie
должна быть проанализирована, например
// store cookie data document.cookie = "hello=" + escape("Hello World") + "; path=/"; // retrieve value cookies = document.cookie.split(";"), value = null, regexp = new RegExp("^\s*hello=(.*)$"); for (var c = 0; c < cookies.length && !value; c++) { var match = cookies[c].match(regexp); if (match.length == 2) value = unescape(match[1]); } console.log(value);
Преимущества печенья:
- надежный метод сохранения состояния между клиентом и сервером
- установив дату окончания срока действия, данные cookie сохранятся и после обновления страницы и закрытия вкладки
- куки поддерживаются во всех современных браузерах
Недостатки:
- Неуклюжая реализация JavaScript — вам понадобится библиотека для обработки куки
- значения являются только строками — другие данные должны быть сериализованы с использованием таких методов, как
JSON.stringify
иJSON.parse
- пространство для хранения файлов cookie ограничено — не зависит от наличия более 20 файлов cookie размером 4 КБ каждый
- куки могут быть удалены или заблокированы
- куки были несправедливо помечены как угроза конфиденциальности в Интернете; Возможно, вам придется соблюдать причудливые региональные правила и нормы .
Обратная сторона совместного использования файлов cookie клиент / сервер вызывает самую большую техническую проблему. Данные cookie отправляются в заголовке HTTP каждого запроса и ответа. Поэтому он добавляется к каждой странице HTML, изображению, файлу CSS, файлу JavaScript, вызову Ajax и т. Д. Если у вас есть 50 КБ данных cookie и загружено десять 1 КБ изображений, это приведет к одному мегабайту дополнительного сетевого трафика.
window.name (прошлое и настоящее)
Свойство window.name
немного странно. Вы можете установить одно строковое значение, которое сохраняется между обновлениями браузера или ссылками в другом месте и щелчком назад, например
window.name = "Hello World!"; console.log(window.name);
Преимущества window.name
:
- прост в использовании
- данные хранятся только на клиенте и никогда не отправляются на сервер
- собственность разрешает несколько мегабайт информации
- широкая поддержка браузера
Недостатки:
- данные теряются при закрытии вкладки или браузера
- может быть сохранено только одно строковое значение — потребуется сериализация
- страницы в других доменах могут читать или изменять данные
window.name
— никогда не используйте их для конфиденциальной информации
window.name
никогда не был предназначен для хранения данных. Это взлом, и поставщики могут отказаться от поддержки в любое время. По этой причине лучше использовать альтернативные варианты хранения, хотя эта технология была принята в устаревших оболочках браузера и полифиллах.
См. Также: Как написать библиотеку сессий без файлов cookie для JavaScript.
HTML5 Web SQL Database (в прошлом)
База данных Web SQL была первоначальной попыткой поставщиков перенести реляционные базы данных на основе SQL в браузер. Он был реализован в Chrome, Safari и Opera 15+, но Mozilla и Microsoft выступили против IndexedDB .
Преимущества базы данных Web SQL:
- разработан для надежного хранения и доступа к данным на стороне клиента
- он использует SQL, как и многие серверные приложения
- некоторая поддержка в настольных и мобильных браузерах Webkit / Blink
Недостатки:
- SQL никогда не подходил для разработки на стороне клиента
- схема базы данных должна быть определена заранее
- поддержка маргинального браузера, и команды Webkit / Blink могут в конечном итоге отбросить его
- спецификация W3C была отменена в 2010 году
В итоге: не используйте базу данных Web SQL !
Смотрите также: Спецификация базы данных W3C Web SQL
HTML5 Web Storage (настоящее и будущее)
Веб-хранилище предоставляет два объекта с одинаковыми API: window.localStorage
для сохранения постоянных данных и code.sessionStorage
для сохранения данных code.sessionStorage
для сеанса, которые теряются при закрытии вкладки. Специфичные для домена строки хранятся с использованием пар имя / значение. В отличие от файлов cookie, ограничение хранилища намного больше (не менее 5 МБ), и информация никогда не передается на сервер.
// is localStorage available? if (typeof window.localStorage != "undefined") { // store localStorage.setItem("hello", "Hello World!"); // retrieve console.log(localStorage.getItem("hello")); // delete localStorage.removeItem("hello"); }
Преимущества веб-хранилища:
- прост в использовании с простыми парами имя / значение
- Доступны параметры сеанса и постоянного хранения.
- доступна модель событий для синхронизации других вкладок и окон
- широкая поддержка настольных и мобильных браузеров, включая IE8 +
- Полифиллы веб-хранилища доступны для старых браузеров, которые используют методы хранения файлов cookie и
windows.name
Недостатки:
- только строковые значения — может потребоваться сериализация
- неструктурированные данные без транзакций, индексации или поиска
- может показывать плохую производительность на больших наборах данных
Смотрите также:
HTML5 IndexedDB (Будущее)
IndexedDB предоставляет структурированное, транзакционное, высокопроизводительное NoSQL-подобное хранилище данных с синхронным и асинхронным API. Здесь слишком много документов, но API позволяет создавать базы данных, хранилища данных и индексы, обрабатывать изменения, заполнять данные транзакциями, выполнять неблокирующие запросы и проходить через наборы данных с помощью курсоров.
Преимущества IndexedDB:
- разработан для надежного хранения и доступа к данным на стороне клиента
- хорошая поддержка в современных настольных браузерах: IE10 +, Firefox 23+, Chrome 28+ и Opera 16+
Недостатки:
- API очень новый и подлежит пересмотру
- небольшая поддержка в старых и мобильных браузерах
- большой и сложный API — было бы сложно и в значительной степени нецелесообразно создавать polyfill IndexedDB
- Как и в любом хранилище NoSQL, данные неструктурированы, что может привести к проблемам целостности
Смотрите также:
HTML5 File API (будущее)
Файловый API HTML5 расширяется для поддержки записи, а также чтения последовательных данных в локальной файловой системе. Ваш домен снабжен полной изолированной иерархической файловой системой для использования по своему усмотрению.
Преимущества HTML5 File API:
- большие текстовые и двоичные файлы могут быть созданы и сохранены
- производительность должна быть хорошей
Недостатки:
- очень ранняя спецификация, которая подлежит пересмотру
- очевидная угроза безопасности, если запись файла не ограничена
- небольшая поддержка в современных браузерах и полифиллах может быть непрактичной
- неструктурированные данные без транзакций, индексации или поиска
Смотрите также:
Резюме
Там у нас это есть — не менее семи вариантов хранения. Мои прагматичные рекомендации на данный момент:
- Переменные JavaScript всегда будут необходимы, но используйте их только для изменчивых данных в памяти. Избегайте атрибутов / свойств DOM, когда это возможно.
- Предполагая, что это необходимо, используйте куки для сохранения состояния между клиентом и сервером. Но держите печенье маленьким; одного токена с несколькими символами должно быть достаточно.
- Используйте HTML5 Web Storage для хранения данных в автономном режиме или когда требуются большие объемы информации только на стороне клиента.
- Если вам необходимо поддерживать более старые браузеры, такие как IE6 и IE7, используйте полизаполнение веб-хранилища, которое реализует API с использованием файлов cookie и
window.name
. - Следите за IndexedDB ; со временем он станет жизнеспособным механизмом хранения, когда устаревшие браузеры вымирают.
- Аналогично, File API будет становиться все более практичным для хранения неструктурированных данных. Возможно, это лучшее решение для сгенерированных двоичных данных, таких как изображения, аудио, видео и PDF.
Или, может быть, у вас есть дальнейшие мысли?
Комментарии к этой статье закрыты. У вас есть вопрос о HTML5? Почему бы не спросить об этом на наших форумах ?