Categorias do Site

6 APIs JavaScript desconhecidas que você deve usar

Descubra 6 APIs JavaScript pouco conhecidas para criar aplicações dinâmicas e eficientes.

Um círculo amarelo com as letras

Navegadores modernos vêm equipados com APIs JavaScript nativas poderosas que permitem aos desenvolvedores criar aplicações mais dinâmicas e eficientes sem a necessidade de bibliotecas externas. Neste artigo, exploraremos seis dessas APIs: structuredClone, EyeDropper, AbortController, Intersection Observer, ResizeObserver e a Clipboard API. Para cada uma, explicaremos os problemas que resolve, quando usá-la e como implementá-la.

6 Hidden Gems In The JavaScript API You Should Be Using

Antes de começarmos, é importante entender por que essas APIs não são mais conhecidas, apesar de sua utilidade:

  • São relativamente novas: Muitas dessas APIs foram introduzidas recentemente.
  • Falta de conhecimento: Sites populares e tutoriais geralmente usam soluções antigas, o que resulta em pouca visibilidade para as novas APIs.
  • Suporte limitado de navegadores: Algumas dessas APIs ainda não são totalmente suportadas em todos os navegadores.
  • Casos de uso específicos: Muitas vezes, essas APIs resolvem problemas específicos que nem todos os desenvolvedores encontram.

structuredClone

Clonar objetos profundamente sempre foi um desafio em JavaScript. Com structuredClone, é possível clonar objetos complexos sem bibliotecas externas.

// Objeto original com dados aninhados
const original = {
    name: "Richardson",
    age: 28,
    address: {
        city: "New York",
        street: "Wall Street",
        zip: "10001"
    },
    hobbies: ["reading", "hiking"],
    created: new Date()
};
// Criar um clone profundo usando structuredClone
const copy = structuredClone(original);
// Modificar o clone
copy.name = "Jane";
copy.address.city = "Los Angeles";
copy.hobbies.push("music");
// O objeto original permanece inalterado
console.log("Original:", original);
console.log("Clone:", copy);

Console

EyeDropper API

A API EyeDropper permite criar um seletor de cores nativo, sem bibliotecas externas. Embora ainda seja experimental e disponível apenas no Chrome, Edge e Opera, é útil em aplicativos de edição ou desenho.

<button id="pickColor">Pick a Color</button>
<div id="colorDisplay" style="width: 100px; height: 100px; border: 1px solid #ccc"></div>
<br />
<script>
document.getElementById("pickColor").addEventListener("click", async () => {
    if ("EyeDropper" in window) {
        const eyeDropper = new EyeDropper();
        try {
            const result = await eyeDropper.open();
            document.getElementById("colorDisplay").style.backgroundColor = result.sRGBHex;
        } catch (e) {
            console.error("Error using EyeDropper:", e);
        }
    } else {
        alert("EyeDropper API is not supported in this browser.");
    }
});
</script>

AbortController

AbortController ajuda a cancelar requisições que já foram enviadas, útil para interfaces de busca que precisam lidar com requisições desatualizadas.

import React, { useEffect, useState } from 'react';

function SearchComponent({ query }) {
  const [results, setResults] = useState([]);
  const [loading, setLoading] = useState(false);

  useEffect(() => {
    const controller = new AbortController();
    const signal = controller.signal;

    const debounceRequest = setTimeout(() => {
      setLoading(true);
      fetch(`https://api.example.com/search?q=${query}`, { signal })
        .then(res => res.json())
        .then(data => {
          setResults(data.results);
          setLoading(false);
        })
        .catch(err => {
          if (err.name === 'AbortError') {
          console.log("Request was aborted")
          } else {
            console.log('Search failed', err);
            setLoading(false);
          }
        });
    }, 500);

    return () => {
      clearTimeout(debounceRequest);
      controller.abort();
    };
  }, [query]);

  return (
    <div>
      {loading && <p>Searching...</p>}
      <ul>
        {results.map(r => (
          <li key={r.id}>{r.name}</li>
        ))}
      </ul>
    </div>
  );
}

Intersection Observer

O Intersection Observer permite que você execute código quando elementos entram ou saem do viewport, ideal para carregamento preguiçoso de imagens e rolagem infinita.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Lazy Load Images</title>
    <style>
      body {
        font-family: sans-serif;
        margin: 0;
        padding: 20px;
        background: #f5f5f5;
      }
      img {
        width: 100%;
        max-width: 600px;
        margin: 30px auto;
        display: block;
        min-height: 500px;
        background-color: #ddd;
        object-fit: cover;
        transition: opacity 0.5s ease-in-out;
        opacity: 0;
      }
      img.loaded {
        opacity: 1;
      }
    </style>
  </head>
  <body>
    <img
      data-src="https://images.unsplash.com/photo-1506744038136-46273834b3fb?w=800"
      alt="Forest"
    />
    <script>
      const images = document.querySelectorAll("img[data-src]");
      const observer = new IntersectionObserver(
        (entries, observer) => {
          entries.forEach((entry) => {
            if (!entry.isIntersecting) return;
            const img = entry.target;
            img.src = img.dataset.src;
            img.onload = () => img.classList.add("loaded");
            img.removeAttribute("data-src");
            observer.unobserve(img);
          });
        },
        {
          root: null,
          threshold: 0.1,
        }
      );
      images.forEach((img) => observer.observe(img));
    </script>
  </body>
