Node.js – SyntaxError: Onverwachte tokenimport

Ik begrijp niet wat er mis is.
Knooppunt v5.6.0
NPM v3.10.6

De code:

function (exports, require, module, __filename, __dirname) {
    import express from 'express'
};

De fout:

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

Antwoord 1, autoriteit 100%

Node 13+Sinds Node 13, kunt u de extensie .mjsgebruiken of {"type": "module"}instellen in uw package.json. U hoeft nietde vlag --experimental-moduleste gebruiken. Modules zijn nu gemarkeerd als stabiel in node.js

Node 12Sinds Node 12kun je de .mjsextensie, of stel "type": "module"in in uw package.json. En je moet node uitvoeren met de vlag --experimental-modules.

Node 9In Node 9is het ingeschakeld achter een vlag en gebruikt de extensie .mjs.

node --experimental-modules my-app.mjs

Hoewel importinderdaad deel uitmaakt van ES6, wordt het helaas nog niet standaard ondersteund in NodeJS en heeft het pas zeer recentelijk ondersteuning gekregen in browsers.

Zie browser-compattabel op MDNen dit Node-probleem.

Van James M Snell’s Update op ES6-modules in Node.js(februari 2017):

Er wordt aan gewerkt, maar het zal even duren — We kijken momenteel naar minstens een jaar.

Totdat de ondersteuning native verschijnt (nu gemarkeerd als stabiel in Node 13+), < strike>je moet klassieke require-instructiesblijven gebruiken:

const express = require("express");

Als je echt nieuwe ES6/7-functies in NodeJS wilt gebruiken, kun je deze compileren met Babel. Hier is een voorbeeldserver.


Antwoord 2, autoriteit 11%

Helaas ondersteunt Node.js de importvan ES6 nog niet.

Om te bereiken wat u probeert te doen (importeer de Express-module), zou deze code moeten volstaan

var express = require("express");

Zorg er ook voor dat Express is geïnstalleerd door het uitvoeren van

$ npm install express

Bekijk de Node.js-documentenvoor meer informatie over het leren van Node.js.


Antwoord 3, autoriteit 8%

Ik ben geschokt dat esmniet is genoemd. Met dit kleine, maar krachtige pakket kun je importof requiregebruiken.

Installeer esm in uw project

$ npm install --save esm

Update uw Node Start-script om esm te gebruiken

node -r esm app.js

esmwerkt gewoon. Ik heb VEEL tijd verspild met .mjsen --experimental-modulesom erachter te komen dat een .mjs-bestand geen bestand kan importeren dat requireof module.exports. Dit was een enorm probleem, terwijl je met esmkunt mixen en matchen en het komt er gewoon uit… esmwerkt gewoon.


Antwoord 4, autoriteit 7%

Zoals vermeld in andere antwoorden ondersteunt Node JS momenteel geen ES6-import.

(Lees vanaf nu EDIT 2)

ES6-import in node js inschakelenbiedt een oplossing voor dit probleem. Ik heb dit geprobeerd en het werkte voor mij.

Voer de opdracht uit:

   npm install babel-register babel-preset-env --save-dev

Nu moet je een nieuw bestand (config.js) maken en de volgende code eraan toevoegen.

   require('babel-register')({
        presets: [ 'env' ]
    })
    // Import the rest of our application.
    module.exports = require('./your_server_file.js')

Je kunt nu importstatements schrijven zonder fouten te krijgen.

Hopelijk helpt dit.

BEWERKEN:

U moet het nieuwe bestand uitvoeren dat u met bovenstaande code hebt gemaakt. In mijn geval was het config.js. Dus ik moet rennen:

   node config.js

BEWERK 2:

Tijdens het experimenteren heb ik een eenvoudige oplossing voor dit probleem gevonden.

Maak .babelrcbestand in de hoofdmap van uw project.

Voeg het volgende toe (en alle andere babel-presets die je nodig hebt, kunnen in dit bestand worden toegevoegd):

   {
        "presets": ["env"]
    }

Installeer babel-preset-envmet het commando npm install babel-preset-env --save, en installeer vervolgens babel-climet commando npm install babel-cli -g --save

Ga nu naar de map waar uw server- of indexbestand bestaat en voer het uit met:
babel-node bestandsnaam.js

Of u kunt npm startgebruiken door de volgende code toe te voegen aan uw package.json-bestand:

   "scripts": {
        "start": "babel-node src/index.js"
    }

Antwoord 5, autoriteit 6%

Fout:SyntaxError: Onverwachte token importof SyntaxError: Onverwachte token exporteren


Oplossing:verander al uw invoer als voorbeeld

const express               = require('express');
const webpack               = require('webpack');
const path                  = require('path');
const config                = require('../webpack.config.dev');
const open                  = require('open');

en wijzig ook uw export default = foo;naar module.exports = foo;


Antwoord 6, Autoriteit 4%

Als u hier nog steeds geen “import” niet kunt gebruiken, is het hoe ik het behandelde:
Vertaal het gewoon naar een knooppuntvriendelijke vereisen. Voorbeeld:

import { parse } from 'node-html-parser';

