6 APIs JavaScript desconhecidas que você deve usar
Descubra 6 APIs JavaScript pouco conhecidas para criar aplicações dinâmicas e eficientes.

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.
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);
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.