CodeForge

JavaScript de Cero a Experto / Patrones y observables

Módulos ESM: import y export

Teoría20 min20 XP

Hasta ahora todo tu código ha vivido en un solo archivo. Las aplicaciones reales viven en DECENAS, y necesitan una regla de juego para compartirse cosas sin pisarse: los módulos ES (ESM) — el sistema de import y export que ya usan Node, los navegadores y todos los frameworks que aprenderás. Este módulo entero va de organizar piezas; esta lección pone el piso.

La bodega con ventanilla

Tu primer proyecto multi-archivo

Este playground tiene DOS archivos (mira las pestañas): la lógica de dinero vive en su módulo, y index.js la importa:

La gramática esencial: export delante de lo que prestas (constantes, funciones, clases — lo que sea), e import { etiquetas } from "./ruta" para pedirlo. Los nombres deben coincidir EXACTOS — son etiquetas, no posiciones. Y la función redondear demuestra el premio silencioso: es detalle interno, mañana la renombras o la eliminas y NINGÚN otro archivo puede haberse acoplado a ella. Encapsulación a nivel de archivo — la misma idea del # del módulo 11, un piso más arriba.

export default: la pieza principal

Además de la ventanilla con etiquetas, un módulo puede declarar UNA pieza estrella sin nombre fijo:

bolsillo.js
// UNA sola por módulo: la exportación por defecto
export default class Bolsillo {
// ...la clase del módulo 11
}

// quien importa la nombra como quiera (sin llaves):
// import Bolsillo from "./bolsillo.js";
// import LoQueSea from "./bolsillo.js";   ← también válido

¿Cuál usar? Regla de oficio: exports con nombre casi siempre — el autocompletado te ayuda, los nombres son consistentes en todo el proyecto y renombrar es seguro. El default es idiomático cuando el archivo ES una sola cosa (un componente de React, una clase principal) — lo verás así en los supercursos de frameworks. Y tres datos de contexto que te ahorrarán confusiones: los módulos son SIEMPRE estrictos (el modo laxo del módulo 11 no existe aquí), cada módulo se carga UNA sola vez por muchas veces que se importe (esto es ORO y es la próxima lección), y en el navegador se activan con <script type="module" src="app.js"> — en este curso el playground hace de empaquetador, como harán Vite y compañía en tus proyectos.

En dinero.js declaraste function redondear() sin export, y en index.js escribes import { redondear } from './dinero.js'. ¿Qué pasa?

Mini-reto

Reorganiza como arquitecto: parte el motor de reportes del módulo 12 en tres archivos — pipe.js (exporta pipe), estaciones.js (exporta filtrar, totalizar, enCOP; con alguna auxiliar PRIVADA sin export) e index.js que importa de ambos y arma un reporte. Agrega pestañas con el botón de archivo del playground o reutiliza los dos existentes. Remate: intenta importar la auxiliar privada y lee el error con calma — es de los mensajes que más verás en tu carrera.

Qué sigue

Dijimos algo enorme de pasada: un módulo se evalúa UNA sola vez, sin importar cuántos archivos lo importen — todos reciben LA MISMA copia. Esa propiedad convierte a cada módulo en un "único ejemplar" natural… que es exactamente el primer patrón de diseño del módulo: el singleton. Próxima lección.