Capítulo 2: La Trinidad del Desarrollo Web Frontend
Ningún pintor domina su arte usando solo un color; necesita una paleta completa de colores trabajando juntos en armonía. Así, una persona desarrolladora frontend no domina su arte con solo JavaScript: necesita comprender cómo HTML, CSS y JavaScript colaboran para crear experiencias web completas. Aunque hoy en día frameworks y arquitecturas basadas en componentes son fundamentales, la base sigue siendo esta trinidad. Este capítulo explora la relación entre las tecnologías clásicas y cómo JavaScript potencia las capacidades de HTML y CSS en 2025.
2.1. HTML, CSS y JavaScript: Roles complementarios
Para comprender JavaScript en contexto, aclaremos el rol de cada tecnología en la actualidad:
HTML: La Estructura
HTML (HyperText Markup Language) define la estructura semántica del contenido. Es el esqueleto de la web:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Mi Página Web</title>
</head>
<body>
<header>
<h1>Bienvenido</h1>
</header>
<main>
<p>Este es el contenido principal.</p>
<button id="miBoton">Haz clic</button>
</main>
<footer>
<p>Pie de página</p>
</footer>
</body>
</html>Responsabilidades de HTML:
Definir elementos semánticos (encabezados, listas, formularios…)
Estructurar el contenido de forma lógica
Proporcionar accesibilidad con etiquetas semánticas
Cargar recursos (scripts, hojas de estilo, imágenes...)
CSS: La Presentación
CSS (Cascading Style Sheets) determina cómo luce el contenido. Es la “ropa” de la página. En 2025 es común el uso de variables CSS (custom properties), media queries modernas y diseño responsivo avanzado.
Responsabilidades de CSS:
Estilos visuales, fuentes y colores
Maquetación y posicionamiento
Animaciones y transiciones declarativas
Responsive design y temas gracias a
custom properties(variables CSS)
JavaScript: La Interactividad
JavaScript es el cerebro de la página. Permite responder a eventos y modificar dinámicamente estructura y estilos del documento. Aunque el desarrollo moderno tiende a la modularidad y los frameworks, dominar la manipulación básica sigue siendo esencial.
Responsabilidades de JavaScript:
Gestionar eventos del usuario
Manipular el DOM (Document Object Model)
Realizar validaciones y lógica de negocio
Hacer peticiones asíncronas a servidores (
fetch, APIs)Animar elementos y modificar variables CSS
2.2. Integración de JavaScript con HTML
La mejor práctica actual: <script type="module">
<script type="module">En 2025, la recomendación general es cargar los scripts JavaScript como módulos ES6 usando la etiqueta:
Ventajas:
Permite import/export de módulos ("import ... from ...")
El script se ejecuta de forma diferida automáticamente (
deferpor defecto)El código está mejor aislado y es más mantenible
Se puede ubicar el
<script>en el<head>si se desea, o al final del<body>, pero ya no es necesario “esconderlo” para rendimiento
Ejemplo básico con módulos:
Y en app.js:
Otras formas (válidas, pero menos recomendadas para código moderno)
Script inline:
<button onclick="alert('Hola')">Haz clic</button>(Solo para ejemplos muy pequeños o landing pages)Script tradicional:
<script src="..."></script>Solo si necesitas asegurar compatibilidad con navegadores muy antiguos.
¿Por qué se emplea type="module"?
type="module"?Los módulos permiten importar/exportar funciones, clases y constantes entre archivos JS.
Se ejecutan de forma deferida, evitando bloqueos en el parseo HTML.
Fomentan la reutilización y la organización del código.
2.3. Integración de JavaScript con CSS
Modificar estilos mediante variables CSS
Además de manipular clases CSS con classList, cabe reseñar que hoy en día es habitual la manipulación de variables CSS directamente desde JS:
Modificar estilos mediante clases CSS (Recomendado)
No obstante, la práctica recomendada sigue siendo modificar clases CSS para activar estilos que ya se definieron en la hoja de estilos:
Modificar estilos inline (No recomendado - Legacy)
Ventajas de usar clases CSS sobre estilos inline:
Mantenibilidad
Difícil, disperso
Centralizado y limpio
Reutilización
Pobre
Máxima
Especificidad
Alta, poco flexible
Controlada
Rendimiento
Menor
CSS más eficiente
Separación de roles
JavaScript para todo
CSS para estilos, JS para lógica
2.4. El flujo de carga de una página web
Entender el flujo de carga es crucial para optimizar rendimiento y evitar errores comunes:
El navegador solicita y parsea el HTML El DOM se construye elemento a elemento.
Descarga recursos externos: CSS, imágenes y JS mediante etiquetas
<link>,<img>y<script>.Ejecución de scripts: Con
type="module", los scripts se ejecutan diferidos automáticamente después de parsear el documento.Renderizado El navegador pinta la página.
Eventos Ya puedes interactuar: los listeners JS funcionan sobre elementos del DOM.
¡Cuidado!
Si intentas acceder a un elemento antes de que exista en el DOM, obtendrás null. Por eso, los scripts modernos usan módulos o esperan al evento DOMContentLoaded (pero con módulos ya no suele ser necesario).
Soluciones:
Colocar
<script type="module">en el<head>, ya que se difiere automáticamente.Usar el atributo
defersi no usas módulos.O escuchar el evento
DOMContentLoaded:
2.5. Ejemplo integrado: aplicación web simple
Y en contador.js:
Este ejemplo integra estructura (HTML), presentación (CSS y variables), lógica y persistencia de estado (JS moderno + localStorage).
Resumen del Capítulo
La trinidad frontend sigue vigente, pero sus buenas prácticas han evolucionado:
HTML estructura el contenido semánticamente.
CSS define estilos, layouts y temas, usando variables modernas.
JavaScript añade lógica, interactividad y manipula tanto el DOM como las variables CSS; además, a día de hoy se usa casi siempre con type="module" para organizar el código y aprovechar los módulos nativos de ECMAScript.
💡 Conceptos clave 2025
HTML = Estructura y semántica
CSS = Presentación visual, responsividad, variables
JavaScript = Interactividad y lógica modular
Mejor práctica: siempre que puedas, usa
<script type="module">Flujo de carga: los scripts módulo modernos no bloquean el render
Manipulación DOM + CSS: prioriza clases CSS y variables sobre estilos inline
🤔 Preguntas de reflexión
¿Por qué hoy se prefiere usar
type="module"al cargar JavaScript?¿Qué ventajas aporta diseñar estilos con clases y variables frente a estilos “en línea”?
¿Qué sucede si accedes a un elemento HTML desde JS antes de parsear el DOM?
¿Cómo limitarías el rango del contador para evitar valores extremos?
¿Cómo lograrías que el valor del contador no se pierda tras recargar la página?
Última actualización
¿Te fue útil?