2 puntos por GN⁺ 2024-06-27 | 1 comentarios | Compartir por WhatsApp

Resumen de Triplit

Triplit es una base de datos de código abierto que sincroniza datos en tiempo real entre el servidor y el navegador. Se ofrece como un paquete de Typescript, almacena los datos en el servidor y los sincroniza de forma inteligente con el cliente.

  • Sincronización en tiempo real: ofrece actualizaciones incrementales a nivel de propiedad y resolución de conflictos
  • Caché local: funciona como una base de datos del lado del cliente
  • Almacenamiento duradero del lado del servidor: incluye panel de administración
  • Proveedores de almacenamiento conectables: compatible con SQLite, IndexedDB, LevelDB, Memory y más
  • Actualizaciones optimistas: ofrece interacciones rápidas
  • Consultas relacionales: compatible con modelos de datos complejos
  • Modo offline: reconexión automática y garantía de consistencia
  • Gestión de rollback y reintentos: maneja los casos en que fallan las actualizaciones
  • Esquema: ofrece seguridad de datos y autocompletado de Typescript
  • Control de permisos: aplica permisos de lectura y escritura en el servidor
  • Colaboración / multijugador: impulsado por CRDTs
  • Baja latencia: tráfico de red mínimo mediante delta patches
  • API simple: permite consultar y transformar datos desde Javascript y React
  • Totalmente de código abierto

Resumen del monorepo

triplit/packages incluye varios proyectos que impulsan Triplit:

  • TriplitDB: puede ejecutarse en cualquier entorno JS, como navegador, Node, Deno y React Native, y ofrece consultas rápidas y en tiempo real que se actualizan manteniendo la consistencia entre múltiples autores en la red
  • Client: biblioteca para navegador que interactúa con TriplitDB local y remoto
  • CLI: ofrece comandos para scaffolding de proyectos, ejecución del entorno de desarrollo full-stack, migraciones del servidor y más
  • React: bindings de React para @triplit/client
  • Svelte: bindings de Svelte para @triplit/client
  • Console: app para ver y transformar datos del proyecto Triplit y administrar esquemas
  • Server: servidor Node para sincronizar datos entre clientes de Triplit
  • Server-core: biblioteca agnóstica al protocolo para construir servidores que ejecutan Triplit
  • Docs: documentación de Triplit construida con Nextra
  • Types: tipos compartidos para varios proyectos de Triplit
  • UI: componentes de UI compartidos para proyectos frontend de Triplit construidos con shadcn

Inicio rápido

Iniciar un nuevo proyecto:

npm create triplit-app@latest my-app

Agregar dependencias a un proyecto existente:

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

Definir el esquema (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;

Iniciar el servidor de sincronización de desarrollo de Triplit:

npm run triplit dev

Configurar las variables de entorno (archivo .env):

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

Definir una consulta en la app (ejemplo con 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>
  );
}

Inicia la app, abre otra pestaña del navegador y verifica la sincronización de datos en tiempo real.

Opinión de GN⁺

  • Triplit combina sincronización en tiempo real y caché local para ofrecer una experiencia de usuario rápida y consistente.
  • Compatible con varios proveedores de almacenamiento, lo que permite una gestión de datos flexible.
  • El modo offline y la reconexión automática mantienen la consistencia de los datos incluso en situaciones de red inestable.
  • Su API simple y el soporte para varios frameworks la hacen amigable para desarrolladores.
  • Sin embargo, la configuración inicial y la gestión de variables de entorno pueden ser algo complejas.

1 comentarios

 
GN⁺ 2024-06-27
Opiniones de Hacker News
  • Experiencia usando Triplit: Está usando Triplit en un proyecto y el modelo de datos encaja bien con un enfoque distribuido (P2P). Sin embargo, le decepciona la generación de tokens de autenticación del servidor y la falta de expresividad del lenguaje de consultas.

  • Comparación con Evolu: Entre las diferencias entre Triplit y Evolu están la función .subscribe() de Triplit, las funciones avanzadas de consulta de Evolu (basadas en SQL) y el tipo de base de datos que usan en el navegador.

  • Sincronización offline y evolución de esquema: Le da curiosidad cómo resuelven el problema de la evolución del esquema en bases de datos que usan protocolos de sincronización offline cuando las versiones de los clientes son distintas.

  • Dudas sobre que el cliente escriba directamente en la base de datos: No entiende qué tipo de apps permiten que el cliente escriba directamente en la base de datos. Tiene la misma duda sobre Supabase y Firestore.

  • Gestión de preferencias de usuario con Triplit: Usa Triplit para gestionar las preferencias de usuario y hacer que la app funcione bien incluso sin conexión. Le impresionó la rapidez de respuesta del equipo de soporte.

  • Razón para elegir la licencia AGPL: Tiene curiosidad por saber por qué Triplit eligió la licencia AGPL.

  • Enfoque local-first: Está usando un enfoque local-first en una app móvil y quiere saber por qué Triplit ofrece una solución de sincronización cliente-servidor en comparación con otras alternativas.

  • Solicitud de bindings para Rust: Si agregan bindings para Rust, se podría usar junto con Tauri y eso ayudaría al desarrollo de apps offline-first.

  • Experiencia usando Triplit en React Native: Está usando Triplit en una app de React Native y destaca su lenguaje de consultas, soporte para TypeScript, soporte offline y soporte para React Native. Que sea open source y permita self-hosting también es una ventaja.

  • El futuro del desarrollo de apps: Triplit se siente como el futuro del desarrollo de apps, pero quiere saber cómo se compara con RethinkDB y qué opinan sobre las razones de su fracaso.

  • Posible combinación de MongoDB y Triplit: Quiere saber si puede usar MongoDB del lado del servidor y Triplit en React, o si tendría que usar Triplit como una nueva base de datos.