SyntaxError: Import-Anweisung kann nicht außerhalb eines Moduls verwendet werden

Lesezeit: 7 Minuten

SyntaxError Import Anweisung kann nicht auserhalb eines Moduls verwendet werden
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:

"dependencies": {
"@babel/polyfill": "^7.6.0",
"apollo-link-error": "^1.1.12",
"apollo-link-http": "^1.5.16",
"apollo-server": "^2.9.6",
"babel-preset-es2015": "^6.24.1",

  • 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

SyntaxError Import Anweisung kann nicht auserhalb eines Moduls verwendet werden
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?

    – Brandon

    15. April 2020 um 21:17 Uhr

  • oder benutze babel! ` module.exports = { Voreinstellungen: [‘@babel/preset-env’], }; `

    – Cocuba

    22. Juni 2020 um 12:38 Uhr

  • 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


1646320516 839 SyntaxError Import Anweisung kann nicht auserhalb eines Moduls verwendet werden
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


1646320517 470 SyntaxError Import Anweisung kann nicht auserhalb eines Moduls verwendet werden
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:

{
  "name": "my-app",
  "version": "0.0.0",
  "type": "module",
  "scripts": { ...
  },
  ...
}

  • 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/…

    – L. Theodore Obonye

    11. März 2021 um 11:19 Uhr

SyntaxError Import Anweisung kann nicht auserhalb eines Moduls verwendet werden
Konstantin Gatilin

Entsprechend die offizielle Dokumentation:

import-Anweisungen sind nur in ES-Modulen erlaubt. Eine ähnliche Funktionalität in CommonJS finden Sie unter import().

Damit Node.js Ihre Datei als ES-Modul behandelt, müssen Sie (Aktivieren):

  • fügen Sie “type”: “module” zu package.json hinzu
  • Fügen Sie dem Node.js-Aufruf das Flag „–experimental-modules“ hinzu

SyntaxError Import Anweisung kann nicht auserhalb eines Moduls verwendet werden
uns_david

Ich bin auf das gleiche Problem gestoßen und es ist noch schlimmer: Ich brauchte sowohl “Import” als auch “Require”.

  1. Einige neuere ES6-Module funktionieren nur mit importieren.
  2. Etwas CommonJS arbeitet mit benötigen.

Hier ist, was für mich funktioniert hat:

  1. Verwandeln Sie Ihre js-Datei in .mjs, wie in anderen Antworten vorgeschlagen

  2. “require” ist nicht mit dem ES6-Modul definiert, also können Sie es so definieren:

    import { createRequire } from 'module'
    const require = createRequire(import.meta.url);
    

    Jetzt kann ‘require’ wie gewohnt verwendet werden.

  3. Verwenden importieren für ES6-Module u benötigen für CommonJS.

Einige nützliche Links: Eigene Dokumentation von Node.js. Unterschied zwischen import und require. Mozilla hat eine nette Dokumentation zum Import

1646320518 226 SyntaxError Import Anweisung kann nicht auserhalb eines Moduls verwendet werden
Peter Mortensen

Ich hatte das gleiche Problem und das Folgende hat es behoben (mit Node.js 12.13.1):

  • Ändern .js Dateiendung zu .mjs
  • Addieren --experimental-modules Flag beim Ausführen Ihrer App.
  • Optional: hinzufügen "type": "module" in deiner package.json

Mehr Informationen: https://nodejs.org/api/esm.html

1646320518 226 SyntaxError Import Anweisung kann nicht auserhalb eines Moduls verwendet werden
Peter Mortensen

Zuerst installieren wir @babel/cli, @babel/core and @babel/preset-env:

npm install --save-dev @babel/cli @babel/core @babel/preset-env

Dann erstellen wir eine .babelrc Datei zum Konfigurieren Babel:

touch .babelrc

Dies wird alle Optionen hosten, mit denen wir Babel konfigurieren möchten:

{
  "presets": ["@babel/preset-env"]
}

Mit den jüngsten Änderungen an Babel müssen Sie Ihre transpilieren ES6 bevor Node.js es ausführen kann.

Also fügen wir unser erstes Skript, build, in der Datei hinzu Paket.json.

"scripts": {
  "build": "babel index.js -d dist"
}

Dann fügen wir unser Startskript in die Datei ein Paket.json.

"scripts": {
  "build": "babel index.js -d dist", // replace index.js with your filename
  "start": "npm run build && node dist/index.js"
}

Jetzt starten wir unseren Server.

npm start

924680cookie-checkSyntaxError: Import-Anweisung kann nicht außerhalb eines Moduls verwendet werden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy