SyntaxError: Import-Anweisung kann nicht außerhalb eines Moduls verwendet werden
Lesezeit: 7 Minuten
Benutzer3810626
Ich habe eine ApolloServer Projekt, das mir Probleme bereitet, also dachte ich, ich könnte es aktualisieren und stieß auf Probleme, als ich das neueste Babel verwendete. Meine “index.js” ist:
require('dotenv').config()
import {startServer} from './server'
startServer()
Und wenn ich es ausführe, bekomme ich den Fehler
SyntaxError: Cannot use import statement outside a module
Zuerst habe ich versucht, TPTB* davon zu überzeugen, dass dies ein Modul ist (ohne Erfolg). Also habe ich das “importieren” zu einem “benötigen„Und das hat funktioniert.
Aber jetzt habe ich ungefähr zwei Dutzend “Importe” in anderen Dateien, die mir den gleichen Fehler geben.
* Ich bin mir sicher, dass die Wurzel meines Problems darin besteht, dass ich nicht einmal sicher bin, was mich über das Problem beschwert. Ich habe irgendwie angenommen, dass es Babel 7 war (da ich von Babel 6 komme und die Voreinstellungen ändern musste), aber ich bin mir nicht 100% sicher.
Das meiste, was ich für Lösungen gefunden habe, scheint nicht für Straight Node zu gelten. So wie dieser hier:
Import des ES6-Moduls mit “Uncaught SyntaxError: Unexpected identifier”
Sagt, es wurde durch Hinzufügen von “type=module” gelöst, aber dies würde normalerweise in den HTML-Code gehen, von dem ich keinen habe. Ich habe auch versucht, die alten Voreinstellungen meines Projekts zu verwenden:
"presets": ["es2015", "stage-2"],
"plugins": []
Aber das bringt mir einen weiteren Fehler: “Fehler: Plugin-/Preset-Dateien dürfen keine Objekte exportieren, nur Funktionen.”
Hier sind die Abhängigkeiten, mit denen ich angefangen habe:
Hallo, habe gerade das gleiche Problem. Könnten Sie auch Ihre Abhängigkeiten teilen? Vielleicht sogar ein Unterschied vor und nach Ihrem Update. Ich könnte mit meinem vergleichen, ob wir ähnliche Pakete finden können, die die Probleme verursachen könnten.
– Luchs
16. Oktober 2019 um 11:33 Uhr
Ich habe gerade alle “Importe” durch “erfordert” ersetzt und jetzt ist alles in Ordnung. Dumm, aber es war die Mühe nicht wert, es jetzt herauszufinden. Ich werde das Original jedoch mit Abhängigkeiten aktualisieren. Wenn Sie Hinweise erhalten, werde ich sie mit meinem ursprünglichen Code vergleichen.
– Benutzer3810626
16. Oktober 2019 um 20:20 Uhr
Die CommonJS-Syntax (require and module.exports) war das ursprüngliche Format für Node und Webpack und unterstützt es ebenfalls, aber die ES6-Modulsyntax (Export, Import) ist der neuere Weg und wird jetzt von Node und Webpack unterstützt. Ich habe gelesen, dass Knoten jetzt den Import unterstützen, aber so viele Tutorials zeigen, dass es für reine Knotensachen erforderlich ist, dass es wahrscheinlich besser ist, diese Syntax für Knoten zu verwenden.
– Ted Fitzpatrick
16. Oktober 2019 um 20:29 Uhr
Letztendlich schien mir der Weg zum Ziel dieser zu sein: github.com/vuejs/vue-jest/issues/134#issuecomment-461755061 Einstellen der Voreinstellung in jest.config.js zu 'ts-jest/presets/js-with-ts' – habe noch einige andere Probleme, aber dies hat das große Problem gelöst. ….. äh ja, mein Problem war testbezogen … die normalen Builds waren in Ordnung
– Luchs
16. Oktober 2019 um 20:53 Uhr
"type":"module" löst mein Problem nicht, und es gibt über hundert davon imports. Syntax von require unterscheidet sich von imports, kein einfacher Ersatz. Können Sie ein Beispiel geben, wie imports wird ersetzt durch requires?
– Jeb50
29. August 2020 um 22:13 Uhr
jabachetta
Stellen Sie sicher, dass Sie die neueste Version von Node.js installiert haben (oder mindestens 13.2.0+). Führen Sie dann einen der folgenden Schritte aus, z in der Dokumentation beschrieben:
Option 1
Im nächsten Elternteil package.json Datei, fügen Sie die oberste Ebene hinzu "type" Feld mit einem Wert von "module". Dadurch wird sichergestellt, dass alle .js und .mjs Dateien werden als ES-Module interpretiert. Sie können einzelne Dateien als interpretieren CommonJS durch die Verwendung der .cjs Verlängerung.
// package.json
{
"type": "module"
}
Option 2
Benennen Sie Dateien explizit mit der .mjs Verlängerung. Alle anderen Dateien, wie z .js wird als CommonJS interpretiert, was die Standardeinstellung ist, wenn type ist nicht definiert in package.json.
Wenn ich dies verwende, ändere den Pfad so, dass er das „js“ für die erforderliche Datei enthält, ändere dann das Format der export-Anweisungen in der erforderlichen Datei und nehme dann alle „require“-Anweisungen, die ich von „import“ geändert habe – weil jetzt ist “require” unbekannt – das wird funktionieren, also werde ich diese Antwort akzeptieren.
– Benutzer3810626
10. April 2020 um 22:32 Uhr
Dies ist nicht wirklich eine Option, wenn das Problem unter node_modules/ richtig ist? Irgendwelche Ideen, wie man in diesem Fall beheben kann?
Die @Cocuba-Antwort ist genau richtig und sollte die akzeptierte Antwort sein, da sie tatsächlich transpiliert.
– Jason Reis
7. Oktober 2020 um 16:41 Uhr
Diese Lösung funktioniert nicht, wenn Sie ausgeführt werden .ts Dateien. Wenn Sie das einfach mit hinzufügen könnten nodemon anstatt node, gemäß dieser Antwort stackoverflow.com/a/65058291/11664580 unten, würde es den Leuten hoffentlich den halben Tag ersparen, den ich damit verbracht habe, herumzuspielen. Alternativ installieren ts-node scheint eine Lösung zu sein, laut stackoverflow.com/a/61947868/11664580
– JimmyTheCode
22. Oktober 2021 um 15:49 Uhr
Dr-Klammer
Falls jemand auf dieses Problem stößt Typoskriptder Schlüssel zur Lösung war für mich die Veränderung
"target": "esnext",
"module": "esnext",
zu
"target": "esnext",
"module": "commonjs",
In meinem tsconfig.json. Ich hatte den Eindruck “esnext” war das “beste”, aber das war nur ein Fehler.
Wenn Sie verwenden babel-nodedann müssen Sie auch die verwenden --extensions Möglichkeit, z babel-node --extensions \".ts,.tsx\" src/index
– Matt Browne
15. Juli 2021 um 18:31 Uhr
Ja, das hat es getan, als beim Versuch “type” : “module” plötzlich sagte “require is undefined”.
– Vasily Hall
6. August 2021 um 3:46 Uhr
Verdammt, es hat mir viel Ärger erspart. Ich habe den gleichen Fehler gemacht, als ich unter das Impressino kam esnext ist das Beste
– Jake
17. November 2021 um 8:50 Uhr
deine Antwort funktioniert. Können Sie erklären, warum wir so optimieren sollten? @Dr-Bracket Vielen Dank
– Delfin
vor 1 Stunde
L. Theodore Obonye
Für diejenigen, die beim Lesen der Antworten genauso verwirrt waren wie ich, fügen Sie in Ihrer Datei package.json hinzu "type": "module"
in der oberen ebene wie unten gezeigt:
tx, aber haben Sie eine Idee, wo ich die package.json finden kann?? Ich verwende Netbeans. Ich habe auch auf meinem Macbook nach package.json gesucht, aber ich sehe viele package.json-Dateien. Irgendwelche Tipps?
– Alex
11. März 2021 um 10:54 Uhr
Hallo Alex, es ist schon eine Weile her, dass ich an einem Java-Projekt gearbeitet habe, aber ich hoffe, dass dieser Link Ihnen einen Hinweis darauf geben kann, wo Sie die Datei package.json finden können: stackoverflow.com/questions/41513559/…
Hallo, habe gerade das gleiche Problem. Könnten Sie auch Ihre Abhängigkeiten teilen? Vielleicht sogar ein Unterschied vor und nach Ihrem Update. Ich könnte mit meinem vergleichen, ob wir ähnliche Pakete finden können, die die Probleme verursachen könnten.
– Luchs
16. Oktober 2019 um 11:33 Uhr
Ich habe gerade alle “Importe” durch “erfordert” ersetzt und jetzt ist alles in Ordnung. Dumm, aber es war die Mühe nicht wert, es jetzt herauszufinden. Ich werde das Original jedoch mit Abhängigkeiten aktualisieren. Wenn Sie Hinweise erhalten, werde ich sie mit meinem ursprünglichen Code vergleichen.
– Benutzer3810626
16. Oktober 2019 um 20:20 Uhr
Die CommonJS-Syntax (require and module.exports) war das ursprüngliche Format für Node und Webpack und unterstützt es ebenfalls, aber die ES6-Modulsyntax (Export, Import) ist der neuere Weg und wird jetzt von Node und Webpack unterstützt. Ich habe gelesen, dass Knoten jetzt den Import unterstützen, aber so viele Tutorials zeigen, dass es für reine Knotensachen erforderlich ist, dass es wahrscheinlich besser ist, diese Syntax für Knoten zu verwenden.
– Ted Fitzpatrick
16. Oktober 2019 um 20:29 Uhr
Letztendlich schien mir der Weg zum Ziel dieser zu sein: github.com/vuejs/vue-jest/issues/134#issuecomment-461755061 Einstellen der Voreinstellung in
jest.config.js
zu'ts-jest/presets/js-with-ts'
– habe noch einige andere Probleme, aber dies hat das große Problem gelöst. ….. äh ja, mein Problem war testbezogen … die normalen Builds waren in Ordnung– Luchs
16. Oktober 2019 um 20:53 Uhr
"type":"module"
löst mein Problem nicht, und es gibt über hundert davonimports
. Syntax vonrequire
unterscheidet sich vonimports
, kein einfacher Ersatz. Können Sie ein Beispiel geben, wieimports
wird ersetzt durchrequires
?– Jeb50
29. August 2020 um 22:13 Uhr