Статьи

9 библиотек JavaScript для работы с локальным хранилищем

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.saddLockr.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);

Наконец, в объекте optionsoptions

  • Пространства имен для разных частей ваших данных
  • Приоритетный порядок использования метода хранения
  • Метод хранения по умолчанию
  • Срок годности для файлов 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 или связанного с ним инструмента, улучшающего хранилище на стороне клиента, сообщите нам об этом в комментариях.