Lançado no HN: Triplit – banco de dados de sincronização open source executado no servidor e no cliente
(github.com/aspen-cloud)Visão geral do Triplit
Triplit é um banco de dados open source que sincroniza dados em tempo real entre o servidor e o navegador. Ele é fornecido como um pacote Typescript, armazena os dados no servidor e os sincroniza de forma inteligente com o cliente.
- Sincronização em tempo real: oferece atualizações incrementais no nível de propriedade e resolução de conflitos
- Cache local: funciona como um banco de dados no lado do cliente
- Armazenamento durável no servidor: inclui painel administrativo
- Provedores de armazenamento plugáveis: suporta SQLite, IndexedDB, LevelDB, Memory e outros
- Atualizações otimistas: proporciona interações rápidas
- Consultas relacionais: suporta modelos de dados complexos
- Modo offline: garante reconexão automática e consistência
- Gerenciamento de rollback e novas tentativas: lida com falhas de atualização
- Schema: oferece segurança de dados e autocompletar do Typescript
- Controle de permissões: impõe permissões de leitura e escrita no servidor
- Colaboração/multiplayer: baseado em CRDTs
- Baixa latência: usa delta patches para minimizar o tráfego de rede
- API simples: suporta consulta e transformação de dados em Javascript e React
- Totalmente open source
Visão geral do monorepo
triplit/packages inclui vários projetos que compõem o Triplit:
- TriplitDB: pode ser executado em qualquer ambiente JS, como navegador, Node, Deno e React Native, e oferece consultas rápidas, atualizadas em tempo real, mantendo consistência entre vários autores na rede
- Client: biblioteca para navegador que interage com TriplitDB local e remoto
- CLI: fornece comandos para scaffolding de projetos, execução de ambiente de desenvolvimento full-stack, migrações de servidor e mais
- React: bindings React para
@triplit/client - Svelte: bindings Svelte para
@triplit/client - Console: aplicativo para visualizar e transformar dados de projetos Triplit e gerenciar schemas
- Server: servidor Node para sincronização de dados entre clientes Triplit
- Server-core: biblioteca agnóstica de protocolo para construir servidores que executam o Triplit
- Docs: documentação do Triplit construída com Nextra
- Types: tipos compartilhados para vários projetos Triplit
- UI: componentes de UI compartilhados para projetos frontend do Triplit, construídos com shadcn
Início rápido
Iniciar um novo projeto:
npm create triplit-app@latest my-app
Adicionar dependências a um projeto existente:
npm install --save-dev @triplit/cli
npm run triplit init
Definir o schema (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 o servidor de sincronização de desenvolvimento do Triplit:
npm run triplit dev
Configurar as variáveis de ambiente (arquivo .env):
VITE_TRIPLIT_SERVER_URL=http://localhost:6543
VITE_TRIPLIT_TOKEN=copied-in-from-triplit-dev
Definir consultas no app (exemplo em 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>
);
}
Inicie o app, abra outra aba do navegador e verifique a sincronização de dados em tempo real.
Opinião do GN⁺
- O Triplit combina sincronização em tempo real com cache local para oferecer uma experiência de usuário rápida e consistente.
- O suporte a vários provedores de armazenamento permite um gerenciamento de dados flexível.
- O modo offline e a reconexão automática mantêm a consistência dos dados mesmo em cenários de rede instável.
- A API simples e o suporte a vários frameworks tornam a ferramenta amigável para desenvolvedores.
- No entanto, a configuração inicial e o gerenciamento de variáveis de ambiente podem ser um pouco complexos.
1 comentários
Comentários no Hacker News
Compartilhando experiência com o Triplit: Está usando o Triplit em um projeto, e o modelo de dados combina bem com uma abordagem distribuída (P2P). No entanto, a geração de tokens de autenticação no servidor e a falta de expressividade da linguagem de consulta deixam a desejar.
Comparação com o Evolu: As diferenças entre Triplit e Evolu incluem o recurso
.subscribe()do Triplit, os recursos avançados de consulta do Evolu (baseados em SQL) e o tipo de banco de dados usado no navegador.Sincronização offline e evolução de esquema: Há curiosidade sobre como bancos de dados que usam protocolos de sincronização offline resolvem o problema de evolução de esquema quando as versões dos clientes são diferentes.
Dúvida sobre o cliente escrever diretamente no banco de dados: Não entende apps em que o cliente pode escrever diretamente no banco de dados. Tem a mesma dúvida em relação ao Supabase e ao Firestore.
Gerenciamento de configurações de usuário no Triplit: Usa o Triplit para gerenciar configurações de usuário, permitindo que o app funcione bem mesmo offline. A rapidez do suporte foi impressionante.
Motivo da escolha da licença AGPL: Há curiosidade sobre por que o Triplit escolheu a licença AGPL.
Abordagem local-first: Está usando uma abordagem local-first em um app mobile e quer entender por que, em comparação com outras soluções, o Triplit oferece uma solução de sincronização cliente-servidor.
Pedido de bindings para Rust: Se bindings para Rust forem adicionados, será possível usá-lo com Tauri, o que ajudaria no desenvolvimento de apps offline-first.
Experiência usando Triplit no React Native: Está usando o Triplit em um app React Native, e a linguagem de consulta, o suporte a TypeScript, o suporte offline e o suporte a React Native são excelentes. O fato de ser open source e permitir self-hosting também é uma vantagem.
O futuro do desenvolvimento de apps: O Triplit parece o futuro do desenvolvimento de apps, mas há curiosidade sobre comparações com o RethinkDB e os motivos do fracasso dele.
Possibilidade de combinar MongoDB e Triplit: Há curiosidade sobre usar MongoDB no servidor e Triplit no React, ou se é necessário usar o Triplit como um novo banco de dados.