"Importazione di token imprevista" in Nodejs5 e babel?


192

Nel file js, ho usato l'importazione anziché la richiesta

import co from 'co';

E ho provato a eseguirlo direttamente da nodejs poiché diceva che l'importazione è "funzionalità di spedizione" e supporto senza alcun flag di runtime ( https://nodejs.org/en/docs/es6/ ), ma ho ricevuto un errore

import co from 'co';
^^^^^^

SyntaxError: Unexpected token import

Poi ho provato ad usare Babele

npm install -g babel-core
npm install -g babel-cli
npm install babel-core //install to babel locally, is it necessary?

e gestito da

babel-node js.js

hai ancora lo stesso errore, importazione di token imprevista?

Come potrei liberarmene?


14
@FelixKling: Sebbene la risposta alla domanda collegata risponda sicuramente anche a questa domanda, è difficile vedere questa domanda come un duplicato di quella. In ogni caso, sono stato contento di averlo qui, poiché Google mi ha portato direttamente qui perché l'errore di sintassi descritto corrispondeva esattamente a quello che ho visto. Sono onestamente contento che l'OP abbia pubblicato questo piuttosto che cercare una domanda in qualche modo correlata con una risposta che si è rivelata adatta.
Scott Sauyet,

3
npm i --save-dev babel-cli Risolto il problema per me ...
ChuckJHardy,

2
Voto per deselezionarlo come duplicato, penso che questa sia una domanda separata.
TWR Cole,

3
Questo non è un duplicato. Un altra soluzione vorrei post è quello di Assicurati di questo plugin in .babelrc: "transform-es2015-modules-commonjs".
Dan Dascalescu

7
I duplicati sono (dovrebbero essere) ok. È una parte importante di come funzionano gli umani. Quello che dice @ScottSauyet è uno dei motivi. Spiegazioni diverse con diverse prospettive sono un'altra. Tutta questa "caccia duplicata" mi sembra molto inutile come visitatore abituale da anni. Vorrei che si fermasse.
Stijn de Witt,

Risposte:


203

Dalle note di rilascio di babel 6:

Poiché Babel si sta concentrando sull'essere una piattaforma per gli strumenti JavaScript e non un transpiler ES2015, abbiamo deciso di attivare tutti i plug-in. Ciò significa che quando installi Babel non traspone più il tuo codice ES2015 per impostazione predefinita.

Nella mia installazione ho installato il predefinito es2015

npm install --save-dev babel-preset-es2015

o con filato

yarn add babel-preset-es2015 --dev

e abilitato il preset nel mio .babelrc

{
  "presets": ["es2015"]
}

14
Buona risposta. Sfortunatamente, è ancora necessario utilizzare request () e non è possibile utilizzare import per i pacchetti npm.
Jagtesh Chadha,

24
Uso babel-nodeinsieme a es2015e reactpreset. Stesso errore
FuzzY,

3
Non funziona. Sì, è necessario, ma non consente l'importazione.
still_dreaming_1

6
Per me è stata una soluzione semplice. Sono stato sorpreso dalla visione del tunnel cercando di adattare il codice da un progetto di reazione / babele a un altro progetto es5 e di aggiornarlo alla sintassi es6 allo stesso tempo. Nel mio package.json sotto gli script, ho dimenticato di sostituire "run run" con "run.js babel-node". Sì, mi sento imbarazzato. :)
joezen777,

2
L'ecosistema JS è così semplice
Rodrigo il

51

Fino all'implementazione dei moduli è possibile utilizzare il "transpiler" Babel per eseguire il codice:

npm install --save babel-cli babel-preset-node6

e poi

./node_modules/babel-cli/bin/babel-node.js --presets node6 ./your_script.js

Se non si desidera digitare, --presets node6è possibile salvarlo .babelrc file:

{
  "presets": [
    "node6"
  ]
}

Vedi https://www.npmjs.com/package/babel-preset-node6 e https://babeljs.io/docs/usage/cli/


16
l'ultima raccomandazione della gente di Babel è quella di usare babel-preset-env che rileva quali polifillamenti eseguire, piuttosto che babel-preset-node*. In .babelrcuso:{ "presets": [ ["env", { "targets": { "node": "current" } }] ] }
ronen,

