Módulos (import/export)
Un módulo es simplemente un archivo que expone funciones, clases, objetos o constantes para que otros archivos puedan usarlos mediante import. Esto permite organizar el código de forma lógica, evitar variables globales y reutilizar componentes.
JavaScript moderno (ES6+) y TypeScript promueven el uso de módulos como unidad de organización y encapsulamiento.
Tipos de exportación
Exportación nombrada (export)
export const PI = 3.14;
export function sum(a: number, b: number) {
return a + b;
}
import { PI, sum } from './math';
console.log(PI); // 3.14
console.log(sum(1, 2)); // 3
Exportación por defecto (export default)
export default function log(message: string) {
console.log(`[LOG]: ${message}`);
}
import log from './logger';
log('Hola mundo');
Solo puede haber una exportación por defecto por archivo
Combinación de exportaciones
export default class UserService { /* ... */ }
export const MAX_USERS = 100;
import UserService, { MAX_USERS } from './UserService';
Estructura recomendada de carpetas
src/
├── domain/
│ └── entities/
│ └── User.ts ← exporta clase User
├── application/
│ └── usecases/
│ └── CreateUser.ts ← importa User y exporta lógica
├── interfaces/
│ └── controllers/
│ └── UserController.ts
└── main.ts ← punto de entrada
Tipos de importaciones
Relativa
Las importaciones relativas funcionan, pero pueden llegar a tornarse ilegibles.
import { User } from '../../../../domain/entities/User';
Absoluta
Las importaciones absolutas son más útiles, pero requieren conocimiento del path del archivo y se deben configurar en tsconfig.json
import { User } from 'domain/entities/User';
{
"compilerOptions": {
"baseUrl": "./src",
"paths": {
"*": ["*"]
}
}
}
En caso de que estés usando Vite, debes añadir una configuración adicional:
-
Instala el paquete
vite-tsconfig-paths -
Crear o ve el archivo
vite.config.tsy valida estas líneas:import { defineConfig } from 'vite';
import tsconfigPaths from 'vite-tsconfig-paths';
export default defineConfig( {
plugins: [ tsconfigPaths() ]
} );
Esto es necesario, porque Vite no usa directamente tsconfig.json para resolver rutas de imports, sino que necesita que definas alias explícitamente en vite.config.ts.
Casos reales
- Librerías como Lodash o Axios exportan múltiples funciones (nombradas).
- Frameworks como React exportan una mezcla de
defaultynamed. - Proyectos Clean Architecture organizan módulos por capa (
domain,application, etc.). - Paquetes npm: cada archivo
.tso.jsexporta funcionalidades específicas reutilizables.
Buenas prácticas recomendadas
| Principio | Aplicación |
|---|---|
| Clean Code | Código separado por responsabilidad, legible, sin redundancias. |
| SRP (SOLID) | Cada archivo contiene solo una clase o función principal. |
| OCP (SOLID) | Permite añadir nuevos módulos sin modificar los existentes. |
| DIP (SOLID) | Se pueden importar abstracciones (interfaces) sin acoplarse a implementaciones. |
Referencias
- Flanagan, D. (2020). JavaScript: The Definitive Guide (7th ed.). O’Reilly Media.
- Mozilla Developer Network. (s.f.). Modules.
- TypeScript Handbook
- JavaScript Style Guide.
- NestJS Docs