8 Bibliotecas de JavaScript para Gráficos – Parte 5: Visx (Airbnb)

Olá!!

Dando continuidade à nossa série sobre bibliotecas JavaScript para visualização de dados, hoje vamos explorar Visx.

Visx (anteriormente conhecida como vx) é uma biblioteca desenvolvida pelo Airbnb que combina o poder do D3.js com a elegância do React.

Se você trabalha com React e quer criar visualizações sofisticadas sem abrir mão da componentização e do gerenciamento de estado que já conhece, Visx pode ser exatamente o que você procura.

Siga nossa página no Linkedin e no Instagram e ajude a divulgar nosso conteúdo🥰

O que é Visx?

Visx é uma biblioteca open source de componentes React para visualização de dados, criada pela equipe de engenharia do Airbnb. A biblioteca oferece componentes React de baixo nível que encapsulam as funcionalidades mais poderosas do D3.js (veja mais sobre D3.js), permitindo que você construa visualizações customizadas mantendo a filosofia reativa do React.

Licença: Visx é distribuída sob a licença MIT, garantindo liberdade para uso comercial e modificação.

O nome “visx” vem de “visualization components“, e representa uma abordagem moderna para criar gráficos que combina a flexibilidade do D3.js com a arquitetura de componentes do React.

A Filosofia por Trás da Visx

Visx surgiu de uma necessidade real do Airbnb: criar visualizações de dados complexas e customizadas em aplicações React sem ter que lidar com as incompatibilidades entre D3.js e React. Ambas as bibliotecas querem controlar o DOM, o que pode gerar conflitos e bugs difíceis de rastrear.

A solução da Visx é elegante: ela extrai as partes matemáticas e utilitárias do D3.js (escalas, formas, cálculos) e as encapsula em componentes React puros, deixando o controle do DOM inteiramente para o React.

Principais Características

Componentes React Nativos

Todos os elementos são componentes React genuínos, seguindo as melhores práticas de desenvolvimento e integração perfeita com o ecosistema React.

Baixo Nível, Alta Flexibilidade

Visx oferece componentes primitivos que você pode combinar para criar qualquer tipo de visualização, similar à filosofia do D3.js mas com a ergonomia do React.

TypeScript First

Desenvolvida inteiramente em TypeScript, oferece excelente suporte a tipos e IntelliSense out of the box.

Modular e Tree-Shakeable

Você pode importar apenas os componentes que precisa, mantendo o bundle final otimizado.

Performance Otimizada

Aproveita as otimizações nativas do React, incluindo reconciliação eficiente e possibilidade de uso com React.memo.

Arquitetura e Conceitos

Pacotes Modulares

Visx é organizada em pacotes temáticos:

  • @visx/scale: Escalas (linear, band, time, etc.)
  • @visx/shape: Formas primitivas (Line, Bar, Arc, etc.)
  • @visx/axis: Componentes de eixos
  • @visx/grid: Grids e guias
  • @visx/tooltip: Sistema de tooltips
  • @visx/responsive: Componentes responsivos
  • @visx/gradient: Gradientes e padrões

Composição over Configuração

Em vez de configurar um gráfico monolítico, você compõe sua visualização usando componentes pequenos e focados.

Exemplo Prático

import React from 'react';
import { scaleQuantize } from '@visx/scale';
import { Mercator, Graticule } from '@visx/geo';
import * as topojson from 'topojson-client';
import topology from './world-topo.json';

export const background = '#f9f7e8';

export type GeoMercatorProps = {
  width: number;
  height: number;
  events?: boolean;
};

interface FeatureShape {
  type: 'Feature';
  id: string;
  geometry: { coordinates: [number, number][][]; type: 'Polygon' };
  properties: { name: string };
}

// @ts-expect-error
const world = topojson.feature(topology, topology.objects.units) as {
  type: 'FeatureCollection';
  features: FeatureShape[];
};

const color = scaleQuantize({
  domain: [
    Math.min(...world.features.map((f) => f.geometry.coordinates.length)),
    Math.max(...world.features.map((f) => f.geometry.coordinates.length)),
  ],
  range: ['#ffb01d', '#ffa020', '#ff9221', '#ff8424', '#ff7425', '#fc5e2f', '#f94b3a', '#f63a48'],
});