Dopo questo ho iniziato a ricevere l'errore (token non riconosciuto '<'): server.js:Unexpected token (37:12) 35 | const initialState = store.getState(); 36 | const componentHTML = renderToString( > 37 | <Provider store={store}> | ^ 38 | <RouterContext {...props} /> 39 | </Provider>, 40 | );
AK

26
  1. Installare i pacchetti: babel-core, babel-polyfill,babel-preset-es2015
  2. Crea .babelrccon i contenuti:{ "presets": ["es2015"] }
  3. Non inserire la importdichiarazione nel file della voce principale, utilizzare un altro file, ad esempio: app.jse il file della voce principale dovrebbe essere richiesto babel-core/registere babel-polyfillper far funzionare babel separatamente al primo posto prima di ogni altra cosa. Quindi è possibile richiedere l' istruzione app.jswhere import.

Esempio:

index.js

require('babel-core/register');
require('babel-polyfill');
require('./app');

app.js

import co from 'co';

Dovrebbe funzionare con node index.js.


1
Questa è una soluzione semplice che può essere utilizzata per lo sviluppo. Sebbene per la produzione dovresti sempre compilare il tuo codice es5.
Jonas Drotleff,

aspetta ... è questo quello che penso sia? qualche mese fa ho avuto il sogno che javascript / perl / qualsiasi lingua potesse essere estesa senza aggiornamenti mediante analisi extra personalizzate della lingua esistente nella stessa lingua. È questo che sta succedendo qui ???
Dmitry,

Risposta eccellente. Ma negli script, puoi mettere qualcosa di simile al di sotto. Quindi puoi usarlo in qualsiasi file. "scripts": {"build": "babel src -d dist", "start": "node dist / index.js"}
gkarthiks il

15

babel-preset-es2015 è ora obsoleto e riceverai un avviso se provi a utilizzare la soluzione di Laurence.

Per farlo funzionare con Babel 6.24.1+, utilizzare babel-preset-envinvece:

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

Quindi aggiungi envai tuoi preset .babelrc:

{
  "presets": ["env"]
}

Vedi i documenti Babel per maggiori informazioni.


C'è un modo per farlo con la CLI?
jcollum,


5

È possibile che tu stia eseguendo file non compilati. Cominciamo pulito!

Nella tua directory di lavoro crea:

  • Due cartelle. Uno per il codice es2015 precompilato. L'altro per l'output di Babel. Li chiameremo rispettivamente "src" e "lib".
  • Un file package.json con il seguente oggetto:

    { 
      "scripts": {
          "transpile-es2015": "babel src -d lib"
      },
      "devDependencies": {
          "babel-cli": "^6.18.0",
          "babel-preset-latest": "^6.16.0"
      }
    }
    
  • Un file denominato ".babelrc" con le seguenti istruzioni: {"presets": ["latest"]}

  • Infine, scrivi il codice di prova nel tuo file src / index.js. Nel tuo caso: import co from 'co'.

Tramite la tua console:

  • Installa i tuoi pacchetti: npm install
  • Traspila la tua directory di origine nella tua directory di output con il flag -d (aka --out-dir) come, già, specificato nel nostro pacchetto.json: npm run transpile-es2015
  • Esegui il tuo codice dalla directory di output! node lib/index.js

Purtroppo non ha funzionato. Unexpected token import.
dipole_moment,

1
Assicurarsi che il babelcomando sia nel percorso di ricerca. Ecco una leggera variazione. package.json: {"scripts": {"transpile": "./node_modules/.bin/babel src -d lib"}, "devDependencies": {"babel-cli": "^ 6.24.1", "babel-preset- env ":" ^ 1.6.0 "}} .babelrc: {" presets ": [" env "]}
Maksim Yegorov

5

Il metodo attuale è usare:

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

E poi dentro .babelrc

{
    "presets": ["env"]
}

questo installa il supporto Babel per l'ultima versione di js (es2015 e oltre) Dai un'occhiata a babeljs

