Hoy · Hoja de ruta
- 1. Aprende: Cómo se reparte el código en ficheros con
importyexport. - 2. Haz: Separa datos, lógica y programa principal en tres módulos.
- 3. Comprueba: Todo funciona servido por un servidor local, y sabes por qué hace falta.
Antes de empezar · 5 minutos, sin apuntes
- ¿Cuántas líneas tiene ya tu fichero principal?
- Si otro proyecto quisiera tus funciones de catálogo, ¿qué le pasarías?
- ¿Qué partes de tu código son «datos», cuáles «reglas» y cuáles «uso»?
Exportar e importar
// js/datos.js
export const catalogo = [ /* ... */ ];
export const IVA = 0.21;
// js/catalogo.js
import { catalogo, IVA } from "./datos.js";
export function disponibles(productos = catalogo) {
return productos.filter((p) => p.stock > 0);
}
export function valorAlmacen(productos = catalogo) {
return productos.reduce((suma, p) => suma + p.precio * p.stock, 0);
}
// js/main.js
import { disponibles, valorAlmacen } from "./catalogo.js";
console.table(disponibles());
console.log(valorAlmacen().toFixed(2));
En el documento se declara un único enlace, con su tipo:
<script type="module" src="js/main.js"></script>
Con type="module" no hace falta defer: los módulos ya se ejecutan al final. Solo se enlaza el principal: los demás llegan por sus import.
Dos detalles que hacen perder una tarde
La extensión se escribe, y hace falta un servidor
En el navegador, la ruta del import lleva su .js: "./catalogo.js", no "./catalogo". Además debe comenzar por ./ o por /.
Además, los módulos no funcionan abriendo el fichero con doble clic. Verás un error de CORS con el esquema file://. Hay que servir la carpeta: la extensión Live Server de VS Code, o el servidor que montarás tú mismo en la UD5.
Exportación por defecto
export default function formatearPrecio(valor) {
return `${valor.toFixed(2)} €`;
}
import formatearPrecio from "./formato.js";
Un módulo puede tener una exportación por defecto y muchas con nombre. En este módulo preferimos las nombradas: el nombre viaja con la función y no se puede renombrar sin querer.
Qué va en cada fichero
- datos.js · qué hay
- catalogo.js · qué se puede preguntar
- main.js · qué hacemos hoy con ello
Es el mismo criterio de siempre: cada fichero responde a una pregunta. El criterio anticipa la separación en capas que verás en la UD6 y en el módulo de servidor.
Tarea 13 · Tres módulos
- Separa tu código en
datos.js,catalogo.jsymain.js. - Exporta solo lo que se use fuera; el resto, privado del módulo.
- Añade
formato.jscon las funciones de presentación de texto. - Enlaza únicamente
main.jscontype="module". - Sirve la carpeta con un servidor local y comprueba que funciona.
- Provoca a propósito un import con la extensión olvidada y lee el error.
catalogo.js.Checkpoint · fin de la sesión 13
- Tu código está repartido en módulos con una responsabilidad cada uno.
- Solo enlazas el módulo principal, con
type="module". - Escribes la extensión en las rutas de importación.
- Sabes por qué los módulos necesitan un servidor.
Antes de cerrar · 2 minutos, sin mirar
- ¿Qué error verás si abres el fichero con doble clic?
- ¿Cuántos módulos enlazas en el documento?
- ¿Qué diferencia hay entre exportación nombrada y por defecto?
Ver respuestas
1 · Un error de CORS por el esquema file://: los módulos exigen que la página se sirva por HTTP.
2 · Uno: el principal. Los demás entran por sus importaciones.
3 · La nombrada se importa entre llaves y con su nombre exacto; la de defecto se importa con el nombre que quieras.