Node.js - SyntaxError: tokenul de import

Eu nu't înțeleagă ceea ce este greșit. Nod v5.6.0 NPM v3.10.6

Cod:

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

Eroare:

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
Comentarii la întrebare (1)
Soluția

Update 3: Din Nod 13, puteți utiliza fie .mjs extensie, sau pentru a seta "tip": "modulul" in pachet.json. Ai don't necesitatea de a utiliza `--experimentale-module de pavilion.

Update 2: Din Nod 12, puteți utiliza fie .mjs extensie, sau pentru a seta "tip": "modulul" in pachet.json. Și aveți nevoie pentru a rula nod cu--experimentale-module de pavilion.

Actualizare: In Nod 9, este activată în spatele unui steag, și folosește.mjs` extensie.

node --experimental-modules my-app.mjs

În timp ce "import" este într-adevăr o parte din ES6, este, din păcate, nu este încă susținută în NodeJS în mod implicit, și are doar foarte recent aterizat de sprijin în browsere.

A se vedea a browser-compat masă pe MDN și acest Nod problema.

De la James M. Snell's Update pe ES6 Module în Node.js (februarie 2017):

Lucrarea este în curs de desfășurare, dar este de gând să ia ceva timp — suntem în prezent în căutarea în jurul valorii de cel puțin un an.

Până sprijin apare nativ, nu'll trebuie să continuați să utilizați clasic nevoie de declarații:

const express = require("express");

Dacă într-adevăr doriți să utilizați noile ES6/7 caracteristici în NodeJS, puteți compila folosind Babel. Aici's un exemplu de server.

Comentarii (11)

Din păcate, Node.js nu't suport ES6's "import" încă.

Pentru a realiza ce v're încercarea de a face (de import Express module), acest cod ar trebui să fie suficient

var express = require("express");

De asemenea, asigurați-vă că aveți Express instalate prin rularea

$ npm install express

Vezi Node.js Docs pentru mai multe informații despre învățare Node.js.

Comentarii (5)

Eroare: SyntaxError: tokenul import sau SyntaxError: tokenul export


Soluție: Schimba toate importurile ca exemplu

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

Și, de asemenea, schimba-ti export default = foo; la modul.exporturile = foo;

Comentarii (2)

Așa cum am menționat în alte răspunsuri Node JS în prezent nu't suport ES6 importurilor.

(Ca de acum, citiți EDIT 2)

Enable ES6 importurile în node js oferă o soluție pentru această problemă. Am încercat acest lucru și a lucrat pentru mine.

Rulați comanda:

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

Acum aveți nevoie pentru a crea un nou fișier (config.js) și adăugați următorul cod la ea.

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

Acum puteți scrie declarații de import, fără a se eventualele erori.

Sper că acest lucru vă ajută.

EDIT:

Aveți nevoie pentru a rula noul fișier pe care ați creat cu codul de mai sus. În cazul meu a fost config.js. Așa că trebuie să ruleze:

    node config.js

EDIT 2:

În timp ce experimente, am găsit o soluție simplă la această problemă.

Crea .babelrc fișierul în rădăcina proiectului.

Se adaugă următorul (și orice alte babel presetări ai nevoie, poate fi adăugat în acest dosar):

    {
        "presets": ["env"]
    }

Instala babel-preset-env folosind comanda npm instala babel-preset-env-salvați, și apoi instalați babel-cli folosind comanda npm instala babel-cli -g --save

Acum, du-te la folderul în cazul în care server-ul dvs. sau fișier index există și rula folosind: babel-nod fileName.js

Sau puteți rula folosind npm start prin adăugarea următorul cod la pachetul.json`` fișier:

    "scripts": {
        "start": "babel-node src/index.js"
    }
Comentarii (3)

În caz că încă mai poate't de a folosi "import" aici este cum m-am descurcat: Doar traduce la un nod prietenos nevoie. Exemplu:

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

Este la fel ca:

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

dacă puteți utiliza 'babel', încercați să adăugați construi script-uri în pachet.json(--presetări=es2015) ca mai jos. pentru precompile codul de import pentru es2015

"build": "babel server --out-dir build --presets=es2015 && webpack"
Comentarii (2)

babel 7 propunere puteți adăuga dev dependențe

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

și adăugați-o .babelrc în rădăcină

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

și se adaugă la .fișier js

require("@babel/register")

sau dacă tu a alerga în cli, ai putea folosi nevoie de cârlig ca -r @babel/inregistrare, ex.

$node -r @babel/register executeMyFileWithESModules.js
Comentarii (1)

Ca de Node.js v12 (și acest lucru este, probabil, destul de stabil acum, dar încă marcat "experimental"), aveți o serie de opțiuni pentru utilizarea MES (ECMAScript Modules) în Node.js (pentru fișiere, acolo's o a treia cale pentru evaling siruri de caractere), aici's ce documentația spune:

--experimentale-module steag poate fi folosit pentru a activa suportul pentru ECMAScript module (ES module).

Odată activat, Node.js se vor trata următoarele ca ES module de când a trecut la nod ca inițială de intrare, sau atunci când sunt referite de import declarații în ES modulul de cod:

  • Fișierele care se termină în .mjs.

  • Fișierele care se termină în .js, sau extensionless fișiere, atunci când cel mai apropiat părinte pachetul.json dosar conține un nivel superior de teren "tip" cu o valoare de "modulul".

  • Siruri de caractere transmis ca argument pentru --eval sau --print, sau prin conducte la nod via STDIN, cu steagul --input tip=modulul.

Node.js va trata ca CommonJS toate celelalte forme de intrare, cum ar fi .js fișiere în cazul în care cel mai apropiat părinte pachetul.json fișier nu conține de nivel superior "tip" teren, sau un șir de intrare fără steag --intrare-tip. Acest comportament este de a păstra compatibilitate. Cu toate acestea, acum că Node.js suportă atât CommonJS și ES module, cel mai bine este să fie explicit ori de câte ori este posibil. Node.js se vor trata următoarele ca CommonJS când a trecut la nod ca inițială de intrare, sau când referite de import declarații în ES modulul de cod:

  • Fișierele care se termină în .cjs.

  • Fișierele care se termină în .js, sau extensionless fișiere, atunci când cel mai apropiat părinte pachetul.json dosar conține un nivel superior de teren "tip" cu o valoare de "commonjs".

  • Siruri de caractere transmis ca argument pentru --eval sau --print, sau prin conducte la nod via STDIN, cu steagul --input tip=commonjs.

Comentarii (0)

În cazul meu a fost căutat.babelrc` fișier, și acesta ar trebui să conțină ceva de genul asta:

