¿Importación de token inesperada en Nodejs5 y babel?

192

En el archivo js, ​​solía importar en lugar de requerir

import co from 'co';

E intenté ejecutarlo directamente por nodejs ya que decía que la importación es 'características de envío' y soporte sin ningún indicador de tiempo de ejecución ( https://nodejs.org/en/docs/es6/ ), pero recibí un error

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

SyntaxError: Unexpected token import

Entonces traté de usar babel

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

y dirigido por

babel-node js.js

¿Todavía tiene el mismo error, importación de token inesperada?

¿Cómo podría deshacerme de él?

jovi
fuente
14
@FelixKling: aunque la respuesta en la pregunta vinculada ciertamente también responde a esta pregunta, es difícil ver esta pregunta como un duplicado de esa pregunta. En cualquier caso, me alegré de tener este aquí, ya que Google me trajo directamente aquí porque el error de sintaxis descrito coincide exactamente con lo que vi. Sinceramente, me alegro de que el OP haya publicado esto en lugar de buscar una pregunta algo relacionada con una respuesta que coincidía.
Scott Sauyet
3
npm i --save-dev babel-cli Lo arregló para mí ...
ChuckJHardy
2
Voto para desmarcar esto como un duplicado, siento que esta es una pregunta separada.
TWR Cole
3
Esto no es un duplicado. Otra solución me gustaría post es para Asegúrate de haber este plugin en .babelrc: "transform-es2015-modules-commonjs".
Dan Dascalescu
77
Los duplicados están (deberían estar) bien. Es una parte importante de cómo funcionan los humanos. Lo que dice @ScottSauyet es una de las razones. Diferentes explicaciones con diferentes perspectivas es otra. Toda esta 'caza duplicada' me resulta muy inútil como visitante habitual durante años. Desearía que se detuviera.
Stijn de Witt

Respuestas:

202

De las notas de lanzamiento de babel 6:

Como Babel se está enfocando en ser una plataforma para herramientas de JavaScript y no un transpilador ES2015, hemos decidido hacer que todos los complementos sean opcionales. Esto significa que cuando instale Babel, ya no transpilará su código ES2015 de forma predeterminada.

En mi configuración instalé el preset es2015

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

o con hilo

yarn add babel-preset-es2015 --dev

y habilité el preset en mi .babelrc

{
  "presets": ["es2015"]
}
Laurence Bortfeld
fuente
14
Buena respuesta. Desafortunadamente, aún necesita usar require () y no puede usar importar para paquetes npm.
Jagtesh Chadha
24
Lo uso babel-nodejunto con es2015y reactpresets. Mismo error.
FuzzY
3
No funciona. Sí, eso es necesario, pero no hace que la importación funcione.
still_dreaming_1
66
Para mí fue una solución simple. Me quedé atrapado en la visión del túnel tratando de adaptar el código de un proyecto react / babel a otro proyecto es5 y actualizar a la sintaxis es6 al mismo tiempo. En mi package.json bajo scripts, olvidé reemplazar "node run" con "babel-node run.js". Sí, me siento avergonzado. :)
joezen777
2
El ecosistema JS es muy fácil
Rodrigo
51

Hasta que se implementen los módulos, puede usar el "transpilador" de Babel para ejecutar su código:

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

y entonces

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

Si no desea escribir --presets node6, puede guardarlo .babelrc:

{
  "presets": [
    "node6"
  ]
}

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

vincent mathew
fuente
16
La última recomendación de la gente de babel es usar babel-preset-env que detecta qué polyfills ejecutar, en lugar de babel-preset-node*. En .babelrcuso:{ "presets": [ ["env", { "targets": { "node": "current" } }] ] }
Ronen
Después de esto, comencé a recibir el error (token no reconocido '<'): 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. Instalar paquetes: babel-core, babel-polyfill,babel-preset-es2015
  2. Crear .babelrccon contenidos:{ "presets": ["es2015"] }
  3. No coloque una importdeclaración en su archivo de entrada principal, use otro archivo, por ejemplo: app.jsy su archivo de entrada principal debe ser obligatorio babel-core/registery babel-polyfillhacer que Babel funcione por separado en primer lugar antes que nada. Entonces puede requerir app.jsdonde la importdeclaración.

Ejemplo:

index.js

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

app.js

import co from 'co';

Debería funcionar con node index.js.

