Command Palette

Search for a command to run...

Named Exports vs Default Export en JavaScript

Entiende las diferencias entre exportaciones con nombre y exportación por defecto. Aprende cuándo usar cada una, sus ventajas, desventajas y mejores prácticas para escribir código modular consistente.

Lectura: 12 min
Nivel: Principiante

TL;DR - Resumen rápido

  • Named exports permiten exportar múltiples elementos con nombres específicos desde un módulo
  • Default export permite exportar un solo valor principal por módulo sin nombre específico
  • Named exports son más explícitos y facilitan refactoring, autocompletado y tree shaking
  • Default export es conveniente para módulos que exportan una sola funcionalidad principal
  • Puedes combinar ambos tipos en el mismo módulo, pero mantén la consistencia en tu proyecto

Introducción

En ES Modules, tienes dos formas principales de exportar funcionalidad desde un módulo: named exports (exportaciones con nombre) y default export (exportación por defecto). Aunque ambas permiten compartir código entre módulos, tienen diferencias importantes en sintaxis, comportamiento y casos de uso.

Elegir entre named exports y default export no es solo una preferencia de sintaxis: tiene implicaciones importantes en la mantenibilidad del código, la experiencia de desarrollo, y la capacidad de las herramientas de bundling para optimizar tu aplicación. Entender estas diferencias te ayudará a tomar decisiones informadas sobre cómo estructurar tus módulos.

No es una decisión binaria

No tienes que elegir exclusivamente entre named exports o default export. Puedes usar ambos en el mismo módulo, e incluso combinarlos. Sin embargo, muchos equipos establecen una convención consistente (solo named exports, o default para el export principal + named para utilidades) para mantener el código predecible.

Named Exports (Exportaciones con nombre)

Los named exports permiten exportar múltiples valores desde un módulo, cada uno con un nombre específico. Al importar, debes usar exactamente el mismo nombre que se exportó, entre llaves. Puedes tener tantos named exports como necesites en un solo módulo.

Ventajas de named exports

Los named exports ofrecen varias ventajas que los hacen la opción preferida para muchos desarrolladores y equipos. La principal ventaja es la consistencia: el nombre debe coincidir exactamente entre la exportación y la importación, lo que reduce errores y mejora la claridad del código.

  • <strong>Nombres consistentes:</strong> El mismo nombre se usa en todo el código, facilitando búsquedas y refactorings
  • <strong>Autocompletado mejorado:</strong> Los IDEs pueden sugerir exactamente qué exportaciones están disponibles
  • <strong>Tree shaking efectivo:</strong> Los bundlers pueden eliminar exports no usados más fácilmente
  • <strong>Múltiples exports:</strong> Puedes exportar tantos elementos como necesites del mismo módulo
  • <strong>Refactoring seguro:</strong> Renombrar una exportación actualiza todas las importaciones con herramientas de refactoring

Named exports y mantenibilidad

Los named exports hacen que el código sea más mantenible a largo plazo. Si renombras una función en el módulo exportador, tu IDE puede actualizar automáticamente todas las importaciones. Con default exports, esto es mucho más difícil porque cada archivo puede haber importado con un nombre diferente.

Sintaxis de named exports

Hay varias formas de escribir named exports. Puedes exportar directamente en la declaración, o declarar primero y exportar después en una lista. Ambas formas son equivalentes, pero la lista al final es útil cuando quieres controlar explícitamente qué se exporta.

named-exports-sintaxis.js
Loading code...

Al importar named exports, usas llaves con los nombres exactos. Puedes importar solo lo que necesitas, renombrar con as si hay conflictos de nombres, o importar todo como un namespace. La flexibilidad de named exports hace que sea fácil compartir funcionalidad específica sin exponer todo el módulo.

named-imports-ejemplos.js
Loading code...

Esta sintaxis es muy explícita: cuando lees el código, ves exactamente qué funciones vienen de qué módulo. No hay ambigüedad sobre dónde se define cada función, lo que hace que el código sea más fácil de entender y mantener.

Default Export (Exportación por defecto)

Un default export permite exportar un valor "principal" desde un módulo sin especificar un nombre. Cada módulo puede tener solo un default export. Al importar, no usas llaves y puedes elegir cualquier nombre que quieras para la importación.

Ventajas de default exports

Los default exports tienen su lugar cuando un módulo tiene una funcionalidad principal clara y dominante. Son especialmente útiles para módulos que exportan una sola clase, componente, o función principal, aunque pueden acompañarse de named exports para utilidades relacionadas.

default-export-ejemplo.js
Loading code...

La principal ventaja de default export es la conveniencia: la sintaxis de import es más corta (no necesitas llaves) y puedes elegir el nombre que tenga más sentido en el contexto donde lo importas. Esto puede ser útil cuando el mismo módulo se usa en diferentes contextos con diferentes semánticas. React popularizó el uso de default exports para componentes, donde cada archivo exporta un componente principal como default, haciendo las importaciones concisas (import Button from './Button'). Sin embargo, muchos equipos modernos están migrando a named exports para mejorar la consistencia y el refactoring.

