HTML5 Local Storage API (часть веб-хранилища) имеет отличную поддержку браузера и используется во все большем количестве приложений. Он имеет простой API и, безусловно, имеет свои недостатки, аналогично куки-файлам.
За последний год или около того я наткнулся на довольно много инструментов и библиотек, которые используют API localStorage, поэтому я собрал многие из них вместе в этом посте с некоторыми примерами кода и обсуждением функций.
Lockr
Lockr — это оболочка для localStorage API и позволяет вам использовать ряд полезных методов и функций. Например, хотя localStorage ограничен хранением только строк, Lockr позволяет хранить разные типы данных без необходимости выполнять преобразование самостоятельно:
Lockr.set('website', 'SitePoint'); // string
Lockr.set('categories', 8); // number
Lockr.set('users', [{ name: 'John Doe', age: 18 }, { name: 'Jane Doe', age: 19 }]);
// object
Другие функции включают в себя:
- Получить все пары ключ / значение с помощью
Lockr.get()
- Скомпилируйте все пары ключ / значение в массив с помощью
Lockr.getAll()
- Удалите все сохраненные пары ключ / значение с помощью
Lockr.flush()
- Добавить / удалить значения под ключом хеша с помощью
Lockr.sadd
Lockr.srem
Мост локального хранилища
Библиотека размером 1 КБ для облегчения обмена сообщениями между вкладками в одном браузере с использованием localStorage в качестве канала связи. После включения библиотеки, вот пример кода, который вы можете использовать:
// send a message
lsbridge.send('my-namespace', {
message: 'Hello world!'
});
// listen for messages
lsbridge.subscribe('my-namespace', function(data) {
console.log(data); // prints: 'Hello world!'
});
Как показано, метод send()
subscribe()
Вы можете прочитать больше о библиотеке в этом посте .
амбар
Эта библиотека предоставляет Redis- подобный API с «быстрым, атомарным постоянным уровнем хранения» поверх localStorage. Ниже приведен пример фрагмента кода, взятого из README репозитория. Он демонстрирует многие из доступных методов.
var barn = new Barn(localStorage);
barn.set('key', 'val');
console.log(barn.get('key')); // val
barn.lpush('list', 'val1');
barn.lpush('list', 'val2');
console.log(barn.rpop('list')); // val1
console.log(barn.rpop('list')); // val2
barn.sadd('set', 'val1');
barn.sadd('set', 'val2');
barn.sadd('set', 'val3');
console.log(barn.smembers('set')); // ['val1', 'val2', 'val3']
barn.srem('set', 'val3');
console.log(barn.smembers('set')); // ['val1', 'val2']
Другие функции API включают возможность получения диапазонов с начальными / конечными значениями, получение массива элементов и сжатие всего хранилища данных для экономии места. В репо есть полное описание всех методов и того, что они делают.
store.js
Это еще одна оболочка, похожая на Lockr, но на этот раз она обеспечивает более глубокую поддержку браузера через запасные варианты. В README объясняется, что «store.js использует localStorage, когда он доступен, и использует поведение userData в IE6 и IE7. Нет вспышки, чтобы замедлить загрузку страницы. Нет файлов cookie, чтобы удовлетворить запросы вашей сети ».
Базовый API объясняется в комментариях в следующем коде:
// Store 'SitePoint' in 'website'
store.set('website', 'SitePoint');
// Get 'website'
store.get('website');
// Remove 'website'
store.remove('website');
// Clear all keys
store.clear();
Кроме того, есть еще несколько дополнительных функций:
// Store an object literal; uses JSON.stringify under the hood
store.set('website', {
name: 'SitePoint',
loves: 'CSS'
});
// Get the stored object; uses JSON.parse under the hood
var website = store.get('website');
console.log(website.name + ' loves ' + website.loves);
// Get all stored values
console.log(store.getAll());
// Loop over all stored values
store.forEach(function(key, val) {
console.log(key, val);
});
README в репозитории GitHub содержит множество подробностей о глубине поддержки браузеров и возможных ошибках и ловушках (например, тот факт, что некоторые браузеры не разрешают локальное хранилище в частном режиме).
lscache
lscache — еще одна оболочка localStorage, но с несколькими дополнительными функциями. Вы можете использовать его как простой API-интерфейс localStorage или использовать функции, эмулирующие Memcached , систему кеширования объектов памяти.
lscache предоставляет следующие методы, описанные в комментариях к коду:
// set a greeting with a 2 minute expiration
lscache.set('greeting', 'Hello World!', 2);
// get and display the greeting
console.log(lscache.get('greeting'));
// remove the greeting
lscache.remove('greeting');
// flush the entire cache of items
lscache.flush();
// flush only expired items
lscache.flushExpired();
Как и предыдущая библиотека, эта также заботится о сериализации, поэтому вы можете хранить и извлекать объекты:
lscache.set('website', {
'name': 'SitePoint',
'category': 'CSS'
}, 4);
// retrieve data from the object
console.log(lscache.get('website').name);
console.log(lscache.get('website').category);
И, наконец, lscache позволяет разбивать данные на «сегменты». Посмотрите на этот код:
lscache.set('website', 'SitePoint', 2);
console.log(lscache.get('website')); // 'SitePoint'
lscache.setBucket('other');
console.log(lscache.get('website')); // null
lscache.resetBucket();
console.log(lscache.get('website')); // 'SitePoint'
Обратите внимание, что во втором журнале результат равен null
Это потому, что я установил пользовательское ведро до регистрации результата. После того, как я установил корзину, все, что было добавлено в lscache до этой точки, будет недоступно, даже если я попытаюсь очистить его. Только предметы в «другом» ведре являются доступными или сбрасываемыми. Затем, когда я перезагружаю ведро, я снова могу получить доступ к своим исходным данным.
secStore.js
secStore.js — это API для хранения данных, который добавляет дополнительный уровень безопасности с помощью крипто-библиотеки Stanford Javascript . secStore.js позволяет вам выбрать способ хранения: localStorage, sessionStorage или cookie. Чтобы использовать secStore.js, вы также должны включить вышеупомянутую библиотеку sjcl.js.
Вот пример, демонстрирующий, как сохранить некоторые данные с параметром encrypt
var storage = new secStore;
var options = {
encrypt: true,
data: {
key: 'data goes here'
}
};
storage.set(options, function(err, results) {
if (err) throw err;
console.log(results);
});
Обратите внимание на используемый метод set()
Затем мы можем использовать метод get()
storage.get(options, function(err, results) {
if (err) throw err;
console.log(results.key); // Logs: "data goes here"
});
Если вы хотите использовать сессионное хранилище или файлы cookie вместо локального хранилища с secStore.js, вы можете указать это в параметрах:
var options = {
encrypt: true,
storage: 'session', // or 'cookies'
data: {
key: 'data here'
}
};
localForage
Эта библиотека, созданная Mozilla, предоставляет простой API-интерфейс, подобный localStorage, но использует асинхронное хранилище через IndexedDB или WebSQL. API точно такой же, как localStorage ( getItem()
setItem()
Так, например, если вы установите или получите значение, вы не получите возвращаемое значение, но вы можете работать с данными, которые передаются в функцию обратного вызова, и (необязательно) иметь дело с ошибками:
localforage.setItem('key', 'value', function(err, value) {
console.log(value);
});
localforage.getItem('key', function(err, value) {
if (err) {
console.error('error message...');
} else {
console.log(value);
}
});
Некоторые другие пункты на местном кормлении:
- Поддерживает использование обещаний JavaScript
- Как и в других библиотеках, не только для хранения строк, но вы можете устанавливать и получать объекты
- Позволяет установить информацию базы данных с помощью метода
config()
Basil.js
Basil.js описывается как унифицированный localStorage, sessionStorage и cookie API и включает в себя некоторые уникальные и очень простые в использовании функции. Основные методы могут быть использованы, как показано здесь:
basil = new Basil(options);
basil.set('foo', 'bar');
basil.get('foo');
basil.remove('foo');
basil.reset();
Вы также можете использовать Basil.js, чтобы проверить, доступен ли localStorage:
basil.check('local'); // returns Boolean value
Basil.js также позволяет вам использовать куки или sessionStorage:
basil.cookie.set(key, value, {
'expireDays': days, 'domain': 'mydomain.com'
});
basil.cookie.get(key);
basil.sessionStorage.set(key, value);
basil.sessionStorage.get(key);
Наконец, в объекте options
options
- Пространства имен для разных частей ваших данных
- Приоритетный порядок использования метода хранения
- Метод хранения по умолчанию
- Срок годности для файлов cookie.
options = {
namespace: 'foo',
storages: ['cookie', 'local'],
storage: 'cookie',
expireDays: 31
};
LZ-строка
Утилита lz-string позволяет хранить большие объемы данных в localStorage с использованием сжатия, и ее довольно просто использовать. Включив библиотеку на свою страницу, вы можете сделать следующее:
var string = 'A string to test our compression.';
console.log(string.length); // 33
var compressed = LZString.compress(string);
console.log(compressed.length); // 18
string = LZString.decompress(compressed);
Обратите внимание на использование методов compress()
decompress()
Комментарии в приведенном выше коде показывают значения длины до и после сжатия. Вы можете увидеть, насколько это выгодно, если посмотреть, как хранилище на стороне клиента всегда имеет ограниченное пространство.
Как объясняется в документации к библиотеке , есть опции для сжатия данных в Uint8Array (новый тип данных в JavaScript) и даже возможность сжатия данных для хранения вне клиента.
Похвальные грамоты
Вышеуказанные инструменты, вероятно, помогут вам сделать все, что вы хотите в localStorage, но если вы ищете больше, вот еще несколько связанных инструментов и библиотек, которые вы, возможно, захотите проверить.
- LokiJS — быстрое, ориентированное на память хранилище данных для документов для node.js, браузера и Cordova.
- Клиентское хранилище для AngularJS — Пространство клиентских пространств имен для Angular JS. Пишет в localStorage, с резервным файлом cookie. Нет внешних зависимостей, кроме Angular Core; не зависит от ngCookies.
- AlaSQL.js — база данных JavaScript SQL для браузера и Node.js. Обрабатывает как традиционные реляционные таблицы, так и вложенные данные JSON (NoSQL). Экспорт, хранение и импорт данных из localStorage, IndexedDB или Excel.
- angular-locker — простая и настраиваемая абстракция для локального / сессионного хранилища в угловых проектах, обеспечивающая гибкий и мощный API-интерфейс.
- jsCache — включает кэширование файлов JavaScript, таблиц стилей CSS и изображений с помощью localStorage.
- LargeLocalStorage — преодолевает различные недостатки браузера, предлагая большое хранилище значения ключа на клиенте.
Знаешь других?
Если вы создали что-то поверх API-интерфейса localStorage или связанного с ним инструмента, улучшающего хранилище на стороне клиента, сообщите нам об этом в комментариях.