2 pontos por GN⁺ 2024-06-27 | 1 comentários | Compartilhar no WhatsApp

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

 
GN⁺ 2024-06-27
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.