Используйте 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, вы должны найти следующую информацию:
Тест скорости
Команда 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.
После установки расширения откройте Chrome DevTools, выберите вкладку OPFS Explorer , и вы будете готовы проверить, что SQLite Wasm записывает в Origin Private File System.
Если вы выберете любой из файлов в окне OPFS Explorer в DevTools, вы сможете сохранить его на локальном диске. Затем вы можете использовать приложение, например SQLite Viewer, для проверки базы данных, чтобы убедиться, что SQLite Wasm действительно работает так, как и было обещано.
Получите помощь и оставьте отзыв
SQLite Wasm разрабатывается и поддерживается сообществом SQLite. Получите помощь и оставьте отзыв, выполнив поиск и отправив сообщение на форум поддержки . Полная документация доступна на сайте SQLite.