Ich verstehe nicht, was los ist. Node 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
Update: In Node 9 ist es hinter einem Flag aktiviert und verwendet die Erweiterung .mjs
.
node --experimental-modules my-app.mjs
Obwohl import
in der Tat Teil von ES6 ist, wird es in NodeJS leider noch nicht standardmäßig unterstützt und wurde erst kürzlich in Browsern unterstützt.
Siehe Browserkompatibilitätstabelle auf MDN und diese Node Ausgabe .
Aus James M Snells pdate zu ES6-Modulen in Node.js (Februar 2017):
Die Arbeiten sind im Gange, aber es wird einige Zeit dauern. Wir sehen derzeit mindestens ein Jahr.
Bis die Unterstützung nativ angezeigt wird, müssen Sie weiterhin die klassischen require
-Anweisungen verwenden:
const express = require("express");
Wenn Sie die neuen ES6/7-Funktionen in NodeJS wirklich nutzen möchten, können Sie sie mit Babel kompilieren. Hier ist ein Beispielserver .
Leider unterstützt Node.js das import
von ES6 noch nicht.
Um das zu erreichen, was Sie versuchen (das Express-Modul importieren), sollte dieser Code ausreichen
var express = require("express");
Stellen Sie außerdem sicher, dass Sie Express installiert haben, indem Sie ausführen
$ npm install express
Weitere Informationen zum Erlernen von Node.js finden Sie in den Node.js Docs .
Fehler: SyntaxError: Unerwartetes Token Import oder SyntaxError: Unerwartetes Token Export
Lösung: Ändern Sie alle Ihre Importe als Beispiel
const express = require('express');
const webpack = require('webpack');
const path = require('path');
const config = require('../webpack.config.dev');
const open = require('open');
Und ändern Sie auch Ihren export default = foo;
in module.exports = foo;
Wie bereits in anderen Antworten erwähnt, unterstützt Node JS derzeit keine ES6-Importe
(Lies ab sofort EDIT 2)
ES6-Importe in Knoten js aktivieren bietet eine Lösung für dieses Problem. Ich habe es satt und es hat bei mir funktioniert.
Führen Sie den Befehl aus:
npm install babel-register babel-preset-env --save-dev
Jetzt müssen Sie eine neue Datei (config.js) erstellen und den folgenden Code hinzufügen.
require('babel-register')({
presets: [ 'env' ]
})
// Import the rest of our application.
module.exports = require('./your_server_file.js')
Jetzt können Sie Importanweisungen schreiben, ohne Fehler zu erhalten.
Hoffe das hilft.
EDIT:
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 laufen:
node config.js
EDIT 2:
Während des Experimentierens fand ich eine einfache Lösung für dieses Problem.
Erstellen Sie die Datei .babelrc
im Stammverzeichnis Ihres Projekts.
Fügen Sie Folgendes hinzu (und alle anderen Babel-Voreinstellungen, die Sie benötigen, können in dieser Datei hinzugefügt werden):
{
"presets": ["env"]
}
Installieren Sie babel-preset-env
mit dem Befehl npm install babel-preset-env --save
und anschließend babel-cli
mit dem Befehl npm install babel-cli -g --save
Wechseln Sie nun in den Ordner, in dem sich Ihre Server- oder Indexdatei befindet, und führen Sie Folgendes aus: babel-node fileName.js
Sie können auch npm start
verwenden, indem Sie Ihrer package.json
-Datei den folgenden Code hinzufügen:
"scripts": {
"start": "babel-node src/index.js"
}
Für den Fall, dass Sie "importieren" immer noch nicht verwenden können, habe ich es folgendermaßen gehandhabt: Übersetzen Sie es einfach in eine knotenfreundliche Anforderung. Beispiel:
import { parse } from 'node-html-parser';
Ist das gleiche wie:
const parse = require('node-html-parser').parse;
wenn Sie 'babel' verwenden können, versuchen Sie, Build-Skripte in package.json (- presets = es2015) wie folgt hinzuzufügen. Es kann Importcode für es2015 vorkompiliert werden
"build": "babel server --out-dir build --presets=es2015 && webpack"
Babel 7 Vorschlag Können Sie Dev-Abhängigkeiten hinzufügen
npm i -D @babel/core @babel/preset-env @babel/register
und fügen Sie ein .babelrc in der Wurzel hinzu
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": "current"
}
}
]
]
}
und zur .js-Datei hinzufügen
require("@babel/register")
oder wenn Sie es in der CLI ausführen, können Sie den erforderlichen Hook als -r @ babel/register verwenden, z.
$node -r @babel/register executeMyFileWithESModules.js
Ab Node.js v12 (und das ist wahrscheinlich ziemlich stabil, aber immer noch als "experimentell" markiert) stehen Ihnen einige Optionen für die Verwendung von ESM (E CMA S) ZUR VERFÜGUNG cript M odules) in Node.js (für Dateien gibt es eine dritte Möglichkeit zum Auswerten von Strings), hier ist die Dokumentation sagt:
Mit dem Flag
--experimental-modules
können Sie die Unterstützung für ECMAScript-Module (ES-Module) aktivieren.Nach der Aktivierung behandelt Node.js Folgendes als ES-Module, wenn es an
node
als erste Eingabe übergeben wird oder wenn im ES-Modulcode aufimport
-Anweisungen verwiesen wird:
Dateien, die auf
.mjs
enden.Dateien, die auf
.js
enden, oder erweiterungslose Dateien, wenn die nächstgelegene übergeordnetepackage.json
Datei ein Feld der obersten Ebene"type"
mit dem Wert"module"
enthält.Zeichenfolgen wurden als Argument an
--eval
odernode
mit dem Flag--input-type=module
anSTDIN
weitergeleitet.Node.js behandelt alle anderen Formen der Eingabe als CommonJS, z. B.
.js
Dateien, in denen die nächste übergeordnetepackage.json
Datei kein oberstes"type"
Feld enthält, oder Zeichenketteneingabe ohne das Flag--input-type
. Dieses Verhalten dient der Aufrechterhaltung der Abwärtskompatibilität. Da Node.js jetzt sowohl CommonJS- als auch ES-Module unterstützt, ist es am besten, wenn möglich explizit vorzugehen. Node.js behandelt Folgendes als CommonJS, wenn es als erste Eingabe annode
übergeben wird oder wenn im ES-Modulcode aufimport
-Anweisungen verwiesen wird:
Dateien, die auf
.cjs
enden.Dateien, die auf
.js
enden, oder erweiterungslose Dateien, wenn die nächstgelegene übergeordnetepackage.json
Datei ein Feld der obersten Ebene"type"
mit dem Wert"commonjs"
enthält.Zeichenfolgen wurden als Argument an
--eval
odernode
mit dem Flag--input-type=commonjs
anSTDIN
weitergeleitet.
In meinem Fall hat es sich um die .babelrc
-Datei gekümmert und sollte ungefähr Folgendes enthalten:
{
"presets": ["es2015-node5", "stage-3"],
"plugins": []
}