SQLite Wasm в браузере, поддерживаемый Origin Private File System

Используйте SQLite для эффективного решения всех ваших задач по хранению данных в Интернете.

SQLite — популярная, легковесная, встроенная система управления реляционными базами данных с открытым исходным кодом . Многие разработчики используют ее для хранения данных в структурированном, удобном для использования виде. Благодаря небольшому размеру и низким требованиям к памяти SQLite часто используется в качестве движка базы данных в мобильных устройствах, настольных приложениях и веб-браузерах.

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

Логотип SQLite.

SQLite на основе веб-сборки

Существует ряд неофициальных версий SQLite на основе Web Assembly (Wasm), позволяющих использовать его в веб-браузерах, например, sql.js. Подпроект sqlite3 WASM/JS является первой попыткой, официально связанной с проектом SQLite, которая делает сборки Wasm библиотеки установленными членами семейства поддерживаемых продуктов SQLite. Конкретные цели этого проекта включают:

  • Привязка низкоуровневого API sqlite3, максимально приближенного к API C с точки зрения использования.
  • Высокоуровневый объектно-ориентированный API, более похожий на реализации в стиле sql.js и Node.js, который напрямую обращается к низкоуровневому API. Этот API должен использоваться из того же потока, что и низкоуровневый API.
  • API на основе Worker, который общается с предыдущими API через сообщения Worker. Этот API предназначен для использования в основном потоке, с API более низкого уровня, установленными в потоке Worker, и общается с ними через сообщения Worker.
  • Вариант API Worker на основе Promise, который полностью скрывает от пользователя аспекты межпоточной коммуникации.
  • Поддержка постоянного хранения на стороне клиента с использованием доступных API JavaScript, включая Origin Private File System (OPFS).

Использование SQLite Wasm с бэкэндом сохранения данных Origin Private File System

Установка библиотеки из npm

Установите пакет @sqlite.org/sqlite-wasm из npm с помощью следующей команды:

npm install @sqlite.org/sqlite-wasm

Частная файловая система Origin

Origin Private File System (OPFS, часть API доступа к файловой системе ) дополнена специальной поверхностью, которая обеспечивает очень производительный доступ к данным. Эта новая поверхность отличается от существующих тем, что предлагает доступ на месте и эксклюзивный доступ к записи содержимого файла. Это изменение, наряду с возможностью последовательного чтения невыгруженных изменений и доступностью синхронного варианта на выделенных рабочих процессах, значительно повышает производительность и разблокирует новые варианты использования.

Как вы можете себе представить, последний пункт целей проекта, поддержка постоянного клиентского хранилища с использованием доступных API JavaScript, сопровождается строгими требованиями к производительности в отношении сохранения данных в файле базы данных. Именно здесь в игру вступает Origin Private File System и, в частности, метод createSyncAccessHandle() объектов FileSystemFileHandle . Этот метод возвращает Promise, который разрешается в объект FileSystemSyncAccessHandle , который можно использовать для синхронного чтения из файла и записи в него. Синхронная природа этого метода дает преимущества в производительности, но поэтому он может использоваться только внутри выделенных Web Workers для файлов в Origin Private File System, поэтому основной поток не может быть заблокирован.

Установка необходимых заголовков

Среди прочих файлов загруженный архив SQLite Wasm содержит файлы sqlite3.js и sqlite3.wasm , которые составляют сборку sqlite3 WASM/JS. Каталог jswasm содержит основные поставки sqlite3, а каталог верхнего уровня содержит демонстрационные и тестовые приложения. Браузеры не будут обслуживать файлы Wasm с URL-адресов file:// , поэтому любые приложения, которые вы создаете с его помощью, требуют веб-сервера, и этот сервер должен включать следующие заголовки в свой ответ при обслуживании файлов:

  • Cross-Origin-Opener-Policy установлена ​​на директиву same-origin , которая изолирует контекст просмотра исключительно для документов одного и того же источника. Документы из разных источников не загружаются в одном и том же контексте просмотра.
  • Cross-Origin-Embedder-Policy установлена ​​в директиве require-corp , поэтому документ может загружать только ресурсы из того же источника или ресурсы, явно помеченные как загружаемые из другого источника.