</html>

ResizeObserver

ResizeObserver permite que desenvolvedores executem código quando um elemento muda de tamanho, útil para interfaces complexas que precisam ajustar o tamanho de texto ou gráficos em tempo real.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Auto-Scaling Text</title>
    <style>
      body {
        font-family: sans-serif;
        padding: 2rem;
      }
      .container {
        width: 60%;
        height: 200px;
        border: 2px dashed #aaa;
        resize: horizontal;
        overflow: hidden;
        padding: 1rem;
      }
      .autoscale-text {
        font-weight: bold;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
        transition: font-size 0.2s ease;
      }
    </style>
  </head>
  <body>
    <div class="container" id="textBox">
      <div class="autoscale-text" id="text">
        Resize container to auto scale this text.
      </div>
    </div>
    <script>
      const container = document.getElementById("textBox");
      const text = document.getElementById("text");
      const resizeObserver = new ResizeObserver(() => {
        const containerWidth = container.clientWidth;
        const minFontSize = 12;
        const maxFontSize = 70;
        const minWidth = 200;
        const maxWidth = 800;
        const clampedWidth = Math.max(
          minWidth,
          Math.min(maxWidth, containerWidth)
        );
        const ratio = (clampedWidth - minWidth) / (maxWidth - minWidth);
        const fontSize = minFontSize + (maxFontSize - minFontSize) * ratio;
        text.style.fontSize = fontSize + "px";
      });
      resizeObserver.observe(container);
    </script>
  </body>
</html>

A Clipboard API

A API Clipboard foi introduzida para fornecer acesso programático à área de transferência do sistema, suportando tanto copiar quanto colar conteúdo, como texto e imagens. Requer permissão do usuário e HTTPS.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Clipboard API Example</title>
  </head>
  <body>
    <h2>📋 Clipboard API Demo</h2>
    <button id="copyTextBtn">Copy Text to Clipboard</button>
    <div class="playground">
      <div id="copy-from">This will be copied to the clipboard!</div>
      <div id="copy-to"><textarea></textarea></div>
    </div>

    <img id="copyImage" src="./sample1.png" alt="Sample" />
    <button id="copyImageBtn">Copy Image to Clipboard</button>
    <script>
      // Copy Text
      document
        .getElementById("copyTextBtn")
        .addEventListener("click", async () => {
          try {
            const e = document.getElementById("copy-from");
            await navigator.clipboard.writeText(e.innerText);
            alert("Text copied to clipboard!");
          } catch (err) {
            console.error("Text copy failed:", err);
            alert("Failed to copy text.");
          }
        });
      // Trigger copy event
      document.addEventListener("copy", () =>
        alert("Something was copied to the system clipboard")
      );
      // Trigger paste event
      document.addEventListener("paste", () =>
        alert("Something was pasted from the system clipboard")
      );
      // Copy Image
      document
        .getElementById("copyImageBtn")
        .addEventListener("click", async () => {
          const image = document.getElementById("copyImage");
          try {
            const response = await fetch(image.src);
            const blob = await response.blob();
            const clipboardItem = new ClipboardItem({ [blob.type]: blob });
            await navigator.clipboard.write([clipboardItem]);
            alert("Image copied to clipboard!");
          } catch (err) {
            console.error("Image copy failed:", err);
            alert("Failed to copy image.");
          }
        });
    </script>
  </body>
</html>

Conclusão

Neste artigo, exploramos algumas pérolas ocultas na API JavaScript:

  • structuredClone: Permite clonar objetos JSON profundamente.
  • EyeDropper API: Adiciona a capacidade de escolher cores sem um pacote npm.
  • AbortController: Permite cancelar requisições XHR já enviadas.
  • Intersection Observer: Permite executar código quando um elemento muda de visibilidade.
  • ResizeObserver: Permite executar código quando um elemento muda de tamanho.
  • Clipboard API: Permite copiar imagens junto com texto para a área de transferência do sistema.

