2 Punkte von GN⁺ 2024-06-27 | 1 Kommentare | Auf WhatsApp teilen

Überblick über Triplit

Triplit ist eine Open-Source-Datenbank, die Daten in Echtzeit zwischen Server und Browser synchronisiert. Sie wird als Typescript-Paket bereitgestellt, speichert Daten auf dem Server und synchronisiert sie intelligent mit den Clients.

  • Echtzeit-Synchronisation: Bietet inkrementelle Updates und Konfliktauflösung auf Attributebene
  • Lokales Caching: Läuft als clientseitige Datenbank
  • Dauerhafter serverseitiger Speicher: Einschließlich Admin-Dashboard
  • Plug-in-Speicheranbieter: Unterstützt SQLite, IndexedDB, LevelDB, Memory usw.
  • Optimistische Updates: Sorgen für schnelle Interaktionen
  • Relationale Abfragen: Unterstützt komplexe Datenmodelle
  • Offline-Modus: Automatische Wiederverbindung und Konsistenzgarantie
  • Rollback- und Retry-Management: Behandlung bei fehlgeschlagenen Updates
  • Schema: Bietet Datensicherheit und Typescript-Autovervollständigung
  • Berechtigungsverwaltung: Erzwingt Lese- und Schreibrechte auf dem Server
  • Kollaboration/Multiplayer: Angetrieben durch CRDTs
  • Geringe Latenz: Minimaler Netzwerkverkehr durch Delta-Patches
  • Einfache API: Unterstützt Datenabfragen und -transformationen in Javascript und React
  • Vollständig Open Source

Überblick über das Monorepo

triplit/packages enthält verschiedene Projekte, die Triplit antreiben:

  • TriplitDB: Läuft in allen JS-Umgebungen wie Browser, Node, Deno und React Native und bietet schnelle, in Echtzeit aktualisierte Abfragen, während über das Netzwerk hinweg Konsistenz zwischen mehreren Schreibenden gewahrt bleibt
  • Client: Browser-Bibliothek zur Interaktion mit lokalem und entferntem TriplitDB
  • CLI: Stellt Befehle für Projekt-Scaffolding, das Starten einer Full-Stack-Entwicklungsumgebung, Server-Migrationen usw. bereit
  • React: React-Bindings für @triplit/client
  • Svelte: Svelte-Bindings für @triplit/client
  • Console: App zur Anzeige und Transformation von Daten sowie zur Schema-Verwaltung für Triplit-Projekte
  • Server: Node-Server zur Datensynchronisation zwischen Triplit-Clients
  • Server-core: Protokollunabhängige Bibliothek zum Aufbau von Servern, auf denen Triplit läuft
  • Docs: Mit Nextra erstellte Triplit-Dokumentation
  • Types: Geteilte Typen für verschiedene Triplit-Projekte
  • UI: Geteilte UI-Komponenten für Triplit-Frontend-Projekte, erstellt mit shadcn

Schnellstart

Neues Projekt starten:

npm create triplit-app@latest my-app

Abhängigkeiten zu einem bestehenden Projekt hinzufügen:

npm install --save-dev @triplit/cli
npm run triplit init

Schema definieren (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;

Triplit-Entwicklungs-Sync-Server starten:

npm run triplit dev

Umgebungsvariablen festlegen (.env-Datei):

VITE_TRIPLIT_SERVER_URL=http://localhost:6543
VITE_TRIPLIT_TOKEN=copied-in-from-triplit-dev

Abfrage in der App definieren (React-Beispiel):

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

App starten, einen weiteren Browser-Tab öffnen und die Echtzeit-Datensynchronisation prüfen.

Meinung von GN⁺

  • Triplit kombiniert Echtzeit-Synchronisation und lokales Caching, um eine schnelle und konsistente Nutzererfahrung zu bieten.
  • Durch die Unterstützung verschiedener Speicheranbieter ist eine flexible Datenverwaltung möglich.
  • Offline-Modus und automatische Wiederverbindung erhalten die Datenkonsistenz auch bei instabilen Netzwerkverbindungen.
  • Die einfache API und die Unterstützung verschiedener Frameworks machen es entwicklerfreundlich.
  • Allerdings können die Ersteinrichtung und die Verwaltung der Umgebungsvariablen etwas komplex sein.

1 Kommentare

 
GN⁺ 2024-06-27
Hacker-News-Kommentare
  • Erfahrungsbericht mit Triplit: Triplit wird in einem Projekt eingesetzt, und das Datenmodell passt gut zu einem verteilten (P2P-)Ansatz. Allerdings sind die Erstellung von Server-Auth-Tokens und die begrenzte Ausdrucksstärke der Query-Sprache etwas enttäuschend.

  • Vergleich mit Evolu: Unterschiede zwischen Triplit und Evolu sind unter anderem die .subscribe()-Funktion von Triplit, die fortgeschrittenen Query-Funktionen von Evolu (SQL-basiert) und die jeweils im Browser verwendete Datenbankart.

  • Offline-Sync und Schema-Evolution: Es besteht Interesse daran, wie Datenbanken mit Offline-Sync-Protokollen das Problem der Schema-Evolution lösen, wenn Clients unterschiedliche Versionen haben.

  • Zweifel daran, dass Clients direkt in die Datenbank schreiben: Es ist unklar, welche Art von Apps zulässt, dass Clients direkt in die Datenbank schreiben. Die gleiche Frage stellt sich auch bei Supabase und Firestore.

  • Verwaltung von Benutzereinstellungen mit Triplit: Triplit wird genutzt, um Benutzereinstellungen zu verwalten und sicherzustellen, dass die App auch offline gut funktioniert. Die schnelle Reaktion des Support-Teams hinterließ einen starken Eindruck.

  • Warum die AGPL-Lizenz gewählt wurde: Es besteht Neugier, warum Triplit sich für die AGPL-Lizenz entschieden hat.

  • Local-First-Ansatz: Ein Local-First-Ansatz wird in einer mobilen App verwendet, und im Vergleich zu anderen Lösungen stellt sich die Frage, warum Triplit eine Client-Server-Sync-Lösung anbietet.

  • Wunsch nach Rust-Bindings: Mit zusätzlichen Rust-Bindings könnte Triplit zusammen mit Tauri genutzt werden, was bei der Entwicklung von Offline-First-Apps helfen würde.

  • Erfahrungen mit Triplit in React Native: Triplit wird in einer React-Native-App verwendet, und die Query-Sprache, TypeScript-Unterstützung, Offline-Unterstützung und React-Native-Unterstützung werden sehr positiv bewertet. Auch Open Source und Self-Hosting sind Vorteile.

  • Die Zukunft der App-Entwicklung: Triplit wirkt wie die Zukunft der App-Entwicklung, aber es besteht Interesse an einem Vergleich mit RethinkDB und an den Gründen für dessen Scheitern.

  • Kombinationsmöglichkeit von MongoDB und Triplit: Es besteht die Frage, ob sich serverseitig MongoDB und auf der React-Seite Triplit verwenden lassen oder ob Triplit als neue Datenbank eingesetzt werden muss.