Ich verstehe nicht, was los ist. Knoten v5.6.0 NPM v3.10.6
Der Code:
function (exports, require, module, __filename, __dirname) {
import express from 'express'
};
Der Fehler:
SyntaxError: Unexpected token import
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:387:25)
at Object.Module._extensions..js (module.js:422:10)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Function.Module.runMain (module.js:447:10)
at startup (node.js:140:18)
at node.js:1001:3
javascript
node.js
npm
ecmascript-6
SofDroid
quelle
quelle
Antworten:
Update 3: Seit Knoten 13 können Sie entweder die Erweiterung .mjs verwenden oder "type": "module" in Ihrer package.json festlegen. Sie müssen die
--experimental-modules
Flagge nicht verwenden.Update 2: Seit Knoten 12 können Sie entweder die
.mjs
Erweiterung verwenden oder"type": "module"
in Ihrer package.json festlegen. Und Sie müssen den Knoten mit dem--experimental-modules
Flag ausführen .Update: In Knoten 9 wird es hinter einem Flag aktiviert und verwendet die
.mjs
Erweiterung.Obwohl
import
es in der Tat Teil von ES6 ist, wird es in NodeJS leider noch nicht standardmäßig unterstützt und hat erst vor kurzem Unterstützung in Browsern erhalten.Siehe Browserkompatibilitätstabelle zu MDN und diesem Knotenproblem .
Aus James M Snells Update zu ES6-Modulen in Node.js (Februar 2017):
Bis die Unterstützung nativ angezeigt wird, müssen Sie weiterhin klassische
require
Anweisungen verwenden:Wenn Sie wirklich neue ES6 / 7-Funktionen in NodeJS verwenden möchten, können Sie diese mit Babel kompilieren. Hier ist ein Beispielserver .
quelle
Leider unterstützt Node.js ES6 noch
import
nicht.Um das zu erreichen, was Sie versuchen (das Express-Modul importieren), sollte dieser Code ausreichen
Stellen Sie außerdem sicher, dass Express durch Ausführen installiert ist
Weitere Informationen zum Erlernen von Node.js finden Sie in den Node.js- Dokumenten.
quelle
import
ist nicht unbedingt eine Funktion von TypeScript. TypeScript ist ES6 mit Typisierungen. Sachen wie Import sind also ES6-native.node index.js
funktioniert für mich, aber wenn ich rennenode dist/main.js
bekomme ich auchUnexpected token import
.index.js
vorbei bist, heißt das nicht, dass auch deindist/main.js
Wille vorbei ist.Wie in anderen Antworten erwähnt, unterstützt Node JS derzeit keine ES6-Importe.
(Lesen Sie ab sofort EDIT 2)
Das Aktivieren von ES6-Importen in Knoten js bietet eine Lösung für dieses Problem. Ich habe es versucht und es hat bei mir funktioniert.
Führen Sie den folgenden Befehl aus:
Jetzt müssen Sie eine neue Datei (config.js) erstellen und den folgenden Code hinzufügen.
Jetzt können Sie Importanweisungen schreiben, ohne Fehler zu erhalten.
Hoffe das hilft.
BEARBEITEN:
Sie müssen die neue Datei ausführen, die Sie mit dem obigen Code erstellt haben. In meinem Fall war es
config.js
. Also muss ich rennen:EDIT 2:
Während des Experimentierens fand ich eine einfache Lösung für dieses Problem.
Erstellen Sie eine
.babelrc
Datei im Stammverzeichnis Ihres Projekts.Fügen Sie Folgendes hinzu (und alle anderen benötigten Babel-Voreinstellungen können in dieser Datei hinzugefügt werden):
Installieren Sie
babel-preset-env
mit dem Befehlnpm install babel-preset-env --save
und installieren Sie dannbabel-cli
mit dem Befehlnpm install babel-cli -g --save
Wechseln Sie nun zu dem Ordner, in dem Ihre Server- oder Indexdatei vorhanden ist, und führen Sie Folgendes aus: babel-node fileName.js
Oder Sie können mit ausführen,
npm start
indem Sie Ihrerpackage.json
Datei folgenden Code hinzufügen :quelle
"start": "babel-node electron .",
aber kein GlückFehler: SyntaxError: Unerwarteter Token- Import oder SyntaxError: Unerwarteter Token- Export
Lösung: Ändern Sie alle Ihre Importe als Beispiel
Und ändern Sie auch Ihre
export default = foo;
zumodule.exports = foo;
quelle
Ich bin schockiert,
esm
wurde nicht erwähnt. Mit diesem kleinen, aber mächtigen Paket können Sie entwederimport
oder verwendenrequire
.Installieren Sie esm in Ihrem Projekt
$ npm install --save esm
Aktualisieren Sie Ihr Node Start Script, um esm zu verwenden
node -r esm app.js
esm
funktioniert einfach. Ich habe eine TONNE Zeit damit verschwendet.mjs
und--experimental-modules
nur um herauszufinden, dass eine.mjs
Datei keine Datei importieren kann, dierequire
oder verwendetmodule.exports
. Dies war ein großes Problem, währendesm
Sie es mischen und anpassen können und es nur herausfindet ...esm
funktioniert einfach.quelle
Für den Fall, dass Sie "import" immer noch nicht verwenden können, habe ich es so gehandhabt: Übersetzen Sie es einfach in eine knotenfreundliche Anforderung. Beispiel:
Ist das gleiche wie:
quelle
export
Schlüsselwort verwendenexport
Schlüsselwort arbeiten, danke trotzdem für Ihren hilfreichen Hinweis!Mit dem Vorschlag für Babel 7 können Sie Entwicklungsabhängigkeiten hinzufügen
und fügen Sie eine .babelrc im Stammverzeichnis hinzu
und zur .js-Datei hinzufügen
oder wenn Sie es in der CLI ausführen, können Sie den erforderlichen Hook als -r @ babel / register verwenden, z.
quelle
Wenn Sie 'babel' verwenden können, versuchen Sie, Build-Skripte in package.json (- presets = es2015) wie folgt hinzuzufügen. Der Importcode muss in es2015 vorkompiliert werden
quelle
npm start
zuerst den "Build" oder zuerst den "Start" ausführen? (Der Start ist derzeit definiert:"nodemon src/app.js --exec \"npm run lint && node\"",
Ab Node.js v12 (und dies jetzt wahrscheinlich ziemlich stabil ist, aber immer noch mit „experimentell“), haben Sie eine Reihe von Optionen für die Verwendung von ESM ( E CMA S cript M odule) in Node.js (für Dateien, gibt es eine dritter Weg zum Auswerten von Strings), hier ist, was die Dokumentation sagt:
quelle
Als ich mit Express angefangen habe, wollte ich immer eine Lösung, um stattdessen Import zu verwenden
Viele Male gehen Sie durch diese Zeile: -
Unfortunately, Node.js doesn't support ES6's import yet.
Um anderen zu helfen, erstelle ich hier zwei neue Lösungen
1) esm : -
Der genial einfache ECMAScript-Modullader ohne Babel und ohne Bundle. Lass es funktionieren
Erstellen Sie start.js oder verwenden Sie Ihren Namespace
Ändern Sie Ihren
package.josn
Passpfad vonstart.js
2) Babel js : -
Dies kann in zwei Teile geteilt werden
a) Lösung 1 dank timonweb.com
b) Lösung 2
Verwenden Sie Babel 6 (ältere Version von babel-preset-stage-3 ^ 6.0 ), um eine
.babelrc
Datei in Ihrem Stammordner zu erstellenInstallieren Sie babel-preset-stage-3
Änderung in package.json
Starten Sie Ihren Server
Oooh nein, wir schaffen ein neues Problem
Dieser Fehler tritt nur auf, wenn Sie async / await in Ihrem Code verwenden. Verwenden Sie dann Polyfill, das eine benutzerdefinierte Regenerator-Laufzeit und Core-Js enthält. hinzufügen auf
index.js
Auf diese Weise können Sie async / await verwenden
benutze Babel 7
Müssen Sie alles in Ihrem Projekt auf den neuesten Stand bringen, beginnen Sie mit babel 7 .babelrc
Einige Änderungen in package.json
und
import "@babel/polyfill"
am Startpunkt verwendenDenkst du warum?
start:dev
Ernsthaft. Es ist eine gute Frage, wenn Sie neu sind. Jede Änderung, die Sie jedes Mal
yarn start:dev
mit dem Startserver ausführen, wird dann als Entwicklungsserver verwendet. Jede Änderung startet den Server automatisch neu, um mehr über nodemon zu erfahrenquelle
In meinem Fall kümmerte es sich um die
.babelrc
Datei und sollte ungefähr Folgendes enthalten:quelle