Sintaxis de default exports

Puedes exportar por defecto funciones, clases, objetos, o valores primitivos. La sintaxis permite exportar directamente en la declaración o usar export default al final del archivo. También puedes combinar default export con named exports en el mismo módulo.

default-export-sintaxis.js
Loading code...

Al importar un default export, no usas llaves y puedes elegir cualquier nombre. Esta flexibilidad es conveniente, pero puede causar problemas: diferentes archivos pueden importar el mismo módulo con nombres diferentes, haciendo difícil encontrar todas las referencias con búsquedas de texto.

default-import-ejemplos.js
Loading code...

Este ejemplo ilustra el problema potencial de default exports: tres archivos diferentes importan el mismo módulo con tres nombres diferentes. Esto dificulta encontrar todas las referencias, hace que el refactoring automático sea imposible, y puede confundir a nuevos desarrolladores que trabajan en el código.

Comparación directa

Para entender mejor las diferencias, veamos el mismo módulo implementado con ambos enfoques. Esto te ayudará a visualizar cómo cada estilo afecta tanto el módulo exportador como los módulos que lo importan.

comparacion-estilos.js
Loading code...

La diferencia clave es la flexibilidad vs consistencia. Con default exports tienes más libertad al importar (puedes elegir el nombre), pero pierdes la seguridad de nombres consistentes. Con named exports, el nombre está definido por el exportador, garantizando consistencia en toda la aplicación.

Tree shaking y default exports

Los default exports pueden dificultar el tree shaking en algunos casos. Si importas un default export que es un objeto grande con muchas propiedades, el bundler no puede determinar fácilmente qué propiedades usas y cuáles no. Con named exports, solo importas exactamente lo que necesitas, facilitando la eliminación de código no usado.

Cuándo usar cada uno

La decisión entre named exports y default export depende del tipo de módulo, el contexto del proyecto, y las convenciones del equipo. Aquí hay guías prácticas para ayudarte a decidir cuándo usar cada uno.

  • <strong>Usa named exports cuando:</strong> El módulo exporta múltiples funciones relacionadas o utilidades
  • <strong>Usa named exports cuando:</strong> Quieres consistencia de nombres en toda la aplicación
  • <strong>Usa named exports cuando:</strong> El módulo puede crecer con más exports en el futuro
  • <strong>Usa default export cuando:</strong> El módulo tiene una funcionalidad principal clara y única
  • <strong>Usa default export cuando:</strong> Exportas una clase o componente que representa el propósito principal del módulo
  • <strong>Combina ambos cuando:</strong> Tienes un export principal y algunas utilidades o constantes relacionadas
cuando-usar-cada-uno.js
Loading code...

Este ejemplo muestra casos de uso apropiados para cada estilo. Las utilidades matemáticas son perfectas para named exports porque son funciones relacionadas de igual importancia. El componente Button es adecuado para default export porque es la funcionalidad principal del módulo. El módulo de configuración combina ambos efectivamente.

Consistencia del equipo

Más importante que elegir "el mejor" estilo es mantener consistencia en tu proyecto. Muchos equipos eligen usar solo named exports para todo, lo cual es completamente válido y facilita el mantenimiento. Establece una convención con tu equipo y documéntala en tu guía de estilo.

Problemas comunes con default exports

Aunque default exports son convenientes, pueden causar varios problemas en proyectos grandes o cuando trabajas en equipo. Es importante conocer estos problemas para evitarlos o mitigarlos con convenciones claras.

problemas-default-exports.js
Loading code...

Los problemas principales son: inconsistencia de nombres entre archivos, dificultad para hacer búsquedas en el código, imposibilidad de usar refactoring automático de forma confiable, y confusión sobre qué módulo estás realmente importando. Estos problemas se magnifican en proyectos grandes con muchos desarrolladores.

Refactoring y default exports

El mayor problema de default exports es el refactoring. Si cambias el nombre de una clase en el archivo exportador, tu IDE no puede actualizar automáticamente las importaciones porque cada archivo puede haberla importado con un nombre diferente. Con named exports, el IDE puede actualizar todas las referencias de forma segura.

Resumen: Named vs Default Exports

Conceptos principales:

  • Named exports usan nombres específicos que deben coincidir al importar
  • Default export permite un export principal sin nombre específico por módulo
  • Named exports facilitan refactoring, búsquedas y tree shaking
  • Default export ofrece conveniencia pero puede causar inconsistencias
  • Puedes combinar ambos estilos en el mismo módulo si es necesario
  • La consistencia en el proyecto es más importante que elegir el 'mejor' estilo

Mejores prácticas:

  • Prefiere named exports para mayor consistencia y mantenibilidad
  • Usa default export solo para la funcionalidad principal clara de un módulo
  • Establece una convención de equipo y documéntala en tu guía de estilo
  • Si usas default exports, mantén nombres consistentes entre archivos
  • Considera usar solo named exports si tu equipo es grande o el proyecto es complejo
  • Combina default + named solo cuando el export principal es obvio y dominante