DanLevy.net

Exports ESM : nommés ou par défaut ?

Nommer, ou ne pas nommer ?

Hero image for Exports ESM : nommés ou par défaut ?

Faut-il utiliser des exports nommés ou par défaut en JavaScript ?

Les articles au ton catégorique sur ce sujet ne manquent pas.

La majorité juge l’export default comme « terrible ». D’autres soutiennent que le default devrait l’emporter (par exemple, le guide de style Airbnb).

On y reproche souvent des choses entièrement temporaires : des bugs d’auto-import dans les IDE, les capacités de tree-shaking d’un bundler particulier, ou la simple possibilité de faire une faute de frappe en nommant un import.

A-t-on manqué l’objectif premier des export ?

Le code, c’est de la communication. ✨

On envoie un signal aux importers sur comment utiliser une chose.

Alors, que dit-on ?

En gros, il y a 2 façons d’exporter des choses en JavaScript moderne :

Bien sûr, on peut combiner les deux, ou utiliser des approches différentes pour différentes parties du codebase. Voir plus d’exemples à la fin de l’article.

Arguments faibles, mon ami

Examinons certains des « problèmes temporaires » que les gens invoquent souvent.

// Vous pouvez utiliser des alias dans les deux cas !
import { Knife as Handle } from "./knife.js"; // 🔪
import { default as Handle } from "./knife.js"; // 🔪
import Handle from "./knife.js"; // 🔪

Résumé

Il existe en réalité de nombreuses combinaisons de façons d’exporter des choses, chacune raconte une histoire différente :

Default (Exports)Named (Exports)Private FnsPatternSignification
Un seul export par défaut.« Voici UNE fonction avec un objectif unique ! »
Un seul export nommé.« Merci de ne pas me renommer. »
Export par défaut + plusieurs fonctions ‘privées’ non exportées« Voici de la logique connexe. Attendez-vous à un comportement de type classe. »
Plusieurs exports nommés, nom de fichier générique.« Un fourre-tout de choses vaguement liées, sans hiérarchie implicite. »
Un seul export nommé ÉGALEMENT exporté par défaut.« Impossible de se tromper en m’important. »

Réflexion : Que dit-on quand le nom du fichier correspond ou non à l’un de ses exports ? (Par exemple, un utils.js avec de nombreuses fonctions.)

Conclusion

Si le code, c’est de la communication, veuillez exporter comme si vous y teniez putain. 💞