DanLevy.net

Exportaciones ESM: ¿nombradas o por defecto?

¿Nombrar o no nombrar?

Hero image for Exportaciones ESM: ¿nombradas o por defecto?

¿Deberías usar exportaciones named o default en JavaScript?

No faltan artículos con opiniones tajantes sobre este tema.

La mayoría tacha default export de “terrible”. Otros sostienen que default debería ganar (por ejemplo, la guía de estilo de AirBnb).

Suelen echarle la culpa a factores puramente temporales: errores de importación automática del IDE, capacidades de tree-shaking de un bundler en particular, o la mera posibilidad de errores tipográficos al nombrar una importación.

¿No estaremos perdiendo de vista para qué sirve export?

El código es comunicación. ✨

Le estamos enviando una señal a quien hace import sobre cómo usar algo.

Entonces, ¿qué estamos diciendo?

En términos generales, hay 2 formas de exportar cosas en JavaScript moderno:

Por supuesto, puedes combinar ambas formas o usar diferentes enfoques para distintas partes de tu base de código. Ver más ejemplos al final del artículo.

Argumentos débiles, amigo

Abordemos algunos de los “problemas temporales” más comunes.

// You can alias using both!
import { Knife as Handle } from "./knife.js"; // 🔪
import { default as Handle } from "./knife.js"; // 🔪
import Handle from "./knife.js"; // 🔪

Resumen

En realidad, hay muchas formas de combinar exportaciones; cada una cuenta una historia distinta:

Exportaciones por defectoExportaciones nombradasFunciones privadasPatrónSignificado
✅❌❌Una exportación por defecto.”¡Les presento UNA función con un único propósito!”
❌✅❌Una exportación nombrada.”Por favor, no me renombres.”
✅✅✅Exportación por defecto + múltiples funciones ‘privadas’ no exportadas”Aquí hay algo de lógica relacionada. Y es de esperar que se comporte más o menos como una clase.”
❌❌✅Múltiples exportaciones nombradas, nombre de archivo genérico.”Un batiburrillo de cosas vagamente relacionadas, sin jerarquía implícita.”
✅✅❌Una única exportación nombrada TAMBIÉN exportada por defecto.”No puedes equivocarte al importarme.”

Algo en lo que pensar: ¿Qué estamos diciendo cuando el nombre del archivo coincide o no con una de sus exportaciones? (Por ejemplo, un utils.js con muchas funciones.)

Conclusión

Si el código es comunicación, por favor, que cada export diga lo que de verdad quieres decir, carajo. 💞