export
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since May 2018.
Die export
-Deklaration wird verwendet, um Werte aus einem JavaScript-Modul zu exportieren. Exportierte Werte können dann mit der import
-Deklaration oder dem dynamischen Import in andere Programme importiert werden. Der Wert einer importierten Bindung kann sich im Modul, das ihn exportiert, ändern — wenn ein Modul den Wert einer von ihm exportierten Bindung aktualisiert, ist die Aktualisierung im importierten Wert sichtbar.
Um die export
-Deklaration in einer Quelldatei zu verwenden, muss die Datei vom Laufzeitsystem als ein Modul interpretiert werden. In HTML wird dies erreicht, indem dem <script>
-Tag type="module"
hinzugefügt wird oder indem es von einem anderen Modul importiert wird. Module werden automatisch im strict mode interpretiert.
Syntax
// Exporting declarations
export let name1, name2/*, … */; // also var
export const name1 = 1, name2 = 2/*, … */; // also var, let
export function functionName() { /* … */ }
export class ClassName { /* … */ }
export function* generatorFunctionName() { /* … */ }
export const { name1, name2: bar } = o;
export const [ name1, name2 ] = array;
// Export list
export { name1, /* …, */ nameN };
export { variable1 as name1, variable2 as name2, /* …, */ nameN };
export { variable1 as "string name" };
export { name1 as default /*, … */ };
// Default exports
export default expression;
export default function functionName() { /* … */ }
export default class ClassName { /* … */ }
export default function* generatorFunctionName() { /* … */ }
export default function () { /* … */ }
export default class { /* … */ }
export default function* () { /* … */ }
// Aggregating modules
export * from "module-name";
export * as name1 from "module-name";
export { name1, /* …, */ nameN } from "module-name";
export { import1 as name1, import2 as name2, /* …, */ nameN } from "module-name";
export { default, /* …, */ } from "module-name";
export { default as name1 } from "module-name";
Beschreibung
Jedes Modul kann zwei verschiedene Arten von Exporten haben, named export und default export. Sie können mehrere benannte Exporte pro Modul, aber nur einen Standard-Export haben. Jeder Typ entspricht einer der oben genannten Syntaxen.
Benannte Exporte:
// export features declared elsewhere
export { myFunction2, myVariable2 };
// export individual features (can export var, let,
// const, function, class)
export let myVariable = Math.sqrt(2);
export function myFunction() {
// …
}
Nach dem export
-Schlüsselwort können Sie let
, const
und var
-Deklarationen sowie Funktions- oder Klassen-Deklarationen verwenden. Sie können auch die export { name1, name2 }
-Syntax verwenden, um eine Liste von anderswo deklarierten Namen zu exportieren. Beachten Sie, dass export {}
kein leeres Objekt exportiert — es ist eine No-op-Deklaration, die nichts exportiert (eine leere Namensliste).
Export-Deklarationen unterliegen nicht den Regeln der temporal dead zone. Sie können deklarieren, dass das Modul X
exportiert, bevor der Name X
selbst deklariert wird.
export { x };
const x = 1;
// This works, because `export` is only a declaration, but doesn't
// utilize the value of `x`.
Standard-Exporte:
// export feature declared elsewhere as default
export { myFunction as default };
// This is equivalent to:
export default myFunction;
// export individual features as default
export default function () { /* … */ }
export default class { /* … */ }
Hinweis:
Namen für Export-Deklarationen müssen sich voneinander unterscheiden. Exporte mit doppelten Namen oder die Verwendung von mehr als einem default
-Export führen zu einem SyntaxError
und verhindern die Auswertung des Moduls.
Die export default
-Syntax erlaubt jeden Ausdruck.
export default 1 + 1;
Als Sonderfall werden Funktionen und Klassen als Deklarationen und nicht als Ausdrücke exportiert, und diese Deklarationen können anonym sein. Das bedeutet, dass Funktionen gehoben werden.
// Works because `foo` is a function declaration,
// not a function expression
foo();
export default function foo() {
console.log("Hi");
}
// It's still technically a declaration, but it's allowed
// to be anonymous
export default function () {
console.log("Hi");
}
Benannte Exporte sind nützlich, wenn Sie mehrere Werte exportieren müssen. Beim Import dieses Moduls müssen benannte Exporte mit demselben Namen (optional mit as
umbenannt) referenziert werden, aber der Standard-Export kann mit jedem Namen importiert werden. Zum Beispiel:
// file test.js
const k = 12;
export default k;
// some other file
import m from "./test"; // note that we have the freedom to use import m instead of import k, because k was default export
console.log(m); // 12
Sie können auch benannte Exporte umbenennen, um Namenskonflikte zu vermeiden:
export { myFunction as function1, myVariable as variable };
Sie können einen Namen in etwas umbenennen, das kein gültiger Bezeichner ist, indem Sie ein String-Literal verwenden. Zum Beispiel:
export { myFunction as "my-function" };
Re-exportieren / Aggregieren
Ein Modul kann auch Werte, die von anderen Modulen exportiert wurden, "weiterleiten", ohne den Aufwand, zwei separate Import- und Export-Deklarationen zu schreiben. Dies ist oft nützlich, wenn ein einziges Modul erstellt wird, das verschiedene Exporte aus verschiedenen Modulen bündelt (gewöhnlich als "Barrel-Modul" bezeichnet).
Dies kann mit der "export from"-Syntax erreicht werden:
export { default as function1, function2 } from "bar.js";
Was mit einer Kombination aus Import und Export vergleichbar ist, außer dass function1
und function2
nicht innerhalb des aktuellen Moduls verfügbar werden:
import { default as function1, function2 } from "bar.js";
export { function1, function2 };
Die meisten "import from"-Syntaxe haben "export from"-Gegenstücke.
export { x } from "mod";
export { x as v } from "mod";
export * as ns from "mod";
Es gibt auch export * from "mod"
, obwohl es kein import * from "mod"
gibt. Dies re-exportiert alle benannten Exporte von mod
als die benannten Exporte des aktuellen Moduls, aber der Standard-Export von mod
wird nicht re-exportiert. Wenn es zwei Wildcard-Export-Deklarationen gibt, die denselben Namen implizit re-exportieren, wird keiner davon re-exportiert.
// -- mod1.js --
export const a = 1;
// -- mod2.js --
export const a = 3;
// -- barrel.js --
export * from "./mod1.js";
export * from "./mod2.js";
// -- main.js --
import * as ns from "./barrel.js";
console.log(ns.a); // undefined
Der Versuch, den doppelten Namen direkt zu importieren, wird einen Fehler werfen.
import { a } from "./barrel.js";
// SyntaxError: The requested module './barrel.js' contains conflicting star exports for name 'a'
Das Folgende ist syntaktisch ungültig, trotz seines Import-Äquivalents:
export DefaultExport from "bar.js"; // Invalid
Der korrekte Weg, dies zu tun, ist der Export umzubenennen:
export { default as DefaultExport } from "bar.js";
Die "export from"-Syntax erlaubt es, das as
-Token wegzulassen, wodurch der Standard-Export immer noch als Standard-Export re-exportiert wird.
export { default, function2 } from "bar.js";
export from
unterstützt alle Funktionen, die import
unterstützt — zum Beispiel Import-Attribute:
export { default } from "./data.json" with { type: "json" };
Beispiele
Verwendung von benannten Exporten
In einem Modul my-module.js
könnten wir den folgenden Code einfügen:
// module "my-module.js"
function cube(x) {
return x * x * x;
}
const foo = Math.PI + Math.SQRT2;
const graph = {
options: {
color: "white",
thickness: "2px",
},
draw() {
console.log("From graph draw function");
},
};
export { cube, foo, graph };
Dann im Top-Level-Modul, das in Ihre HTML-Seite eingebunden wird, könnten wir haben:
import { cube, foo, graph } from "./my-module.js";
graph.options = {
color: "blue",
thickness: "3px",
};
graph.draw(); // Logs "From graph draw function"
console.log(cube(3)); // 27
console.log(foo); // 4.555806215962888
Es ist wichtig, Folgendes zu beachten:
Verwendung des Standard-Exports
Wenn wir einen einzelnen Wert exportieren möchten, der ein gesamtes Modul repräsentiert, könnten wir einen Standard-Export verwenden:
// module "cube.js"
export default function cube(x) {
return x * x * x;
}
Dann ist es in einem anderen Skript unkompliziert, den Standard-Export zu importieren:
import cube from "./cube.js";
console.log(cube(3)); // 27
Verwendung von export from
Nehmen wir ein Beispiel, bei dem wir folgende Hierarchie haben:
childModule1.js
: exportiertmyFunction
undmyVariable
childModule2.js
: exportiertMyClass
parentModule.js
: fungiert als Aggregator (und macht nichts anderes)- Top-Level-Modul: konsumiert die Exporte von
parentModule.js
So würde es mit Code-Snippets aussehen:
// In childModule1.js
function myFunction() {
console.log("Hello!");
}
const myVariable = 1;
export { myFunction, myVariable };
// In childModule2.js
class MyClass {
constructor(x) {
this.x = x;
}
}
export { MyClass };
// In parentModule.js
// Only aggregating the exports from childModule1 and childModule2
// to re-export them
export { myFunction, myVariable } from "childModule1.js";
export { MyClass } from "childModule2.js";
// In top-level module
// We can consume the exports from a single module since parentModule
// "collected"/"bundled" them in a single source
import { myFunction, myVariable, MyClass } from "parentModule.js";
Spezifikationen
Specification |
---|
ECMAScript® 2025 Language Specification # sec-exports |
Browser-Kompatibilität
Siehe auch
import
- JavaScript-Module Leitfaden
- ES6 in Depth: Modules auf hacks.mozilla.org (2015)
- ES modules: A cartoon deep-dive auf hacks.mozilla.org (2018)
- Exploring JS, Ch.16: Modules von Dr. Axel Rauschmayer