Essas APIs nativas do navegador desbloqueiam uma ampla gama de casos de uso — desde clonagem profunda de objetos complexos e observação do tamanho ou visibilidade de elementos até operações de área de transferência e escolha de cores — tudo sem recorrer a pacotes externos. Ao entender e usar essas ferramentas, você pode construir aplicações web mais rápidas, eficientes e com código mais limpo. E o melhor: todas estão embutidas no navegador.

  • Problemas com React Server Components

    Descubra os desafios e surpresas ao usar React Server Components em projetos reais.

    Descubra os desafios e surpresas ao usar React Server Components em projetos reais.

    Ler notícia completa
    Ícone de átomo neon azul-ciano flutuando sobre fundo roxo com linhas e pontos brilhantes, sugerindo um ambiente digital ou espaço cósmico.
  • Chave para IA Geral: Anotação Ética é Essencial

    Anotação ética é crucial para a IA Geral, garantindo respeito aos anotadores e criando consciências justas.

    Anotação ética é crucial para a IA Geral, garantindo respeito aos anotadores e criando consciências justas.

    Ler notícia completa
    Ilustração estilizada de quatro pessoas trabalhando em computadores, com um fundo de rede neural e um documento flutuante à direita, em tons azuis e laranja.
  • Como reduzir a troca de tarefas no design UX

    Descubra como otimizar a experiência do usuário reduzindo a troca de tarefas em plataformas digitais complexas.

    Descubra como otimizar a experiência do usuário reduzindo a troca de tarefas em plataformas digitais complexas.

    Ler notícia completa
    Ícone de personagem estilizado, parecido com um boneco, segurando um laptop e um celular, com um balão de fala acima, sobre um fundo abstrato cintilante e colorido.
  • Confissões de um Generalista em Web Design

    Existe um tipo especial de designer web por aí. Eles são os generalistas, aqueles que fazem a internet moderna funcionar, muitas vezes sem reconhecimento. Bem-vindo ao Multiverso de Você Você sabe quem é. Você projeta o site, constrói, escreve o texto quando ninguém mais aparece. Você lida com o CMS e descobre por que o […]

    Descubra o papel crucial do generalista em web design e sua habilidade única de gerenciar caos e criar soluções.

    Ler notícia completa
    Homem surpreso com cabelo despenteado e óculos redondos segura uma caneca e cabos, cercado por coloridos papéis adesivos em fundo laranja e verde.
  • Roteamento de IA: Apps mais inteligentes com SDK

    Se você está desenvolvendo aplicações de IA, provavelmente está lidando com mais de um modelo de linguagem em sua aplicação: GPT-4 para tarefas gerais, Claude para codificação ou até mesmo o mais recente Nano Banana para geração de imagens. Durante o desenvolvimento, você pode querer experimentar modelos de código aberto localmente, caso seu hardware suporte. […]

    Aprenda a usar o roteamento de modelos sensível ao ambiente para criar apps de IA mais eficientes com o AI SDK.

    Ler notícia completa
    Círculo preto central com um triângulo branco sobre fundo que se assemelha a uma nuvem rosa gradientemente colorida.
  • Práticas de segurança para projetos com IA

    Assistentes de código com IA são comuns em IDEs devido à produtividade que trazem, mas uma pesquisa de Stanford revelou que desenvolvedores com assistência de IA tendem a criar códigos menos seguros. Para proteger um fluxo de trabalho assistido por IA, é necessário adotar uma disciplina ativa e multifacetada. Este artigo apresenta um guia prático […]

    Descubra práticas essenciais para proteger projetos gerados por IA e evitar vulnerabilidades comuns.

    Ler notícia completa
    Ilustração de um labirinto estilizado em tons de roxo e azul, com um grande símbolo de cadeado roxo no centro, representando segurança ou privacidade.
  • Interfaces de Voz e Imersão: Futuro da Experiência UX

    “As tecnologias mais profundas são aquelas que desaparecem. Elas se integram ao tecido da vida cotidiana até se tornarem indistinguíveis dela.” — Mark Weiser Seus usuários já estão interagindo com dispositivos por voz. Nos EUA, 62% dos adultos usam assistentes de voz, enquanto 42% das famílias no Reino Unido possuem dispositivos com essa funcionalidade. Eles […]

    Prepare seu produto para o futuro das interfaces de voz e imersão, que estão transformando a interação digital.

    Ler notícia completa
    Design gráfico com fundo azul escuro apresentando as palavras
  • Por que PMs e designers precisam de ambiente AI

    Resumo Executivo Agentes de IA estão avançando de protótipos para produção, mas muitos falham sem a base correta: um ambiente de execução de agentes de IA. Pesquisas do MIT revelam que 95% dos testes de IA generativa não geram impacto mensurável. A Forbes destaca que dados fragmentados e sinais conflitantes condenam a maioria dos pilotos, […]

    Ambiente de execução AI é essencial para sucesso de projetos, evitando falhas de integração e otimizando processos.

    Ler notícia completa
    Pintura abstrata de um horizonte de cidade com edifícios coloridos sob um céu geométrico dividido em seções coloridas com linhas conectando pontos.
  • Melhores Modelos de Relatórios para InDesign e Photoshop

    Relatórios empresariais podem abranger uma ampla gama de usos, desde grandes relatórios anuais até folhas de produtos de uma página. Criar um design detalhado do zero pode ser demorado. Como equilibrar eficiência e estética? Os modelos de relatórios empresariais e corporativos desta coleção são a solução ideal. Eles são pré-desenhados, personalizáveis e compatíveis com aplicativos […]

    Descubra modelos de relatórios empresariais para InDesign e Photoshop em 2025. Otimize seus designs e economize tempo.

    Ler notícia completa
    Diversas páginas de um relatório corporativo abertas, mostrando gráficos, fotos e textos sobre negócios e finanças, em design moderno e limpo.