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 .mjs
gebruiken of {"type": "module"}
instellen in uw package.json. U hoeft nietde vlag --experimental-modules
te gebruiken. Modules zijn nu gemarkeerd als stabiel in node.js
Node 12Sinds Node 12kun je de .mjs
extensie, 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 import
inderdaad 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 import
van 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 esm
niet is genoemd. Met dit kleine, maar krachtige pakket kun je import
of require
gebruiken.
Installeer esm in uw project
$ npm install --save esm
Update uw Node Start-script om esm te gebruiken
node -r esm app.js
esm
werkt gewoon. Ik heb VEEL tijd verspild met .mjs
en --experimental-modules
om erachter te komen dat een .mjs
-bestand geen bestand kan importeren dat require
of module.exports
. Dit was een enorm probleem, terwijl je met esm
kunt mixen en matchen en het komt er gewoon uit… esm
werkt 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 .babelrc
bestand 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-env
met het commando npm install babel-preset-env --save
, en installeer vervolgens babel-cli
met 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 start
gebruiken 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-modules
kan 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:
node
als de eerste invoer, of wanneer ernaar wordt verwezen doorimport
-instructies binnen
ES-modulecode:
Bestanden die eindigen op
.mjs
.Bestanden die eindigen op
.js
, of bestanden zonder extensie, wanneer de dichtstbijzijnde ouder
Het bestandpackage.json
bevat een veld op het hoogste niveau"type"
met een waarde van
"module"
.Strings doorgegeven als argument aan
--eval
of
node
viaSTDIN
, met de vlag--input-type=module
.Node.js behandelt alle andere vormen van invoer als CommonJS, zoals
.js
-bestanden
waarbij het dichtstbijzijnde bovenliggende bestandpackage.json
geen"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 aannode
als de initiële invoer,
of wanneer ernaar wordt verwezen doorimport
-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 bestandpackage.json
bevat een veld op het hoogste niveau"type"
met een waarde van
"commonjs"
.Strings doorgegeven als argument aan
--eval
of
node
viaSTDIN
, 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.josn
pass-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:dev
als 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 import
trefwoord ondersteunt. Er zijn meerdere manieren om node import
te laten herkennen, een daarvan is om node te starten met node --experimental-modules index.mjs
(De mjs
extensie is al behandeld in een van de antwoorden hier). Maar op deze manier kunt u geen node-specifiek trefwoord zoals require
in uw code gebruiken. Als het nodig is om het require
trefwoord van beide nodejs te gebruiken samen met het import
van ES6, dan is de uitweg het gebruik van het esm
npm-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:
- Gebruik een recente versie van het knooppunt. Ik gebruik v14.15.5. Verifieer uw versie door het volgende uit te voeren: node –version
- 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