Non dimenticare di aggiungere babel-nodeagli script in package.jsonuso durante l'esecuzione del file js come segue.

"scripts": {
   "test": "mocha",
    //Add this line to your scripts
   "populate": "node_modules/babel-cli/bin/babel-node.js" 
},

Ora puoi npm populate yourfile.jsall'interno del terminale.

Se si esegue Windows e si esegue un errore interno o esterno non riconosciuto, utilizzare il nodo davanti allo script come segue

node node_modules/babel-cli/bin/babel-node.js

Poi npm run populate


3

Devi usare babel-preset-env e nodemon per hot-ricaricare.

Quindi creare il file .babelrc con il contenuto seguente:

{
  "presets": ["env"]
}

Infine, crea lo script in package.json:

"scripts": {
    "babel-node": "babel-node --presets=env",
    "start": "nodemon --exec npm run babel-node -- ./index.js",
    "build": "babel src -d dist"
  }

O semplicemente usa questo boilerplate:

Caldaia: node-es6


2
  • installa -> "npm i --save-dev babel-cli babel-preset-es2015 babel-preset-stage-0"

prossimo nel file package.json aggiungi negli script "start": "babel-node server.js"

    {
  "name": "node",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "dependencies": {
    "body-parser": "^1.18.2",
    "express": "^4.16.2",
    "lodash": "^4.17.4",
    "mongoose": "^5.0.1"
  },
  "devDependencies": {
    "babel-cli": "^6.26.0",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-stage-0": "^6.24.1"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "babel-node server.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

e crea il file per babel, nella radice ".babelrc"

    {
    "presets":[
        "es2015",
        "stage-0"
    ]
}

ed esegui npm start nel terminale


1

Coinvolgere i seguenti passaggi per risolvere il problema:

1) Installa la CLI e il preset env

$ npm install --save-dev babel-cli babel-preset-env

2) Crea un file .babelrc

{
  "presets": ["env"]
}

3) configurare npm start in package.json

"scripts": {
    "start": "babel-node ./server/app.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  }

4) quindi avvia l'app

$ npm start

0

Ho fatto quanto segue per superare il problema (script ex.js)

problema

$ cat ex.js
import { Stack } from 'es-collections';
console.log("Successfully Imported");

$ node ex.js
/Users/nsaboo/ex.js:1
(function (exports, require, module, __filename, __dirname) { import { Stack } from 'es-collections';
                                                              ^^^^^^

SyntaxError: Unexpected token import
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:152:10)
    at Module._compile (module.js:624:28)
    at Object.Module._extensions..js (module.js:671:10)
    at Module.load (module.js:573:32)
    at tryModuleLoad (module.js:513:12)
    at Function.Module._load (module.js:505:3)
    at Function.Module.runMain (module.js:701:10)
    at startup (bootstrap_node.js:194:16)
    at bootstrap_node.js:618:3

soluzione

# npm package installation
npm install --save-dev babel-preset-env babel-cli es-collections

# .babelrc setup
$ cat .babelrc
{
  "presets": [
    ["env", {
      "targets": {
        "node": "current"
      }
    }]
  ]
}

# execution with node
$ npx babel ex.js --out-file ex-new.js
$ node ex-new.js
Successfully Imported

# or execution with babel-node
$ babel-node ex.js
Successfully Imported

0

@jovi tutto ciò che devi fare è aggiungere il file .babelrc in questo modo:

{
  "plugins": [
    "transform-strict-mode",
    "transform-es2015-modules-commonjs",
    "transform-es2015-spread",
    "transform-es2015-destructuring",
    "transform-es2015-parameters"
  ]
}

e installa questi plugin come devdipendenze con npm.

quindi prova di nuovo babel-node ***. js. Spero che questo possa aiutarti.


-4

Nella tua app, devi dichiarare i tuoi require()moduli, non usando la parola chiave 'import':

const app = require("example_dependency");

Quindi, crea un file .babelrc:

{
"presets": [ 
    ["es2015", { "modules": false }]
]
}

Quindi, nel tuo gulpfile, assicurati di dichiarare i tuoi require()moduli:

var gulp = require("gulp");
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.