Saltar al contenido principal

Módulos e Importaciones

Cada lenguaje tiene su propia forma de organizar el código en módulos e importar funcionalidad. Así es como los diferentes lenguajes manejan la organización del código.

Importando Módulos​

// ES Modules (modern)
import { readFile } from 'fs';
import express from 'express';
import * as path from 'path';
import { useState as useS } from 'react'; // alias

// Default import
import MyComponent from './MyComponent';

// Dynamic import
const module = await import('./module.js');

// CommonJS (Node.js legacy)
const fs = require('fs');
const { join } = require('path');

Exportando / Creando Módulos​

// ES Module exports
// Named exports
export function greet(name) { return "Hello " + name; }
export const PI = 3.14;
export class User { }

// Default export
export default class App { }

// Re-export
export { greet } from './utils.js';
export * from './helpers.js';

// CommonJS exports
module.exports = { greet, PI };
module.exports.greet = greet;

// package.json
// { "type": "module" } // Enable ES modules

Puntos Clave​

  • Los sistemas de módulos van de simples a estrictos -- C usa #include (inclusión textual de cabeceras), JavaScript y Python permiten una sintaxis flexible de import/from, mientras que Java 9+ (module-info.java) y Rust (Cargo.toml + declaraciones mod) requieren manifiestos de módulos explícitos. El enfoque más estricto previene el acoplamiento accidental y hace que las dependencias sean rastreables en tiempo de compilación. Elige C/JavaScript/Python si quieres iteración rápida y mínima ceremonia; elige Java/Rust si necesitas encapsulación fuerte y compilaciones reproducibles.

  • La visibilidad se controla de manera diferente -- Go usa convención de nombres: type User es exportado, type user no lo es. Rust y Swift usan palabras clave: pub fn vs fn, public class vs internal class. Java y C# ofrecen control detallado con public, private, protected y ámbitos package/internal. El enfoque de nombres (Go) mantiene el código mínimo pero puede sorprender a los novatos; los modificadores explícitos (Java, C#) hacen clara la intención. Prefiere modificadores explícitos al construir bibliotecas grandes; la convención de Go funciona bien para bases de código más pequeñas y cohesivas.

  • El mapeo archivo-módulo difiere -- Python mapea paquetes a directorios mediante __init__.py (p. ej., mypackage/models.py → from mypackage.models import User). Rust mapea mod models a models.rs o models/mod.rs. Go vincula paquetes a directorios: package models en models/user.go. C y C++ no tienen mapeo integrado—incluyes manualmente #include "path/to/header.h". Directorio-como-módulo (Python, Go) reduce el boilerplate; mod explícito (Rust) da más control sobre lo que se expone. Para proyectos nuevos, prefiere el mapeo basado en directorios; para bases de código C/C++ existentes, las rutas de cabeceras son la norma.

  • Las importaciones condicionales y dinámicas varían -- JavaScript soporta import('./module.js') dinámico para división de código y carga perezosa. Python usa try: import ujson except ImportError: import json para dependencias opcionales. Swift usa #if canImport(UIKit) para código específico de plataforma (iOS vs macOS). Estos patrones importan cuando apuntas a múltiples plataformas o cuando las dependencias son opcionales. Usa importaciones dinámicas cuando los bundles deban permanecer pequeños; usa importaciones condicionales cuando necesites implementaciones específicas por plataforma.

  • Las re-exportaciones permiten APIs más limpias -- pub use crate::models::User de Rust re-exporta desde un submódulo. export { greet } from './utils.js' y export * from './helpers.js' de JavaScript permiten agregar exportaciones. __all__ = ['User', 'helper'] de Python controla lo que from package import * expone. Las re-exportaciones te permiten reestructurar los internos sin romper a los consumidores. Úsalas cuando construyas una superficie de API pública—p. ej., una biblioteca que expone algunos tipos clave desde módulos anidados—para que los consumidores importen desde un solo lugar en vez de rutas profundas.