Presentado en HN: Triplit – base de datos de sincronización de código abierto que se ejecuta en el servidor y el cliente
(github.com/aspen-cloud)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
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.