export default function ({ width, height, events = false }: GeoMercatorProps) {
  const centerX = width / 2;
  const centerY = height / 2;
  const scale = (width / 630) * 100;

  return width < 10 ? null : (
    <svg width={width} height={height}>
      <rect x={0} y={0} width={width} height={height} fill={background} rx={14} />
      <Mercator<FeatureShape>
        data={world.features}
        scale={scale}
        translate={[centerX, centerY + 50]}
      >
        {(mercator) => (
          <g>
            <Graticule graticule={(g) => mercator.path(g) || ''} stroke="rgba(33,33,33,0.05)" />
            {mercator.features.map(({ feature, path }, i) => (
              <path
                key={`map-feature-${i}`}
                d={path || ''}
                fill={color(feature.geometry.coordinates.length)}
                stroke={background}
                strokeWidth={0.5}
                onClick={() => {
                  if (events) alert(`Clicked: ${feature.properties.name} (${feature.id})`);
                }}
              />
            ))}
          </g>
        )}
      </Mercator>
    </svg>
  );
}

Saída:

Vantagens da Visx

Integração Perfeita com React: Não há conflitos de DOM ou problemas de lifecycle – tudo funciona naturalmente com React.

TypeScript Nativo: Excelente experiência de desenvolvimento com tipagem completa e autocompletar.

Flexibilidade do D3.js: Mantém toda a flexibilidade de criar visualizações customizadas, mas com componentes React.

Performance: Aproveita todas as otimizações do React, incluindo Virtual DOM e reconciliação inteligente.

Modularidade: Importe apenas o que você precisa, mantendo bundles enxutos.

Ecosistema React: Funciona perfeitamente com outras bibliotecas do ecosistema React (Redux, React Router, etc.).

Desvantagens e Considerações

Curva de Aprendizado: Ainda requer conhecimento sólido de conceitos de visualização de dados (escalas, projeções, etc.).

Verbosidade: Pode ser mais verboso que bibliotecas de alto nível para gráficos simples.

Dependência do React: Obviamente, só funciona em projetos React.

Documentação: Embora boa, pode ser menos extensa que bibliotecas mais estabelecidas.

Comunidade Menor: Por ser mais nova, tem uma comunidade menor comparada a D3.js ou Chart.js.

Instalação e Configuração

Instalação Básica

npm install @visx/scale @visx/shape @visx/axis @visx/grid

Ou instale todos os pacotes

npm install @visx/visx

Exemplo de Import

import { scaleLinear } from '@visx/scale';
import { Bar } from '@visx/shape';
import { AxisBottom, AxisLeft } from '@visx/axis';

Casos de Uso Ideais

Visx é perfeita quando precisamos de:

  • Dashboards React Complexos: Visualizações integradas com o estado da aplicação
  • Aplicações Data-Heavy: Quando os dados mudam frequentemente e você precisa de re-renderização eficiente
  • Gráficos Customizados: Visualizações que não existem em bibliotecas de alto nível
  • Aplicações Enterprise: Onde TypeScript e manutenibilidade são prioritárias
  • Animações Complexas: Aproveitando o poder das transições React

Comparação com Alternativas

Visx vs D3.js + React

  • Visx: Integração natural, sem conflitos de DOM
  • D3.js + React: Requer workarounds, mais propenso a bugs

Visx vs Recharts

  • Visx: Mais flexibilidade, componentes de baixo nível
  • Recharts: Mais simples para gráficos comuns, menos customizável

Visx vs Chart.js

  • Visx: Melhor integração React, mais customizável
  • Chart.js: Mais simples, maior comunidade, framework-agnostic

Recursos de Aprendizado

Para dominar Visx:

  • Gallery Oficial: Centenas de exemplos práticos no site oficial
  • Documentação: API bem documentada com exemplos
  • GitHub: Código fonte aberto com exemplos avançados
  • Blog Posts: Artigos da equipe do Airbnb sobre os conceitos

Futuro da Visx

Visx está em constante evolução, com a equipe do Airbnb continuamente adicionando novos componentes e melhorias. A biblioteca representa o futuro das visualizações de dados em React, oferecendo uma abordagem que é tanto poderosa quanto alinhada com as melhores práticas modernas de desenvolvimento.

Conclusão

Visx representa uma evolução natural para desenvolvedores React que precisam de visualizações de dados sofisticadas. Ela resolve o problema fundamental de integração entre D3.js e React, oferecendo uma API que é familiar para desenvolvedores React mas poderosa o suficiente para criar qualquer tipo de visualização.

Se você já trabalha com React e busca uma alternativa moderna ao D3.js puro, ou se precisa de mais flexibilidade do que bibliotecas como Recharts oferecem, Visx pode ser a solução ideal para seus projetos.

Espero que tenham gostado e até a próxima! ❤


Este post faz parte da série “8 Bibliotecas de JavaScript para Gráficos”. Confira os posts anteriores sobre Chart.jsRechartsECharts e D3.js.