Причина наличия этих заголовков в том, что SQLite Wasm зависит от SharedArrayBuffer , и установка этих заголовков является частью его требований безопасности .

Если вы проверите трафик с помощью DevTools, вы должны найти следующую информацию:

Два заголовка, упомянутые выше, Cross-Origin-Embedder-Policy и Cross-Origin-Opener-Policy, выделены в Chrome DevTools.

Тест скорости

Команда SQLite провела несколько тестов производительности своей реализации WebAssembly в сравнении с устаревшим Web SQL. Эти тесты показывают, что SQLite Wasm в целом примерно такой же быстрый, как Web SQL. Иногда он немного медленнее, иногда немного быстрее. Подробности см. на странице результатов .

Пример кода для начала работы

Как упоминалось ранее, SQLite Wasm с бэкэндом сохранения Origin Private File System должен запускаться из контекста Worker. Хорошей новостью является то, что библиотека автоматически заботится обо всем этом за вас, и вы можете использовать ее прямо из основного потока.

import { sqlite3Worker1Promiser } from '@sqlite.org/sqlite-wasm';

(async () => {
  try {
    console.log('Loading and initializing SQLite3 module...');

    const promiser = await new Promise((resolve) => {
      const _promiser = sqlite3Worker1Promiser({
        onready: () => {
          resolve(_promiser);
        },
      });
    });

    console.log('Done initializing. Running demo...');

    let response;

    response = await promiser('config-get', {});
    console.log('Running SQLite3 version', response.result.version.libVersion);

    response = await promiser('open', {
      filename: 'file:worker-promiser.sqlite3?vfs=opfs',
    });
    const { dbId } = response;
    console.log(
      'OPFS is available, created persisted database at',
      response.result.filename.replace(/^file:(.*?)\?vfs=opfs$/, '$1'),
    );

    await promiser('exec', { dbId, sql: 'CREATE TABLE IF NOT EXISTS t(a,b)' });
    console.log('Creating a table...');

    console.log('Insert some data using exec()...');
    for (let i = 20; i <= 25; ++i) {
      await promiser('exec', {
        dbId,
        sql: 'INSERT INTO t(a,b) VALUES (?,?)',
        bind: [i, i * 2],
      });
    }

    console.log('Query data with exec()');
    await promiser('exec', {
      dbId,
      sql: 'SELECT a FROM t ORDER BY a LIMIT 3',
      callback: (result) => {
        if (!result.row) {
          return;
        }
        console.log(result.row);
      },
    });

    await promiser('close', { dbId });
  } catch (err) {
    if (!(err instanceof Error)) {
      err = new Error(err.result.message);
    }
    console.error(err.name, err.message);
  }
})();

Демо

Посмотрите на код выше в действии в демо . Обязательно проверьте исходный код на Glitch. Обратите внимание, что встроенная версия ниже не использует бэкэнд OPFS, но когда вы открываете демо в отдельной вкладке, он использует.

Отладка частной файловой системы Origin

Для отладки выходных данных SQLite Wasm Origin Private File System используйте расширение OPFS Explorer для Chrome.

OPFS Explorer в интернет-магазине Chrome.

После установки расширения откройте Chrome DevTools, выберите вкладку OPFS Explorer , и вы будете готовы проверить, что SQLite Wasm записывает в Origin Private File System.

Расширение OPFS Explorer для Chrome, демонстрирующее структуру Origin Private File System демонстрационного приложения.

Если вы выберете любой из файлов в окне OPFS Explorer в DevTools, вы сможете сохранить его на локальном диске. Затем вы можете использовать приложение, например SQLite Viewer, для проверки базы данных, чтобы убедиться, что SQLite Wasm действительно работает так, как и было обещано.

Приложение SQLite Viewer, используемое для открытия файла базы данных из демоверсии SQLite Wasm.

Получите помощь и оставьте отзыв

SQLite Wasm разрабатывается и поддерживается сообществом SQLite. Получите помощь и оставьте отзыв, выполнив поиск и отправив сообщение на форум поддержки . Полная документация доступна на сайте SQLite.