is hetzelfde als:

const parse = require('node-html-parser').parse;

Antwoord 7, Autoriteit 3%

Babel 7 Voorstel
Kun je dev-afhankelijkheden toevoegen

npm i -D @babel/core @babel/preset-env @babel/register

en voeg een .babelrc toe in de root

{
"presets": [
  [
    "@babel/preset-env",
    {
      "targets": {
        "node": "current"
     }
    }
  ]
 ]
}

en voeg toe aan het .js-bestand

require("@babel/register")

Of als u het in de CLI uitvoert, kunt u de vereiste haak gebruiken als -r @ babel / register, ex.

$node -r @babel/register executeMyFileWithESModules.js

Antwoord 8, Autoriteit 2%

Als u ‘Babel’ kunt gebruiken, probeer dan Build Scripts in Package.json (- Presets = ES2015) toe te voegen zoals hieronder. het maakt het precompile importcode voor ES2015

"build": "babel server --out-dir build --presets=es2015 && webpack"

Antwoord 9

Vanaf Node.js v12 (en dit is nu waarschijnlijk redelijk stabiel, maar nog steeds gemarkeerd als “experimenteel”), heb je een aantal opties voor het gebruik van ESM (ECMAScript Modules) in Node.js (voor bestanden is er een derde manier om strings te evalueren), dit is wat de documentatiezegt:

De vlag --experimental-moduleskan worden gebruikt om ondersteuning in te schakelen voor:
ECMAScript-modules (ES-modules).

Eenmaal ingeschakeld, behandelt Node.js het volgende als ES-modules wanneer het wordt doorgegeven aan:
nodeals de eerste invoer, of wanneer ernaar wordt verwezen door import-instructies binnen
ES-modulecode:

  • Bestanden die eindigen op .mjs.

  • Bestanden die eindigen op .js, of bestanden zonder extensie, wanneer de dichtstbijzijnde ouder
    Het bestand package.jsonbevat een veld op het hoogste niveau "type"met een waarde van
    "module".

  • Strings doorgegeven als argument aan --evalof --print, of doorgesluisd naar
    nodevia STDIN, met de vlag --input-type=module.

Node.js behandelt alle andere vormen van invoer als CommonJS, zoals .js-bestanden
waarbij het dichtstbijzijnde bovenliggende bestand package.jsongeen "type"op het hoogste niveau bevat
veld, of tekenreeksinvoer zonder de vlag --input-type. Dit gedrag is om
achterwaartse compatibiliteit behouden. Nu Node.js echter beide ondersteunt
CommonJS- en ES-modules, is het het beste om waar mogelijk expliciet te zijn. Node.js
zal het volgende behandelen als CommonJS wanneer het wordt doorgegeven aan nodeals de initiële invoer,
of wanneer ernaar wordt verwezen door import-instructies binnen de code van de ES-module:

  • Bestanden die eindigen op .cjs.

  • Bestanden die eindigen op .js, of bestanden zonder extensie, wanneer de dichtstbijzijnde ouder
    Het bestand package.jsonbevat een veld op het hoogste niveau "type"met een waarde van
    "commonjs".

  • Strings doorgegeven als argument aan --evalof --print, of doorgesluisd naar
    nodevia STDIN, met de vlag --input-type=commonjs.


Antwoord 10

Toen ik met express begon, wilde ik altijd een oplossing om in plaats daarvan importeren te gebruiken

const express = require("express");
// to 
import express from "express"

Haal vaak deze regel door:- Unfortunately, Node.js doesn't support ES6's import yet.

Om anderen te helpen, maak ik hier twee nieuwe oplossingen

1) esm:-

De briljant eenvoudige, babelloze, bundelloze ECMAScript-modulelader.
laten we het laten werken

 yarn add esm / npm install esm

maak start.js of gebruik uw naamruimte

require = require("esm")(module/*, options*/)
 // Import the rest of our application.
 module.exports = require('./src/server.js')
 // where server.js is express server start file

Wijzig in uw package.josnpass-pad van start.js

 "scripts": {
    "start": "node start.js",
    "start:dev": "nodemon start.js",
  },
  "dependencies": {
+    "esm": "^3.2.25",
  },
  "devDependencies": {
+   "nodemon": "^1.19.2"
  }

2) Babel js:-

Dit kan in 2 delen worden opgedeeld

a) Oplossing 1met dank aan timonweb.com

b) Oplossing 2

gebruik Babel 6(ouder versie van babel-preset-stage-3 ^6.0)
maak een .babelrc-bestand aan in je hoofdmap

{
    "presets": ["env", "stage-3"]
}

Babel-preset-stage-3 installeren

yarn add babel-cli babel-polyfill babel-preset-env bable-preset-stage-3 nodemon --dev

Wijziging in package.json

"scripts": {
+   "start:dev": "nodemon --exec babel-node -- ./src/index.js",
+   "start": "npm run build && node ./build/index.js",
+   "build": "npm run clean && babel src -d build -s --source-maps --copy-files",
+   "clean": "rm -rf build && mkdir build"
},
"devDependencies": {
+    "babel-cli": "^6.26.0",
+    "babel-polyfill": "^6.26.0",
+    "babel-preset-env": "^1.7.0",
+    "babel-preset-stage-3": "^6.24.1",
+    "nodemon": "^1.19.4"
},

