Best Practice React Funktion exportieren?

1 Antwort

Man kann sich für eine Unterscheidung am Zweck orientieren.

Wenn du mehrere Elemente eines Moduls exportieren möchtest, verwende benannte Exports (ohne default). Wenn nur ein Element exportiert werden soll, kannst du es mit default kennzeichnen (unbenannter Export). Oft macht man das für Elemente, die für das Modul besonders im Fokus stehen (Beispiel: die Komponente, die im Modul beschrieben wird).

Gegenüber benannten Exports haben unbenannte Exports definitiv ein paar Nachteile:

1) Durch Inkonsistenzen können sie für eine schlechtere Codelesbarkeit/-verwaltung sorgen. In Datei A könntest du eine Funktion ja unter dem Namen XY importieren und in Datei B wiederum unter dem Namen YZ. Wenn man nicht wenigstens eine Konvention einhält, stiftet das Verwirrung.

2) Jedes Modul kann nur einen unbenannten Export haben. Sollte dein Modul weitere öffentliche Schnittstellen erhalten, die als gleichwertig zur bereits bestehenden Schnittstellenfunktion betrachtet werden sollen, hättest du eine Inkonsistenz, die Refactoring erfordert.

3) Beim Bundling kann kein tree shaking verwendet werden. Damit ist ein Verfahren gemeint, beim Bundling unnötigen Code aufzuspüren und zu entfernen.

Bezüglich der Schreibweise:

export function doSomething() {
}

export function doSomethingElse() {
}

oder:

function doSomething() {
}

function doSomethingElse() {
}

export { doSomething, doSomethingElse };

gibt es keinen sonderlichen Unterschied. Das kannst du so halten, wie du es am übersichtlichsten findest.

kann ich guten gewissens alles mit arrow funktions machen (...)

Sofern du berücksichtigst, dass es zwischen normalen Funktionen und Arrow-Funktionen wesentliche Unterschiede im Verhalten gibt, ja.

  • Normale Funktionen können verwendet werden, um neue Prototypen zu definieren, von denen sich Ableger instanzieren lassen (die sich dasselbe Prototypobjekt teilen). Mit this beziehen sie sich auf ihren eigenen Kontext, via arguments können alle übergebenen Argumente angefordert werden.
  • Arrow-Funktionen beziehen sich bei Schlüsselwörtern wie arguments oder this nicht auf einen inneren Ausführungskontext, sondern auf den, in dem sie aufgerufen werden.
  • Um eine Referenz auf die Funktion zu erhalten, reicht bei Funktionen der Name. Bei Arrow-Funktionen brauchst du eine Variable.
  • Hoisting wirkt bei Funktionsdeklarationen, aber nicht bei Funktionsausdrücken:
doSomething(); // "Hello"
doSomethingElse(); // error

function doSomething() {
  console.log("Hello");
}

const doSomethingElse = () => console.log("Hello");