JavaScript y Web APIs: lenguaje, navegador y runtime | Nicolás Garzón
JavaScript es el lenguaje. Las Web APIs son capacidades que el navegador proporciona para trabajar con documentos, red, almacenamiento, permisos, sensores y otros recursos.
Texto
Copiar ECMAScript
├─ valores
├─ funciones
├─ objetos
├─ promesas
└─ módulos
Navegador
├─ window y document
├─ eventos
├─ fetch
├─ almacenamiento
├─ timers
├─ workers
└─ permisos y dispositivos
Estas características pertenecen al lenguaje:
JavaScript
Copiar Array;
Map;
Promise;
JSON ; Estas pertenecen al navegador:
JavaScript
Copiar document;
fetch;
localStorage;
navigator;
setTimeout; Otros runtimes pueden ofrecer APIs diferentes.
JavaScript
Copiar globalThis === window; En una ventana principal normalmente es true. globalThis permite referirse al global de forma portable, aunque las propiedades disponibles dependen del contexto.
En un worker no existe window ni document, pero sí otro global.
El DOM representa documentos HTML y XML como nodos manipulables.
JavaScript
Copiar const button = document. querySelector ( "button" ) ;
button. textContent = "Save" ; No pertenece al núcleo de JavaScript; es una API del navegador.
JavaScript
Copiar button. addEventListener ( "click" , handleClick) ; El navegador crea y despacha eventos. JavaScript ejecuta las callbacks cuando el Event Loop lo permite.
JavaScript
Copiar const response = await fetch ( "/api/products" ) ; Fetch trabaja con Request, Response, Headers, streams y políticas del navegador como CORS.
JavaScript
Copiar localStorage;
sessionStorage;
indexedDB;
caches;
Web Storage es síncrono y basado en strings.
IndexedDB es asíncrono y estructurado.
Cache Storage guarda pares Request-Response.
JavaScript
Copiar new URL ( "/products" , location. origin) ;
history. pushState ( { } , "" , "/products" ) ; location, history y URL permiten leer o cambiar navegación bajo reglas del navegador.
JavaScript
Copiar await navigator. permissions. query ( {
name : "geolocation" ,
} ) ; No todas las APIs utilizan exactamente el mismo flujo de permisos. Algunas requieren:
Contexto seguro.
Interacción del usuario.
Permiso explícito.
Dispositivo compatible.
Política del navegador o empresa.
JavaScript
Copiar if ( "IntersectionObserver" in globalThis) {
} Detecta capacidades cuando existe una alternativa razonable. La presencia de una propiedad no siempre garantiza que el usuario conceda permiso o que todas las opciones estén soportadas.
APIs sensibles suelen requerir HTTPS. localhost puede recibir excepciones para desarrollo.
HTTPS no vuelve segura toda la aplicación; protege el transporte y habilita garantías necesarias para ciertas capacidades.
JavaScript
Copiar navigator. geolocation. getCurrentPosition (
onSuccess,
onError,
) ; JavaScript
Copiar document. addEventListener (
"visibilitychange" ,
handleVisibility,
) ; JavaScript
Copiar await navigator. clipboard. writeText ( text) ; Cada API define su contrato. No todas pueden consumirse de la misma manera.
Un listener, observer, timer o worker puede conservar referencias y seguir trabajando.
JavaScript
Copiar const observer = new IntersectionObserver ( callback) ;
observer. observe ( element) ;
function dispose ( ) {
observer. disconnect ( ) ;
} Quien inicia una capacidad también debería definir cómo detenerla.
Una API puede fallar porque:
No existe soporte.
El usuario negó permiso.
El documento no está activo.
La red falló.
El recurso desapareció.
La política de seguridad lo bloqueó.
El contexto no es seguro.
No conviertas todos esos casos en un mensaje genérico sin conservar la causa.
Hay tres preguntas distintas:
Texto
Copiar ¿La sintaxis se puede parsear?
¿La API existe?
¿La función está permitida en este contexto?Un transpiler puede resolver sintaxis, pero no inventar acceso a geolocalización o clipboard donde el host no lo ofrece.
Estas entradas siguen siendo externas:
Formularios.
URL.
Storage.
Mensajes entre ventanas.
Respuestas de red.
Datos de sensores.
Valida antes de llevarlas al núcleo de la aplicación.
JavaScript
Copiar async function copyText ( text ) {
if ( navigator. clipboard?. writeText) {
await navigator. clipboard. writeText ( text) ;
return ;
}
throw new Error (
"Clipboard API is not available" ,
) ;
} La función expresa la ausencia de capacidad en lugar de fingir éxito.
Afirmar que fetch, DOM o timers forman parte de ECMAScript.
Esperar las mismas APIs en navegador, Node y workers.
Pedir permisos al cargar la página sin contexto.
No limpiar listeners, observers o timers.
Confiar en información proveniente de storage o URL.
Confundir compatibilidad de sintaxis con compatibilidad de API.
Tratar HTTPS como garantía total de seguridad.
Usar una API sin fallback ni mensaje de capacidad ausente.
JavaScript depende de un host para interactuar con el mundo exterior.
El navegador proporciona DOM, red, almacenamiento y dispositivos.
Cada contexto tiene un global y capacidades diferentes.
Permiso, soporte y contexto seguro son condiciones distintas.
Las APIs externas también necesitan validación y manejo de errores.
Los recursos de larga vida necesitan cleanup.
Un transpiler no sustituye una API ausente.
¿Por qué Promise puede existir en un worker, pero document no?
Respuesta Promise pertenece a ECMAScript. document pertenece al DOM de una ventana y un worker no controla directamente un documento.
DOM explica cómo el navegador representa, consulta y modifica un documento.