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 juzga default export como “terrible”. Otros sostienen que default debería ganar (por ejemplo, la guía de estilo de AirBnb).

A menudo culpan a cosas enteramente temporales: errores de auto-importación del IDE, capacidades de tree-shaking de un bundler en particular, o la mera posibilidad de errores tipográficos al nombrar una importación.

¿Acaso hemos perdido el punto de exportar en primer lugar?

El código es comunicación. ✨

Le estamos enviando una señal a los importers 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 ambos 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” comunes con los que la gente se encuentra.

// ¡Puedes usar alias con ambas!
import { Knife as Handle } from "./knife.js"; // 🔪
import { default as Handle } from "./knife.js"; // 🔪
import Handle from "./knife.js"; // 🔪

Resumen

En realidad hay muchas combinaciones de formas en que podríamos exportar cosas, cada una cuenta una historia diferente:

Default (Exports)Named (Exports)Private FnsPatrónSignificado
Una exportación por defecto.”¡Presentando UNA función con un solo 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. Además, espera comportamiento tipo clase.”
Múltiples exportaciones nombradas, nombre de archivo genérico.”Un conjunto de cosas vagamente relacionadas, sin jerarquía implícita.”
Una única exportación nombrada TAMBIÉN exportada como default.”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 exporta como si en verdad te importara. 💞