SQLite Wasm dans le navigateur reposant sur le système de fichiers privé d'origine

Utilisez SQLite pour gérer efficacement tous vos besoins de stockage sur le Web.

À propos de SQLite

SQLite est un service stockage relationnel intégré open source, léger de gestion de base de données. De nombreux développeurs l'utilisent pour stocker des données dans structurée et facile à utiliser. En raison de sa petite taille et de la faible capacité de mémoire SQLite est souvent utilisé comme moteur de base de données sur les appareils mobiles, les applications de bureau et les navigateurs web.

L'une des principales caractéristiques de SQLite est qu'il s'agit d'une base de données sans serveur, cela signifie qu'il ne nécessite pas de processus serveur distinct pour fonctionner. À la place, la base de données est stockée dans un seul fichier sur l'appareil de l'utilisateur, ce qui permet de à intégrer aux applications.

Logo SQLite.

SQLite basé sur Web Assembly

Il existe un certain nombre de versions non officielles de SQLite basées sur Web Assembly (Wasm), ce qui permet de l'utiliser dans des navigateurs Web, par exemple, sql.js La Le sous-projet sqlite3 WASM/JS est première initiative officiellement associée Projet SQLite créant des builds Wasm de la bibliothèque les membres établis de la famille des livrables SQLite pris en charge. L'approche concrète les objectifs de ce projet sont:

  • Lier une API sqlite3 de bas niveau, aussi proche que possible de celle en C conditions d'utilisation.
  • Une API orientée objet de niveau supérieur, qui s'apparente davantage sql.js et des implémentations de style Node.js, qui s'adresse directement à l'API de bas niveau. Cette API doit être utilisée à partir du même en tant qu'API de bas niveau.
  • API basée sur les nœuds de calcul qui communique avec les API précédentes via des messages de nœud de calcul. Ce l'une est destinée à être utilisée dans le thread principal, avec les API de niveau inférieur installé dans un thread de nœud de calcul et que vous communiquiez avec eux via des messages de nœud de calcul.
  • Variante de l'API Worker basée sur une promesse les aspects de la communication multithread de l'utilisateur.
  • la prise en charge du stockage persistant côté client à l'aide des API JavaScript disponibles ; y compris OPFS (Origin Private File System).

Utiliser SQLite Wasm avec le backend de persistance du système de fichiers privés d'origine

Installer la bibliothèque à partir de npm

Installez la @sqlite.org/sqlite-wasm à partir de npm avec la commande suivante:

npm install @sqlite.org/sqlite-wasm

Système de fichiers privé d'origine

Le système de fichiers privé d'origine (OPFS, Origin Private File System) API File System Access) est complétée par un une surface spéciale qui offre un accès très performant aux données. Cette nouvelle surface diffère des outils existants en offrant un accès en écriture sur place et exclusif à un le contenu du fichier. Ce changement, ainsi que la possibilité de lire systématiquement les modifications non vidées et la disponibilité d'une variante synchrone qui améliorent considérablement les performances et débloquent les nouvelles utilisations. cas d'utilisation.

Comme vous pouvez l’imaginer, le dernier point des objectifs du projet, le support pour un stockage persistant côté client à l'aide des API JavaScript disponibles, des exigences strictes en matière de performances concernant la persistance des données dans le fichier de base de données. C'est là que le système de fichiers privé d'origine et, plus précisément, createSyncAccessHandle() méthode de FileSystemFileHandle les objets entrent en jeu. Cette méthode renvoie une promesse qui se résout en FileSystemSyncAccessHandle qui peut être utilisé pour lire et écrire dans un fichier de manière synchrone. La la nature synchrone de cette méthode offre des avantages en termes de performances, il n'est utilisable que dans un environnement Nœuds de calcul Web pour des fichiers dans le système de fichiers privé d'origine afin que le thread principal ne puisse pas être bloqué.

Définir les en-têtes obligatoires

L'archive SQLite Wasm téléchargée contient, entre autres, le fichier sqlite3.js. et les fichiers sqlite3.wasm, qui constituent le build sqlite3 WASM/JS. jswasm Ce répertoire contient les livrables principaux sqlite3 et le répertoire de premier niveau. contient des applications de démonstration et de test. Les navigateurs ne diffusent pas les fichiers Wasm provenant file:// URL. Par conséquent, toutes les applications que vous créez avec elles nécessitent un serveur Web et que doit inclure les en-têtes suivants dans sa réponse lors de la diffusion des :

La raison de ces en-têtes est que SQLite Wasm dépend SharedArrayBuffer, et la définition de ces en-têtes fait partie exigences de sécurité.

Si vous inspectez le trafic avec les outils de développement, vous devriez obtenir les éléments suivants : informations:

Les deux en-têtes mentionnés ci-dessus ("Cross-Origin-Embedder-Policy" et "Cross-Origin-Opener-Policy") mis en évidence dans les outils pour les développeurs Chrome.

Test de débit

L'équipe SQLite a effectué des analyses comparatives sur son implémentation WebAssembly. par rapport au langage Web SQL obsolète. Ces analyses comparatives montrent que SQLite Wasm est est généralement aussi rapide que Web SQL. Parfois, c'est un peu plus lent, parfois c'est un peu plus rapide. En savoir plus sur la page de résultats.

Exemple de code de démarrage

Comme indiqué précédemment, SQLite Wasm avec le système de fichiers privé d'origine de persistance doit s'exécuter à partir d'un contexte de nœud de calcul. La bonne nouvelle, c'est que la bibliothèque s'occupe de tout automatiquement, et vous pouvez l'utiliser directement dans le thread principal.

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);
  }
})();

Démo

Découvrez comment fonctionne le code ci-dessus dans la démonstration. N'oubliez pas de consulter code source sur Glitch. Notez que la version intégrée ci-dessous n'utilise pas le backend OPFS. mais lorsque vous ouvrez la version de démonstration onglet distinct.

Déboguer le système de fichiers privé d'origine

Pour déboguer la sortie du système de fichiers privé d'origine de SQLite Wasm, utilisez la méthode OPFS Explorer l'extension Chrome.

OPFS Explorer sur le Chrome Web Store.

Une fois l'extension installée, ouvrez les outils pour les développeurs Chrome, sélectionnez le fichier OPFS Explorer. Vous êtes alors prêt à examiner ce que SQLite Wasm écrit dans le Système de fichiers privés d'origine.

Extension Chrome OPFS Explorer affichant la structure du système de fichiers privé d&#39;origine de l&#39;application de démonstration

Si vous cliquez sur l'un des fichiers dans la fenêtre de l'explorateur OPFS des outils de développement, vous vous pouvez l'enregistrer sur le disque local. Vous pouvez ensuite utiliser une application comme Lecteur SQLite pour inspecter la base de données afin de pouvoir vous assurer que SQLite Wasm fonctionne comme prévu.

Application de lecture SQLite utilisée pour ouvrir un fichier de base de données à partir de la démonstration de SQLite Wasm.

Obtenir de l'aide et envoyer des commentaires

SQLite Wasm est développé et géré par la communauté SQLite. Obtenez de l'aide et faites-nous part de vos commentaires en effectuant une recherche et en publiant forum d'assistance. L'intégralité documentation est disponible sur le site de SQLite.

Remerciements

Image héros de Tobias Fischer sur Unsplash.