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.

  • Enfrentando a Complexidade com GraphQL

    Descubra como GraphQL facilita o desenvolvimento de soluções inteligentes com IA.

    Descubra como GraphQL facilita o desenvolvimento de soluções inteligentes com IA.

    Ler notícia completa
    Banner de podcast da UX Magazine intitulado
  • UX: Emoções Além das Telas no Design

    Descubra como o design emocional transforma experiências, indo além das telas e criando conexões humanas.

    Descubra como o design emocional transforma experiências, indo além das telas e criando conexões humanas.

    Ler notícia completa
    Símbolo abstrato em tons de marrom e laranja que se assemelha a uma pessoa estilizada com braços estendidos e uma perna erguida.
  • Como usar CSS line-clamp para limitar texto

    Aprenda a usar a propriedade CSS line-clamp para limitar linhas de texto e melhorar a aparência do layout.

    Aprenda a usar a propriedade CSS line-clamp para limitar linhas de texto e melhorar a aparência do layout.

    Ler notícia completa
    Fundo gradiente em tons de laranja e violeta com o texto
  • Promise.all ainda é relevante em 2025?

    Antes das promises serem introduzidas nativamente no JavaScript, usávamos muitos callbacks para tarefas assíncronas. É comum ver callbacks sendo usados, pois muitos desenvolvedores podem ainda pensar que callbacks e promises são o mesmo, mas não são. Quando promises foram introduzidas, substituíram amplamente os callbacks, tornando a sintaxe mais compreensível. Em 2025, com async/await, Promise.allSettled, Promise.any […]

    Promise.all é crucial para tarefas assíncronas, mas novas alternativas surgem em 2025. Saiba quando usá-lo.

    Ler notícia completa
    Logotipo do JavaScript (JS) em quadrado amarelo sobre fundo com ondas suaves em tons de branco e cinza claro.
  • Equilibrando IA e UX: O Desafio do Design Humanizado

    A IA está sendo integrada aos fluxos de trabalho de design modernos, ajudando na geração de conteúdo, ideação e prototipagem. Isso aumenta a eficiência das equipes de design, aprimorando a forma como criamos, pensamos e resolvemos problemas. No entanto, a IA também traz preocupações ao processo de design, como a possível perda de foco no […]

    Descubra como manter o design UX humanizado enquanto utiliza IA para otimizar processos e aumentar a produtividade.

    Ler notícia completa
    Mão robótica branca tocando a ponta do dedo de uma mão humana contra um fundo colorido em tons de arco-íris.
  • A Revolução dos Navegadores com IA: Impactos e Futuro

    Há uma revolução silenciosa ocorrendo em um software que você usa diariamente, mas raramente pensa sobre: o navegador. Chrome, Safari, Firefox têm sido nossas janelas para a web por décadas. Agora, algo significativo está acontecendo. Uma nova espécie de navegador está surgindo: o navegador com IA. Ele não apenas muda como navegamos, mas redefine o […]

    Navegadores com IA estão mudando a web, impactando a criatividade, economia e verdade online.

    Ler notícia completa
    Tela de interface do Instacart mostrando produtos essenciais para praia à venda, como protetor solar e toalhas, com uma janela de chat com o assistente virtual aberta.
  • As 3 previsões para o futuro do design UX

    A evolução tecnológica moderniza e melhora todas as áreas da tecnologia, incluindo o design de dispositivos digitais, automação, desenvolvimento de software e design UI/UX. Essa evolução e as inovações em HCI (Interação Humano-Computador) impulsionam o design UI/UX para ajudar designers a criar produtos digitais mais amigáveis, usáveis e produtivos para todos os usuários. O design […]

    Confira as três principais previsões para a próxima era do design UX e como elas podem impactar o futuro das interfaces digitais.

    Ler notícia completa
    Ilustração em 3D de um computador desktop moderno com ícones em estilo futurista na tela, sobre fundo roxo com linhas de rede digitais.
  • A Importância do Enquadramento no Design

    No design, o enquadramento do problema está se tornando o cerne do papel humano. À medida que a IA, ou o que chamo de Programa, assume mais o trabalho de solução, nosso ofício muda para como tratamos o problema. “A IA não está substituindo designers; está substituindo designers que focam em saídas automatizáveis.” Citação e […]

    Explorando como o enquadramento de problemas redefine o papel humano no design em tempos de IA.

    Ler notícia completa
    Imagem de rabisco em preto e branco cheia de palavras e desenhos, incluindo cabeças estilizadas, uma palavra
  • Psicologia Ética no E-commerce: Facilite Compras

    A psicologia no e-commerce tem uma má reputação, muitas vezes associada a táticas de manipulação como escassez artificial e cobranças ocultas. No entanto, existe um lado positivo: a facilitação das compras sem manipulação. Trabalhando anos com e-commerce, percebi que a maioria dos problemas de conversão está em facilitar o processo de compra. Vou mostrar quatro […]

    Aprenda como remover barreiras psicológicas no e-commerce, promovendo compras éticas sem manipulação.

    Ler notícia completa
    Ilustração de um trator removendo neve da estrada, com carros vermelhos parcialmente cobertos de neve ao lado. Ambiente frio com árvores ao fundo.