Então, você precisa adicionar alguns gráficos ao seu aplicativo ou site? Agora você já percebeu que existem muitas maneiras diferentes de fazer isso, a maioria das quais utiliza uma das duas tecnologias principais: SVG e API do Canvas.
Para decidir qual se adapta melhor às suas necessidades, precisamos observar os pontos fortes e fracos relativos do SVG e do Canvas e como eles influenciam as diferentes soluções de desenho de gráficos disponíveis.
Canvas e SVG são tecnologias que permitem aos desenvolvedores da web desenhar imagens na tela, mas eles têm APIs e abordagens muito diferentes para fazer isso.
O que é SVG?
SVG significa “gráficos vetoriais escaláveis” e representa um conjunto de padrões para definir declarativamente as propriedades de uma imagem (coisas como as próprias formas, cor de preenchimento, cor do traço e outros).
As imagens SVG são criadas inline com o código HTML adicionando uma tag ou podem ser definidas em arquivos separados (com a extensão
.svg
) e referenciadas no HTML.
O que é Canvas?
O Canvas é uma API padrão de navegador de nível inferior que permite aos desenvolvedores “desenhar” imperativamente diretamente na imagem, emitindo uma série de comandos:
const canvas=document.querySelector ('canvas'); const ctx=canvas.getContext ('2d'); ctx.fillStyle='# FFA69E'; ctx.arc (50, 50, 45, 0, 2 * Math.PI); ctx.fill ();
As imagens da tela são criadas adicionando um elemento ao HTML e, em seguida, manipulando esse elemento por meio da API JavaScript DOM, conforme mostrado acima.
SVG vs. Canvas: diferenças de API
Como o Canvas é uma API de nível inferior que o SVG, ele oferece mais flexibilidade do que o SVG em troca de maior complexidade. O limite do que pode ser desenhado em um Canvas é apenas limitado por quanto código um desenvolvedor está disposto a escrever. Qualquer imagem SVG pode ser desenhada com a API Canvas com esforço suficiente.
Por outro lado, como o SVG é uma API de nível superior em comparação com o Canvas, ele pode criar imagens complexas sem exigir que os desenvolvedores escrevam códigos complicados.
Neste exemplo, aplicamos efeitos de iluminação e desfoque a alguns polígonos em apenas 15 linhas de código SVG. O código do Canvas correspondente seria muito mais complexo para produzir a mesma imagem:
No entanto, como o Canvas oferece mais flexibilidade, nem todas as imagens que podem ser desenhadas em um Canvas podem ser expressas com precisão com a sintaxe SVG (além de usar pequenos elementos
SVG como “pixels”).
Esta imagem seria um pouco mais difícil de produzir usando SVG:
const canvas=document.querySelector ('canvas'); const ctx=canvas.getContext ('2d'); mixagem de funções (canal1, canal2, proporção, variabilidade) { const scaledVariability=variabilidade * 0xFF; retorno canal1 * (1-proporção) + canal2 * proporção- scaledVariability/2 + scaledVariability * Math.random (); } const color1={ r: 0xAA, g: 0x44, b: 0x65, }; const color2={ r: 0x86, g: 0x16, b: 0x57, }; variabilidade const=0,2; para (x=0; x
Existem implicações importantes a serem consideradas ao usar SVG versus Canvas. As diferenças fundamentais na API entre SVG e Canvas descritas acima têm efeitos posteriores que você deve considerar, como o seguinte:
Elementos SVG podem existir no DOM junto com a marcação HTML
Isso significa que os elementos SVG DOM podem ser manipulados de maneiras familiares aos desenvolvedores da web, incluindo a integração em estruturas populares como React ou Vue.
Uma desvantagem disso é que gráficos SVG complexos contendo dezenas de milhares de nós, por exemplo, podem provar ser muito intensivos em recursos para que os navegadores renderizem com eficiência, levando a páginas da web lentas ou instáveis. Isso ocorre porque as operações do Canvas são comprometidas diretamente na tela, de modo que o número de operações de desenho é menos impactante para o desempenho, pois não há sobrecarga de manter o controle dessas operações no DOM.
Assim como o HTML, SVG é declarativo
Isso significa que o navegador se encarrega de traduzir a imagem desejada no código imperativo de baixo nível para desenhar pixels na tela-o desenvolvedor não precisa se preocupar com isso. Imagens complexas podem ser representadas sucintamente na sintaxe SVG.
As imagens SVG podem ser responsivas e as imagens do Canvas não
Os SVGs podem aumentar e diminuir em resposta aos tamanhos do contêiner pai ou às alterações no tamanho da tela, enquanto os elementos Canvas precisam de JavaScript personalizado para atingir esse comportamento.
SVG x Canvas: o que é melhor para você?
Com as diferenças entre SVG e Canvas em mente, podemos avaliar as necessidades de nosso projeto gráfico e determinar qual tecnologia pode nos servir melhor. Vale a pena perguntar o seguinte:
- Os gráficos terão muitos elementos ou serão altamente detalhados? O Canvas pode ter um desempenho melhor para mostrar esses dados sem sobrecarregar o navegador com muitos nós DOM. Mas se os gráficos forem relativamente simples, a sintaxe SVG pode ser uma solução mais simples e rápida para lançar um gráfico de boa aparência rapidamente.
- Seus gráficos precisam ter várias animações ou ser responsivos em largura? Embora seja certamente possível renderizar animações usando o Canvas ou fazer com que os elementos do Canvas respondam às mudanças de largura, pode ser mais simples conseguir esses efeitos usando SVG e CSS.
- Os gráficos precisam ser interativos? Como os elementos SVG estão no DOM, responder às ações do usuário, como cliques em elementos específicos de um gráfico, é tão simples quanto responder a eventos em qualquer outro elemento DOM. A interatividade da tela é possível, mas exigirá algum código adicional.
Bibliotecas de gráficos
Como a renderização de visualizações de dados é um caso de uso comum para sites e aplicativos, há uma infinidade de bibliotecas que facilitam o desenho de gráficos com Canvas ou SVG. Uma rápida pesquisa DuckDuckGo de “ bibliotecas de gráficos JavaScript ” mostrará dezenas de páginas descrevendo muitas das diferentes opções disponíveis.
Algumas opções populares oferecem gráficos de ótima aparência prontos para uso, como Chart.js ou Chartist . Outros são mais complexos, mas permitem mais personalização, como Vega-Lite . Muitas bibliotecas são construídas sobre a biblioteca de fato para visualização de dados na web, como D3.js , que oferece total flexibilidade e controle às custas de uma curva de aprendizado íngreme.
Renderização de gráficos no backend
A criação de gráficos com SVG e Canvas não se limita aos contextos do navegador; eles também podem ser renderizados em aplicativos de servidor.
Para SVG, uma ferramenta como Puppeteer pode ser usada para renderizar imagens SVG em um navegador Chrome sem interface e gerar capturas de tela conforme desejado. Para o Canvas, há uma biblioteca fantástica chamada Canvas que fornece uma versão quase completa implementação da API Canvas padrão para Node.js.
Um exemplo de renderização de back-end do Canvas
Este snippet de JavaScript codifica uma mensagem secreta. Para ver o que é, salve este código em um arquivo chamado
index.js
:const {join}=require ('path'), {createWriteStream}=require ('fs'), {createCanvas}=require ('canvas'); const canvas=createCanvas (200, 100); const ctx=canvas.getContext ('2d'); ctx.strokeStyle='# 861657'; ctx.lineWidth=5; ctx.lineCap='redondo'; ctx.beginPath (); ctx.moveTo (40, 25); ctx.lineTo (40, 75); ctx.moveTo (40, 50); ctx.lineTo (100, 50); ctx.moveTo (100, 25); ctx.lineTo (100, 75); ctx.moveTo (160, 25); ctx.lineTo (160, 75); ctx.stroke (); const path=join (__ dirname,'message.png'); const out=createWriteStream (path); stream const=Canvas.createPNGStream (); stream.pipe (out); out.on ('terminar', ()=> console.log (`Arquivo de imagem criado em $ {path}.`));Em seguida, salve um arquivo chamado
package.json
ao lado deindex.js
com o seguinte conteúdo:{ "privado": verdadeiro, "dependências": { "canvas":"^ 2.7.0" } }No mesmo diretório onde você salvou
index.js
epackage.json
, execute o seguinte comando (Node.js deve estar instalado disponível em seuPATH
):npm install node index.jsSe tudo correr conforme o planejado, sua imagem PNG gerada sem cabeçalho com mensagem secreta será salva em
message.png
.Conclusão
SVG e Canvas são tecnologias poderosas e maduras, cada uma com um forte ecossistema de bibliotecas e documentação para ajudar a dar vida aos seus gráficos. E algumas bibliotecas até suportam renderização para SVG ou Canvas!
Não tenha medo de investir algum tempo na avaliação de alternativas para encontrar a solução certa para as necessidades específicas do seu projeto. Aqui estão algumas regras práticas rápidas quando se trata de decidir sobre SVG ou Canvas.
- Seus gráficos precisam ser responsivos ou interativos? O SVG pode oferecer esses recursos de forma mais simples do que o Canvas.
- Seus gráficos serão altamente detalhados ou complexos? Canvas pode oferecer melhor desempenho e maior controle do que SVG.
Boa sorte!
A postagem Usando SVG vs. Canvas: um breve guia apareceu primeiro em LogRocket Blog .