web-dev-qa-db-de.com

Node.js - SyntaxError: Unerwarteter Tokenimport

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
357
SofDroid

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 .

393
Scimonster

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 .

50
baranskistad

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;

30
supritshah1289

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"
    }
20
Nirali Acharya

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;
12
Alberto

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"
8
ASTOMUSIC

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
6
Jason Ashley

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 auf import -Anweisungen verwiesen wird:

  • Dateien, die auf .mjs enden.

  • Dateien, die auf .js enden, oder erweiterungslose Dateien, wenn die nächstgelegene übergeordnete package.json Datei ein Feld der obersten Ebene "type" mit dem Wert "module" enthält.

  • Zeichenfolgen wurden als Argument an --eval oder --print übergeben oder über node mit dem Flag --input-type=module an STDIN weitergeleitet.

Node.js behandelt alle anderen Formen der Eingabe als CommonJS, z. B. .js Dateien, in denen die nächste übergeordnete package.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 an node übergeben wird oder wenn im ES-Modulcode auf import -Anweisungen verwiesen wird:

  • Dateien, die auf .cjs enden.

  • Dateien, die auf .js enden, oder erweiterungslose Dateien, wenn die nächstgelegene übergeordnete package.json Datei ein Feld der obersten Ebene "type" mit dem Wert "commonjs" enthält.

  • Zeichenfolgen wurden als Argument an --eval oder --print übergeben oder über node mit dem Flag --input-type=commonjs an STDIN weitergeleitet.

2
T.J. Crowder

In meinem Fall hat es sich um die .babelrc -Datei gekümmert und sollte ungefähr Folgendes enthalten:

{
  "presets": ["es2015-node5", "stage-3"],
  "plugins": []
}
1
Ghita Tomoiaga