Présenté sur HN : Triplit – une base de données de synchronisation open source qui s’exécute sur le serveur et le client
(github.com/aspen-cloud)Aperçu de Triplit
Triplit est une base de données open source qui synchronise les données en temps réel entre le serveur et le navigateur. Elle est fournie sous forme de package Typescript, stocke les données sur le serveur et les synchronise intelligemment côté client.
- Synchronisation en temps réel : fournit des mises à jour incrémentales au niveau des propriétés et la résolution de conflits
- Cache local : fonctionne comme une base de données côté client
- Stockage persistant côté serveur : avec tableau de bord d’administration inclus
- Fournisseurs de stockage enfichables : prise en charge de SQLite, IndexedDB, LevelDB, Memory, etc.
- Mises à jour optimistes : offrent des interactions rapides
- Requêtes relationnelles : prise en charge de modèles de données complexes
- Mode hors ligne : reconnexion automatique et garantie de cohérence
- Gestion des rollbacks et des nouvelles tentatives : traitement des échecs de mise à jour
- Schéma : sécurité des données et autocomplétion Typescript
- Gestion des autorisations : application des droits de lecture et d’écriture sur le serveur
- Collaboration / multijoueur : propulsé par les CRDTs
- Faible latence : trafic réseau minimal grâce aux delta patches
- API simple : prise en charge des requêtes et des mutations de données en Javascript et React
- Entièrement open source
Aperçu du monorepo
triplit/packages contient les différents projets qui font fonctionner Triplit :
- TriplitDB : s’exécute dans tous les environnements JS, dont le navigateur, Node, Deno et React Native, et fournit des requêtes rapides, mises à jour en temps réel, tout en maintenant la cohérence entre plusieurs auteurs sur le réseau
- Client : bibliothèque navigateur qui interagit avec TriplitDB en local et à distance
- CLI : fournit des commandes pour le scaffolding de projet, l’exécution de l’environnement de développement full-stack, les migrations serveur, etc.
- React : bindings React pour @triplit/client
- Svelte : bindings Svelte pour @triplit/client
- Console : application de gestion du schéma, de consultation et de modification des données d’un projet Triplit
- Server : serveur Node pour la synchronisation des données entre clients Triplit
- Server-core : bibliothèque agnostique au protocole pour construire des serveurs exécutant Triplit
- Docs : documentation Triplit construite avec Nextra
- Types : types partagés pour les différents projets Triplit
- UI : composants UI partagés pour les projets frontend Triplit, construits avec shadcn
Démarrage rapide
Démarrer un nouveau projet :
npm create triplit-app@latest my-app
Ajouter les dépendances à un projet existant :
npm install --save-dev @triplit/cli
npm run triplit init
Définir le schéma (my-app/triplit/schema.ts) :
import { Schema as S, ClientSchema } from '@triplit/client';
export const schema = {
todos: {
schema: S.Schema({
id: S.Id(),
text: S.String(),
completed: S.Boolean({ default: false }),
}),
},
} satisfies ClientSchema;
Démarrer le serveur de synchronisation de développement Triplit :
npm run triplit dev
Configurer les variables d’environnement (fichier .env) :
VITE_TRIPLIT_SERVER_URL=http://localhost:6543
VITE_TRIPLIT_TOKEN=copied-in-from-triplit-dev
Définir une requête dans l’application (exemple React) :
import { TriplitClient } from '@triplit/client';
import { useQuery } from '@triplit/react';
import { schema } from '../triplit/schema';
const client = new TriplitClient({
schema,
serverUrl: import.meta.env.VITE_TRIPLIT_SERVER_URL,
token: import.meta.env.VITE_TRIPLIT_TOKEN,
});
function App() {
const { results: todos } = useQuery(client.query('todos'));
return (
<div>
{Array.from(todos.values()).map((todo) => (
<div key={todo.id}>
<input
type="checkbox"
checked={todo.completed}
onChange={() =>
client.update('todos', todo.id, (todo) => ({
todo.completed = !todo.completed,
}))
}
/>
{todo.text}
</div>
))}
</div>
);
}
Démarrez l’application, ouvrez un autre onglet du navigateur et vérifiez la synchronisation des données en temps réel.
L’avis de GN⁺
- Triplit combine la synchronisation en temps réel et le cache local pour offrir une expérience utilisateur rapide et cohérente.
- La prise en charge de divers fournisseurs de stockage permet une gestion des données flexible.
- Le mode hors ligne et la reconnexion automatique maintiennent la cohérence des données même lorsque le réseau est instable.
- Une API simple et la prise en charge de plusieurs frameworks le rendent adapté aux développeurs.
- En revanche, la configuration initiale et la gestion des variables d’environnement peuvent être un peu complexes.
1 commentaires
Avis sur Hacker News
Retour d’expérience avec Triplit : utilisation de Triplit dans un projet, avec un modèle de données bien adapté au distribué (P2P). En revanche, la génération des jetons d’authentification serveur et le manque d’expressivité du langage de requête sont regrettés.
Comparaison avec Evolu : parmi les différences entre Triplit et Evolu, on note la fonctionnalité
.subscribe()de Triplit, les capacités de requête avancées d’Evolu (basées sur SQL) et le fait qu’ils n’utilisent pas le même type de base de données dans le navigateur.Synchronisation hors ligne et évolution du schéma : question sur la manière de résoudre les problèmes d’évolution du schéma dans une base de données utilisant un protocole de synchronisation hors ligne lorsque les versions client diffèrent.
Questionnement sur l’écriture directe des clients dans la base de données : incompréhension face aux applications qui autorisent les clients à écrire directement dans la base de données. Même interrogation à propos de Supabase et Firestore.
Gestion des préférences utilisateur avec Triplit : utilisation de Triplit pour gérer les préférences utilisateur, afin que l’application fonctionne bien même hors ligne. La réactivité rapide de l’équipe support est jugée impressionnante.
Pourquoi le choix de la licence AGPL : interrogation sur les raisons qui ont poussé Triplit à choisir la licence AGPL.
Approche local-first : utilisation d’une approche local-first dans une application mobile, avec une question sur la raison pour laquelle Triplit propose une solution de synchronisation client-serveur par rapport à d’autres solutions.
Demande de bindings Rust : l’ajout de bindings Rust permettrait une utilisation avec Tauri et aiderait au développement d’applications offline-first.
Retour d’expérience avec Triplit dans React Native : utilisation de Triplit dans une application React Native, avec de très bons retours sur le langage de requête, le support de TypeScript, le mode hors ligne et la compatibilité React Native. L’open source et la possibilité d’auto-hébergement sont aussi des atouts.
Le futur du développement d’applications : Triplit donne l’impression d’être l’avenir du développement applicatif, mais il y a une curiosité quant à la comparaison avec RethinkDB et aux raisons de son échec.
Compatibilité entre MongoDB et Triplit : question sur la possibilité d’utiliser MongoDB côté serveur et Triplit côté React, ou s’il faut adopter Triplit comme nouvelle base de données.