SyntaxError: import declarations may only appear at top level of a module
Der JavaScript-Fehler "import declarations may only appear at top level of a module" tritt auf, wenn eine import
-Deklaration nicht auf der obersten Ebene eines Moduls steht. Dies kann passieren, weil die import
-Deklaration innerhalb anderer Konstrukte verschachtelt ist (z.B. in Funktionen oder Blöcken), oder häufiger, weil die aktuelle Datei nicht als Modul behandelt wird.
Nachricht
SyntaxError: Cannot use import statement outside a module (V8-based) SyntaxError: import declarations may only appear at top level of a module (Firefox) SyntaxError: Unexpected identifier 'x'. import call expects one or two arguments. (Safari)
Fehlertyp
Was ist schiefgelaufen?
Möglicherweise haben Sie eine import
-Deklaration, die in einem anderen Konstrukt, wie z.B. einer Funktion oder einem Block, verschachtelt ist. Die import
-Deklaration muss auf der obersten Ebene des Moduls stehen. Wenn Sie ein Modul bedingt importieren möchten oder es bei Bedarf lazy importieren wollen, sollten Sie stattdessen das dynamische Importieren verwenden.
Wenn sich die import
-Deklaration bereits auf der obersten Ebene des Codes befindet, könnte es daran liegen, dass die Datei nicht als Modul interpretiert wird. Laufzeitumgebungen erfordern externe Hinweise, um zu bestimmen, ob eine Datei ein Modul ist oder nicht, und hier sind einige Möglichkeiten, solche Hinweise zu geben:
- Wenn die Datei direkt aus HTML geladen wird, stellen Sie sicher, dass das
<script>
-Tag das Attributtype="module"
hat. - Wenn die Datei in Node ausgeführt wird, stellen Sie sicher, dass entweder die Datei die
.mjs
-Erweiterung hat oder die nächstgelegenepackage.json
-Datei das Feld"type": "module"
enthält. - Wenn die Datei als Worker ausgeführt wird, stellen Sie sicher, dass der
Worker()
-Konstruktor mit der Optiontype: "module"
aufgerufen wird. - Importieren Sie diese Datei aus einem anderen Modul.
Ein weiterer Grund kann sein, dass Sie import
mit einem Compiler (wie TypeScript) schreiben und versehentlich die Quelldatei ausgeführt haben. Da import
-Deklarationen normalerweise am Anfang des Programms stehen, sind sie das Erste, was der Parser sieht und worüber er sich beschwert. Stellen Sie sicher, die Quelldatei zu kompilieren und die kompilierte Datei auszuführen.
Beispiele
Bedingte Importe
Sie können import
nicht innerhalb anderer Konstrukte verwenden, wie man es möglicherweise in Python tun würde.
if (writeOutput) {
import fs from "fs"; // SyntaxError
}
Entweder verschieben Sie das import
auf die oberste Ebene oder verwenden Sie dynamisches Importieren.
if (writeOutput) {
import("fs").then((fs) => {
// use fs
});
}
Import in einem Nicht-Modul-Skript
Wenn Sie das Skript aus HTML laden, fügen Sie dem <script>
-Tag das type="module"
Attribut hinzu.
<script type="module" src="main.js"></script>
Wenn Sie aus irgendeinem Grund das Skript nicht in ein Modul migrieren können, können Sie dynamisches Importieren verwenden.
async function main() {
const myModule = await import("./my-module.js");
// use myModule
}
main();