Crear una landing de productos con JavaScript es más simple de lo que parece cuando se conecta a una Fake API. Aquí se integran manipulación del DOM, funciones utilitarias, y async/await para cargar y renderizar tarjetas de producto con imagen, título y precio de forma clara y optimizada.
¿Cómo estructurar el proyecto y preparar el DOM?
Antes de programar, se propone una estructura mínima: carpeta Async, archivo index.html con CSS y zonas identificadas por IDs. Luego, en app.js se referencian los nodos clave para controlar el flujo de datos y la interfaz.
Crear carpeta Async e index.html con estilos y secciones base.
Añadir app.js y enlazarlo desde el HTML.
Definir variables globales al inicio: API_URL, grid y status_text.
Usar querySelector con IDs definidos en el HTML.
// Configuración baseconstAPI_URL='URL_DE_LA_FAKE_API_DE_PRODUCTOS';// Referencias al DOMconst grid =document.querySelector('#grid-productos');const status_text =document.querySelector('#status');// Estado de carga y mensajesfunctionsetStatus(message){ status_text.textContent= message;}
¿Cómo actualizar el estado en la interfaz?
Con una función simple se comunica el flujo al usuario: cargando, error o listo. Esto brinda claridad y permite sumar un indicador visual después.
¿Qué funciones utilitarias mejoran el formateo y las imágenes?
Para mantener el código claro, se crean utilerías: formateo de precios y obtención de la imagen principal. La API entrega un arreglo de imágenes y solo se usa la primera.
format_price: añade el símbolo de dinero con template strings.
getProductImage: retorna product.images[0] para mostrar la primera imagen.
Recomendación comentada: convertir de dólares a pesos colombianos con una función adicional si se requiere.
functionformat_price(price){return`$${price}`;// utilería simple; se puede extender a COP si aplica}functiongetProductImage(product){return product.images[0];}
¿Cómo construir una card de producto accesible y optimizada?
La tarjeta combina semántica, rendimiento y seguridad: etiqueta article, imagen con lazy loading, referrerPolicy y crossOrigin, título h3 y precio en p. Se evita cargar imágenes fuera de pantalla y se minimizan conflictos al trabajar localmente.
¿Cómo cargar y renderizar productos con fetch y async/await?
Se implementa un flujo robusto con try/catch: se actualiza el estado, se hace fetch a la API_URL, se parsea a JSON y se limita el listado con slice(0, 9) para mostrar solo los primeros nueve productos. Luego se renderiza el grid y se limpia el estado.
fetch + async/await: llamado asíncrono claro y legible.
response.json(): transforma la respuesta para iterarla.
slice(0, 9): controla cuántos ítems se muestran.
for...of: itera productos y montas nodos con append.
Manejo de errores: mensaje de estado cuando falla la carga.
functionrenderProducts(products){ grid.innerHTML='';for(const product of products){const card =createProductCard(product); grid.append(card);}}asyncfunctionloadProducts(){try{setStatus('Cargando productos.');const response =awaitfetch(API_URL);const products =await response.json();const firstNine = products.slice(0,9);renderProducts(firstNine);setStatus('');}catch(error){console.error(error);setStatus('No se logró cargar los productos.');}}// InicializarloadProducts();
¿Cómo ver el resultado en el navegador con live server?
Se sugiere abrir index.html con Live Server desde el editor para observar el grid renderizado y la solicitud en tiempo real a la Fake API. Así validas que el DOM se actualiza con las cards, imágenes, títulos y precios.
¿Tienes dudas o quieres proponer mejoras al flujo de carga o al formateo de precios? Comparte tus ideas en los comentarios.