learning-front

Nivel 3 · JavaScript moderno y asíncrono

Proyecto: El puente de un HTML plano a un proyecto real

Por qué, cuando el proyecto crece, dejas de abrir un index.html a pelo y aparecen npm, el package.json y un bundler con servidor de desarrollo.

Cierras el Nivel 3 con un dominio real del lenguaje: la sintaxis moderna (destructuring, spread/rest, copias y acceso seguro con ?./??), cómo partir el código en módulos, las colecciones (Sets, Maps y los métodos modernos de array y objeto), el manejo de errores y toda la asincroníapromesas, async/await, el event loop y fetch—, más la librería estándar (regex, fechas y números). Has escrito JavaScript moderno de verdad. Pero todo el rato has trabajado igual que al principio: escribir ficheros y abrir un index.html en el navegador. Para aprender, perfecto. Para un proyecto real, se queda corto enseguida. Este capítulo es el puente: por qué aparece la maquinaria que rodea a cualquier proyecto profesional. No la dominarás aquí —eso es el Nivel 4—, pero entenderás qué problema resuelve cada pieza, que es lo que evita que parezca magia.

Dónde se queda corto abrir un HTML a pelo#

Tu mini-app de módulos funciona abriendo el index.html. En cuanto el proyecto crece, chocas con varios muros a la vez:

  • Código de terceros. Querrás usar librerías que otros han escrito (un validador, utilidades de fechas, React). ¿Cómo las descargas, las actualizas y sabes qué versión usas? A mano es inviable.
  • Imports “pelados”. Verás import { useState } from 'react', sin ruta ni .js. El navegador no sabe dónde está react: los módulos nativos exigen rutas relativas con extensión. Alguien tiene que resolver ese nombre.
  • Muchos ficheros = muchas peticiones. Un proyecto real tiene cientos de módulos. Servirlos uno a uno al navegador es lento. Conviene juntarlos en pocos ficheros optimizados.
  • Sintaxis que el navegador no entiende. TypeScript y el JSX de React no se ejecutan tal cual: hay que compilarlos a JavaScript normal antes.
  • Recargar a mano. Guardar y pulsar F5 mil veces al día es fricción pura. Querrás que la página se actualice sola al guardar.

Cada muro tiene su herramienta. Son las que vas a conocer.

npm: instalar y declarar lo que usas#

npm (Node Package Manager) es dos cosas: un registro gigantesco de paquetes (código que otros publican) y una herramienta de línea de comandos para instalarlos. Viene con Node.js, que es JavaScript fuera del navegador (lo verás a fondo más adelante; por ahora, es lo que hace funcionar estas herramientas en tu máquina).

Instalar un paquete es un comando:

shell
# Descarga el paquete date-fns y lo anota como dependencia del proyecto.
npm install date-fns

package.json: el manifiesto del proyecto#

Ese comando no solo descarga: anota el paquete en el package.json, el fichero que describe tu proyecto. Es lo primero que abre cualquiera que llegue al repositorio:

json
{
  "name": "team-builder",
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "date-fns": "^4.1.0"
  },
  "devDependencies": {
    "vite": "^7.0.0"
  }
}

Tres bloques que importan:

  • scripts: atajos que ejecutas con npm run <nombre>. npm run dev arranca el servidor; npm run build genera la versión de producción. No tienes que recordar comandos largos.
  • dependencies: lo que tu app necesita en producción (acaba en el código que se envía al usuario). date-fns es una.
  • devDependencies: herramientas que solo usas al desarrollar y no acaban en el producto final. Vite es una de ellas.

node_modules: dónde aterriza lo instalado#

npm install vuelca todo el código descargado en una carpeta node_modules/. Puede pesar cientos de megas y tener miles de ficheros. Dos cosas clave:

  • No se sube a Git. Va en el .gitignore. Es enorme y, sobre todo, reconstruible: cualquiera clona el repo, ejecuta npm install y npm recrea node_modules exacto a partir del package.json y un fichero de bloqueo (el lockfile, que fija las versiones precisas).
  • No la tocas a mano. Es territorio de npm.

El bundler: juntar y optimizar para el navegador#

La pieza que resuelve casi todos los muros de arriba es el bundler. Toma tu grafo de módulos (tu código + las dependencias que importas) y produce pocos ficheros optimizados listos para el navegador. Por el camino:

  • Resuelve los imports, incluidos los “pelados”: sabe que import ... from 'date-fns' está en node_modules.
  • Junta y minifica: menos ficheros y más pequeños, que cargan más rápido.
  • Compila lo que el navegador no entiende (TypeScript, JSX) a JavaScript normal.

El bundler que usarás es Vite. Generar la versión de producción es un comando:

shell
# Crea la carpeta dist/ con tu app optimizada, lista para subir a un hosting.
npm run build

dist/ también es generado: va al .gitignore, no se versiona.

El dev server: programar con recarga en caliente#