Adiono
fuente
1
Esta es una solución fácil que se puede utilizar para el desarrollo. Aunque para la producción siempre debes compilar tu código es5.
Jonas Drotleff
espera ... ¿es esto lo que creo que es? Hace unos meses tuve el sueño de que javascript / perl / cualquier idioma podría ampliarse sin actualizaciones mediante un análisis adicional personalizado del idioma existente en el mismo idioma. ¿Es esto lo que está pasando aquí?
Dmitry
Excelente respuesta Pero en los guiones, puedes poner algo como a continuación. Para que pueda usar en cualquier archivo. "scripts": {"build": "babel src -d dist", "start": "node dist / index.js"}
gkarthiks
15

babel-preset-es2015 ahora está en desuso y recibirá una advertencia si intenta utilizar la solución de Laurence.

Para que esto funcione con Babel 6.24.1+, use babel-preset-enven su lugar:

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

Luego añade env a sus presets en su .babelrc:

{
  "presets": ["env"]
}

Vea los documentos de Babel para más información.

kristina
fuente
¿Hay alguna manera de hacer esto con la CLI?
jcollum
5

Puede ser que esté ejecutando archivos sin compilar. ¡Comencemos limpio!

En su directorio de trabajo cree:

  • Dos carpetas Uno para el código es2015 precompilado. El otro para la producción de Babel. Los llamaremos "src" y "lib" respectivamente.
  • Un archivo package.json con el siguiente objeto:

    { 
      "scripts": {
          "transpile-es2015": "babel src -d lib"
      },
      "devDependencies": {
          "babel-cli": "^6.18.0",
          "babel-preset-latest": "^6.16.0"
      }
    }
  • Un archivo llamado ".babelrc" con las siguientes instrucciones: {"presets": ["latest"]}

  • Por último, escriba el código de prueba en su archivo src / index.js. En tu caso: import co from 'co'.

A través de tu consola:

  • Instala tus paquetes: npm install
  • Transpile su directorio de origen a su directorio de salida con el distintivo -d (también conocido como --out-dir) como ya se especificó en nuestro package.json: npm run transpile-es2015
  • ¡Ejecute su código desde el directorio de salida! node lib/index.js
MarbinJavier
fuente
No funcionó desafortunadamente. Unexpected token import.
dipole_moment
1
Asegúrese de que el babelcomando esté en su ruta de búsqueda. Aquí hay una ligera variación. 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

El método actual es usar:

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

Y luego en .babelrc

{
    "presets": ["env"]
}

esto instala el soporte de Babel para la última versión de js (es2015 y más allá) Mira babeljs

No olvide agregar babel-nodea sus scripts dentro del package.jsonuso cuando ejecute su archivo js de la siguiente manera.

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

Ahora puedes npm populate yourfile.jsdentro de la terminal.

Si está ejecutando Windows y ejecuta un comando interno o externo de error no reconocido, use el nodo delante del script de la siguiente manera

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

Luego npm run populate

Isaac Sekamatte
fuente
3

Debe usar babel-preset-env y nodemon para la recarga en caliente.

Luego cree el archivo .babelrc con el siguiente contenido:

{
  "presets": ["env"]
}

Finalmente, cree un script en package.json:

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

O simplemente use este repetitivo:

Repetitivo: node-es6

Priyanshu Chauhan
fuente
2
  • instalar -> "npm i --save-dev babel-cli babel-preset-es2015 babel-preset-stage-0"

siguiente en el archivo package.json agregue los scripts "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"
}

y crea un archivo para babel, en la raíz ".babelrc"

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

y ejecuta npm start en la terminal

lior ben yosef
fuente
1

Involucre los siguientes pasos para resolver el problema:

1) Instale la CLI y el preajuste env

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

2) Crear un archivo .babelrc

{
  "presets": ["env"]
}

3) configurar npm start en package.json

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

4) luego inicie la aplicación

$ npm start
KARTHIKEYAN.A
fuente
0

He hecho lo siguiente para superar el problema (por ejemplo, script 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

solución

# 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
nsaboo
fuente
0

@jovi todo lo que necesitas hacer es agregar un archivo .babelrc como este:

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

e instale estos complementos como dependencias con npm.

luego intente babel-node ***. js nuevamente. Espero que esto le pueda ayudar.

高 建德
fuente
-4

En su aplicación, debe declarar sus require()módulos, no utilizando la palabra clave 'importar':

const app = require("example_dependency");

Luego, cree un archivo .babelrc:

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

Luego, en su archivo de memoria, asegúrese de declarar sus require()módulos:

var gulp = require("gulp");
anycoloryoulike84
fuente