{
  "presets": ["es2015-node5", "stage-3"],
  "plugins": []
}
Comentarii (0)

Când am început cu express dorit întotdeauna o soluție de a folosi import, în schimb, necesită const expres = necesită("express"); // pentru import express de la "express" Timp de multe du-te prin această linie: - din Păcate, Node.js nu't suport ES6's de import încă.

Acum, pentru a ajuta alti pot crea noi două soluții aici

Strălucit simplu, babel-mai puțin, bundle-mai puțin ECMAScript module loader. las's face să funcționeze fire add mes / npm instala mes crea start.js sau de a folosi nume nevoie = necesită("mes")(modulul/*, opțiuni*/) // Import restul de aplicare noastre. module.exporturile = necesită('./src/server.js') // unde server.js este express start file server Schimbare în pachet.josntrece calea de start.js `` "script": { "start": "nod de start.js", "start:dev": "nodemon începe.js", }, "dependențe": {

  • "mes": "^3.2.25", }, "devDependencies": {
  • "nodemon": "^1.19.2" } ``

Acest lucru poate fi împărțiți în 2 părți

a) Soluție 1 datorită timonweb.com

b) Soluție 2

folosi Babel 6 (versiune mai veche de babel-preset-etapa a-3 ^6.0) crea .babelrc fișier la folderul rădăcină

{ "presetări": ["mediu", "etapa a-3"] } Instalați babel-preset-etapa a-3 fire adauga babel-cli babel-polyfill babel-preset-env bable-preset-etapa a-3 nodemon-dev Schimbare în pachet.json `` "script": {

  • "start:dev": "nodemon --exec babel-nod -. /src/index.js",
  • "start": "npm rula build && nod ./construi/index.js",
  • "construi": "npm rula clean && babel src -d build-s --source-maps-copia fișiere",
  • "curat": "rm-rf build && mkdir construi" }, "devDependencies": {
  • "babel-cli": "^6.26.0",
  • "babel-polyfill": "^6.26.0",
  • "babel-preset-env": "^1.7.0",
  • "babel-preset-etapa a-3": "^6.24.1",
  • "nodemon": "^1.19.4" }, Porni server-ul dvs. fire start / npm începe Oooh nu ne-am crea noi probleme regeneratorRuntime.marca(funcția _callee(e-mail, parola) { ^ ReferenceError: regeneratorRuntime nu este definit Această eroare veni numai atunci când utilizați asincron/așteaptă în cod. Apoi, utilizați polyfill, care include un obicei regenerator de execuție și de bază-js. adauga pe partea de sus de index.js` import "babel-polyfill" `` Acest lucru vă permite să utilizați asincron/așteaptă

folosi Babel 7

Trebuie să-pana la data de fiecare lucru în proiectul dumneavoastră să începem cu babel 7 .babelrc { "presetări": ["@babel/preset-env"] } O schimbare în pachet.json `` "script": {

  • "start:dev": "nodemon --exec babel-nod -. /src/index.js",
  • "start": "npm rula build && nod ./construi/index.js",
  • "construi": "npm rula clean && babel src -d build-s --source-maps-copia fișiere",
  • "curat": "rm-rf build && mkdir construi", .... } "devDependencies": {
  • "@babel/cli": "^7.0.0",
  • "@babel/core": "^7.6.4",
  • "@babel/nod": "^7.0.0",
  • "@babel/polyfill": "^7.0.0",
  • "@babel/preset-env": "^7.0.0",
  • "nodemon": "^1.19.4" .... } și de a folosi `import "@babel/polyfill" la punctul de start import "@babel/polyfill" import express de la 'exprim' const app = exprima()

//IA cerere app.obține('/', asincron (req, res) { // așteaptă funcționare res.trimite - ('salut lume') }) app.asculta(4000, () => console.log('🚀 Server de ascultare pe portul 400!')) ` Te gândești de cestart:dev`

Serios. Aceasta este o întrebare bună, dacă sunteți nou. Fiecare schimbare ești mistreț cu start server de fiecare dată apoi folosesc fire de start:dev` ca server de dezvoltare fiecare schimbare restart la server automat pentru mai multe pe nodemon

Comentarii (0)

Am'm-a șocat mes n't a fost menționat. Acest mic, dar puternic pachet vă permite să utilizați fie "import" sau impun.

Instala mes în proiect

$ npm install-salvare mes

Actualizare ta de Start Nod Script pentru a utiliza mes

nod -r mes app.js

mes pur și simplu funcționează. Am pierdut o GRĂMADĂ de timp cu .mjs " și " --experimentale-module doar pentru a afla un .mjs fișierul nu poate importa un fișier care utilizează nevoie de " sau " module.exporturile. Acest lucru a fost o mare problemă, întrucât mes vă permite să se amestecă și se potrivesc și că doar își închipuie... mes pur și simplu funcționează.

Comentarii (0)