Vite no solo construye: trae un servidor de desarrollo. En vez de abrir el index.html, ejecutas npm run dev y te da una URL local (http://localhost:5173). Su gracia es la recarga en caliente: guardas un fichero y el navegador refleja el cambio al instante, sin que pulses F5 y, a menudo, sin perder el estado de la página. Se acabó el guardar-y-recargar.

shell
# Arranca el servidor de desarrollo. Lo dejas corriendo mientras programas.
npm run dev

El flujo completo, de un vistazo#

Andamiar un proyecto moderno desde cero son tres comandos:

shell
npm create vite@latest mi-proyecto   # andamia la estructura
cd mi-proyecto && npm install        # instala las dependencias
npm run dev                          # a programar, con recarga en caliente

De esto va el Nivel 4 entero: gestores de paquetes, el package.json a fondo (con el lenguaje de versiones, semver), Vite y los linters. Aquí solo necesitabas entender por qué existen. La respuesta corta: porque abrir un index.html no escala, y cada una de estas piezas quita un muro concreto de en medio.

Comprueba lo que sabes#

Pregunta 1 de 5

¿Qué es npm?

Tu turno#

Este ejercicio se hace en local: es el momento de salir del playground a un proyecto de verdad. La carpeta del ejercicio contiene el punto de partida: cinco ficheros (el HTML, el punto de entrada y los tres módulos de datos, formato y presentación) que funcionan abriendo el HTML directamente. Tu tarea es convertir esa mini-app en un proyecto Vite. Cuando lo tengas, despliega las soluciones y compara los comandos, el manifiesto y los cambios de código en cada tier.

Ejercicio · hazlo en local

Del HTML plano a un proyecto npm + Vite

En la carpeta del ejercicio tienes la mini-app de módulos que construiste en el capítulo anterior: cinco ficheros (index.html, index.js, datos.js, formato.js, render.js) que funcionan abriendo el HTML directamente. Tu tarea es convertirla en un proyecto profesional: andamiarlo con Vite, mover el código a src/, arrancarlo con el servidor de desarrollo y generar un build de producción. Los tiers más altos incorporan lo aprendido a lo largo del Nivel 3: el manejo del repositorio, la asincronía y la librería estándar.

Paso 1: El proyecto arranca

  • Tienes Node instalado y andamias el proyecto con npm create vite (plantilla vanilla).
  • npm install y npm run dev arrancan el servidor de desarrollo sin errores.
  • Los módulos del starter viven en src/ y la lista de héroes aparece en localhost:5173 con recarga automática al guardar.

Cómo hacerlo en local

Clona el repositorio del curso, entra en la carpeta del ejercicio y abre el index.html en tu navegador. Toda tu solución va en solucion.js.

git clone <repo>
cd exercises/nivel-3/del-html-plano-a-un-proyecto
# abre index.html en el navegador y edita solucion.js
Ver soluciones
# ════════════════════════════════════════════════════════════════════════════
# NIVEL OK — "que funcione": arrancar un proyecto de verdad con Vite
#
# Andamiar el proyecto, meter el código en src/ y verlo correr en el dev server.
# Esto sustituye a "abrir index.html a pelo".
# ════════════════════════════════════════════════════════════════════════════

# 1) Comprueba que tienes Node (incluye npm). Si no, instálalo desde nodejs.org.
node --version    # debe dar v20.x o superior
npm --version

# 2) Andamia un proyecto Vite "vanilla" (JS sin framework) y entra en él.
npm create vite@latest team-builder -- --template vanilla
cd team-builder

# 3) Instala las dependencias que Vite declara en el package.json generado.
npm install

# 4) Arranca el servidor de desarrollo. Abre la URL que imprime (localhost:5173).
npm run dev

# ────────────────────────────────────────────────────────────────────────────
# Qué hacer a continuación (en tu editor, mientras dev server corre):
#
#   a) Borra los ficheros de demo que genera Vite: src/counter.js, public/vite.svg, etc.
#   b) Copia tus módulos del starter (datos.js, formato.js, render.js) dentro de src/.
#   c) Renombra o reemplaza src/main.js con el contenido de tu index.js del starter.
#      (Solo importa datos y llama a renderHeroes, sin cambiar nada más.)
#   d) Guarda. El dev server recarga solo: la lista de héroes aparece en localhost:5173.
#
# Por qué esto ya es mejor que abrir index.html:
#   - El servidor resuelve los módulos sin errores de CORS.
#   - Recargas automáticas al guardar: no más F5.
#   - El proyecto tiene un punto de entrada declarado y reproducible.
# ────────────────────────────────────────────────────────────────────────────

Por qué este nivel

  • Andamias un proyecto Vite, instalas dependencias y arrancas el servidor de desarrollo.
  • Mueves tus módulos a src/ y los ves correr con recarga automática al guardar.
  • El salto de "abrir index.html a pelo" a "un proyecto que arranca con npm run dev".