Start je server

yarn start / npm start

Oooh nee we creëren een nieuw probleem

regeneratorRuntime.mark(function _callee(email, password) {
^
ReferenceError: regeneratorRuntime is not defined

Deze fout treedt alleen op als u async/wait in uw code gebruikt.
Gebruik vervolgens polyfill met een aangepaste regenerator-runtime en core-js.
toevoegen bovenop index.js

import "babel-polyfill"

Hiermee kunt u async/wait gebruiken

gebruik Babel 7

Je moet alles in je project up-to-date houden
laten we beginnen met babe 7
.babelrc

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

Enkele wijzigingen in package.json

"scripts": {
+  "start:dev": "nodemon --exec babel-node -- ./src/index.js",
+  "start": "npm run build && node ./build/index.js",
+  "build": "npm run clean && babel src -d build -s --source-maps --copy-files",
+  "clean": "rm -rf build && mkdir build",
    ....
}
"devDependencies": {
+   "@babel/cli": "^7.0.0",
+   "@babel/core": "^7.6.4",
+   "@babel/node": "^7.0.0",
+   "@babel/polyfill": "^7.0.0",
+   "@babel/preset-env": "^7.0.0",
+   "nodemon": "^1.19.4"
....
}

en gebruik import "@babel/polyfill"op het startpunt

import "@babel/polyfill"
import express from 'express'
const app = express()
//GET request
app.get('/', async (req, res) {
  // await operation
  res.send('hello world')
})
app.listen(4000, () => console.log('🚀 Server listening on port 400!'))

Bedenk je waarom start:dev

Serieus. Het is een goede vraag of je nieuw bent. Elke wijziging die u elke keer met de startserver uitvoert
gebruik vervolgens yarn start:devals ontwikkelserver elke wijziging herstart de server automatisch voor meer informatie op nodemon


Antwoord 11

In mijn geval zorgde het voor het bestand .babelrc, en het zou zoiets als dit moeten bevatten:

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

Antwoord 12

Ik ga in op een ander probleem binnen de oorspronkelijke vraag dat niemand anders heeft. Na onlangs te zijn geconverteerd van CommonJS naar ESM in mijn eigen NodeJS-project, heb ik heel weinig discussie gezien over het feit dat je imports niet kunt plaatsen waar je maar wilt, zoals je zou kunnen vereisen. Mijn project werkt nu prima met import, maar wanneer ik de code in de vraag gebruik, krijg ik eerst een foutmelding omdat ik geen benoemde functie heb. Na het benoemen van de functie, krijg ik het volgende…

import express from 'express'
       ^^^^^^^
SyntaxError: Unexpected identifier
    at Loader.moduleStrategy (internal/modules/esm/translators.js:88:18)

Je kunt geen importen in functies plaatsen zoals je zou kunnen. Ze moeten bovenaan het bestand worden geplaatst, buiten de codeblokken. Ik heb zelf nogal wat tijd verspild aan dit probleem.

Dus al zijn alle bovenstaande antwoorden geweldig om u te helpen imports in uw project te laten werken, geen enkele gaat in op het feit dat de code in de oorspronkelijke vraag niet kan werken zoals geschreven.


Antwoord 13

import-instructies worden ondersteund in de stabiele release van Node sinds versie 14.x LTS.

Het enige wat u hoeft te doen is "type": "module"op te geven in package.json.


Antwoord 14

Mijn project gebruikt node v10.21.0, dat nog steeds geen ES6 importtrefwoord ondersteunt. Er zijn meerdere manieren om node importte laten herkennen, een daarvan is om node te starten met node --experimental-modules index.mjs(De mjsextensie is al behandeld in een van de antwoorden hier). Maar op deze manier kunt u geen node-specifiek trefwoord zoals requirein uw code gebruiken. Als het nodig is om het requiretrefwoord van beide nodejs te gebruiken samen met het importvan ES6, dan is de uitweg het gebruik van het esmnpm-pakket. Na het toevoegen van het esm-pakket als afhankelijkheid, moet het knooppunt worden gestart met een speciale configuratie zoals: node -r esm index.js


Antwoord 15

Ik heb geprobeerd dit werkend te krijgen. Dit is wat werkt:

  1. Gebruik een recente versie van het knooppunt. Ik gebruik v14.15.5. Verifieer uw versie door het volgende uit te voeren: node –version
  2. Geef de bestanden een naam zodat ze allemaal eindigen op .mjs in plaats van op .js

Voorbeeld:

mod.mjs

export const STR = 'Hello World'

test.mjs

import {STR} from './mod.mjs'
console.log(STR)

Uitvoeren:node test.mjs

U zou “Hallo World” moeten zien.


Antwoord 16

Installeer eenvoudig een hogere versie van het knooppunt. Zoals het knooppunt V10 ES6 niet wordt ondersteund. U moet een paar vlaggen uitschakelen of gebruiken

Other episodes