“Importação de token inesperada” no Nodejs5 e babel?

192

No arquivo js, ​​usei import para, em vez de exigir

import co from 'co';

E tentei executá-lo diretamente pelo nodejs, pois dizia que a importação é 'recursos de remessa' e suporte sem nenhum sinalizador de tempo de execução ( https://nodejs.org/en/docs/es6/ ), mas recebi um erro

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

SyntaxError: Unexpected token import

Então eu tentei usar babel

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

e executado por

babel-node js.js

ainda tem o mesmo erro, importação de token inesperada?

Como eu poderia me livrar disso?

jovi
fonte
14
@FelixKling: Embora a resposta na pergunta vinculada certamente também responda a essa pergunta, é difícil ver essa pergunta como uma duplicata. De qualquer forma, fiquei feliz por ter esse aqui, pois o Google me trouxe diretamente aqui, porque o erro de sintaxe descrito correspondia exatamente ao que eu vi. Sinceramente, fico feliz que o OP tenha postado isso em vez de procurar uma pergunta um pouco relacionada com uma resposta que se encaixasse.
21816 Scott Sauyet
3
npm i --save-dev babel-cli Fixa-lo para mim ...
ChuckJHardy
2
Eu voto para desmarcar isso como duplicado, acho que essa é uma pergunta separada.
TWR Cole
3
Isto não é uma duplicata. Uma outra solução que eu gostaria de post é para te de que este plugin em .babelrc: "transform-es2015-modules-commonjs".
Dan Dascalescu
7
As duplicatas estão (devem estar) ok. É uma parte importante de como os humanos trabalham. O que a @ScottSauyet diz é uma das razões. Explicações diferentes com perspectivas diferentes é outra. Toda essa 'caçada duplicada' me parece muito inútil como visitante regular por anos. Eu gostaria que isso parasse.
Stijn de Witt

Respostas:

202

Do babel 6 Notas de versão:

Como a Babel se concentra em ser uma plataforma para ferramentas JavaScript e não um transpiler ES2015, decidimos fazer com que todos os plug-ins sejam incluídos. Isso significa que, quando você instala o Babel, ele não transpila mais o código do ES2015 por padrão.

Na minha instalação, instalei a predefinição es2015

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

ou com fio

yarn add babel-preset-es2015 --dev

e habilitei a predefinição no meu .babelrc

{
  "presets": ["es2015"]
}
Laurence Bortfeld
fonte
14
Boa resposta. Infelizmente, você ainda precisa usar o require () e não pode usar a importação para pacotes npm.
Jagtesh Chadha 01/12/2015
24
Eu uso babel-nodejunto com es2015e reactpresets. Mesmo erro.
FuzzY
3
Não funciona. Sim, isso é necessário, mas não faz a importação funcionar.
still_dreaming_1
6
Para mim, foi uma solução simples. Eu fui pego na visão de túnel tentando adaptar o código de um projeto react / babel para outro projeto es5 e atualizar para a sintaxe es6 ao mesmo tempo. No meu package.json nos scripts, esqueci de substituir "node run" por "babel-node run.js". Sim, eu me sinto envergonhado. :)
joezen777 15/10
2
JS ecossistema é tão fácil
Rodrigo
51

Até a implementação dos módulos, você pode usar o "transpiler" Babel para executar seu código:

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

e depois

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

Se você não quiser digitar, --presets node6salve o arquivo .babelrc:

{
  "presets": [
    "node6"
  ]
}

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

Vincent Matthew
fonte
16
A recomendação mais recente do pessoal da babel é usar o babel-preset-env, que detecta quais polyfills executar, em vez de babel-preset-node*. Em .babelrcuso:{ "presets": [ ["env", { "targets": { "node": "current" } }] ] }
ronen 29/03
Depois disso, comecei a receber o erro (token não reconhecido '<'): 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 pacotes: babel-core, babel-polyfill,babel-preset-es2015
  2. Crie .babelrccom o conteúdo:{ "presets": ["es2015"] }
  3. Não coloque importdeclaração no seu arquivo de entrada principal, use outro arquivo, por exemplo: app.jse seu arquivo de entrada principal deve ser necessário babel-core/registere babel-polyfillpara fazer com que o babel funcione separadamente antes de qualquer outra coisa. Então você pode exigir a declaração app.jswhere import.

Exemplo:

index.js

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

app.js

import co from 'co';

Deveria funcionar com node index.js.

Adiono
fonte
1
Essa é uma solução fácil que pode ser usada para desenvolvimento. Embora para produção, você sempre deve compilar seu código es5.
Jonas Drotleff
espera ... é isso que eu acho que é? Há alguns meses, tive o sonho de que o javascript / perl / qualquer idioma pudesse ser estendido sem atualizações pela análise extra personalizada do idioma existente no mesmo idioma. É isso que está acontecendo aqui ???
Dmitry
Excelente resposta. Mas nos scripts, você pode colocar algo como abaixo. Então você pode usar em qualquer arquivo. "scripts": {"build": "babel src -d dist", "start": "node dist / index.js"}
gkarthiks
15

babel-preset-es2015 agora está obsoleto e você receberá um aviso se tentar usar a solução da Laurence.

Para que isso funcione com o Babel 6.24.1+, use babel-preset-env:

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

Em seguida, adicione envàs suas predefinições no seu .babelrc:

{
  "presets": ["env"]
}

Veja os documentos Babel para mais informações.

Cristina
fonte
Existe uma maneira de fazer isso com a CLI?
jcollum
5

Pode ser que você esteja executando arquivos não compilados. Vamos começar limpo!

No seu diretório de trabalho, crie:

  • Duas pastas Um para o código es2015 pré-compilado. O outro para a saída de babel. Vamos chamá-los de "src" e "lib", respectivamente.
  • Um arquivo package.json com o seguinte objeto:

    { 
      "scripts": {
          "transpile-es2015": "babel src -d lib"
      },
      "devDependencies": {
          "babel-cli": "^6.18.0",
          "babel-preset-latest": "^6.16.0"
      }
    }
  • Um arquivo chamado ".babelrc" com as seguintes instruções: {"presets": ["latest"]}

  • Por fim, escreva o código de teste no seu arquivo src / index.js. No seu caso: import co from 'co'.

Através do seu console:

  • Instale seus pacotes: npm install
  • Transpile seu diretório de origem para o diretório de saída com o sinalizador -d (aka --out-dir) como já especificado em nosso package.json: npm run transpile-es2015
  • Execute seu código no diretório de saída! node lib/index.js
MarbinJavier
fonte
Não deu certo, infelizmente. Unexpected token import.
26617 dippy_moment
1
Verifique se o babelcomando está no seu caminho de pesquisa. Aqui está uma ligeira variação. 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

O método atual é usar:

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

E então em .babelrc

{
    "presets": ["env"]
}

Este instala o suporte do Babel para a versão mais recente do js (es2015 e além) Confira babeljs

Não se esqueça de adicionar babel-nodeaos seus scripts package.jsonuso interno ao executar seu arquivo js da seguinte maneira.

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

Agora você pode npm populate yourfile.jsdentro do terminal.

Se você estiver executando o Windows e executando o erro interno ou externo do comando não reconhecido, use o nó na frente do script da seguinte maneira

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

Então npm run populate

Isaac Sekamatte
fonte
3

Você precisa usar babel-preset-env e nodemon para recarregar a quente.

Em seguida, crie o arquivo .babelrc com o conteúdo abaixo:

{
  "presets": ["env"]
}

Por fim, crie um script no package.json:

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

Ou apenas use este padrão:

Boilerplate: node-es6

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

próximo no arquivo package.json, adicione 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"
}

e crie um arquivo para babel, na raiz ".babelrc"

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

e execute npm start no terminal

lior ben yosef
fonte
1

Envolva as seguintes etapas para resolver o problema:

1) Instale a CLI e a predefinição de ambiente

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

2) Crie um arquivo .babelrc

{
  "presets": ["env"]
}

3) configure o npm start em package.json

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

4) depois inicie o aplicativo

$ npm start
KARTHIKEYAN.A
fonte
0

Fiz o seguinte para superar o 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

solução

# 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
fonte
0

@jovi tudo o que você precisa fazer é adicionar o arquivo .babelrc assim:

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

e instale esses plugins como devdependences com o npm.

em seguida, tente babel-node ***. js novamente. Espero que isso possa ajudá-lo.

高 建德
fonte
-4

No seu aplicativo, você deve declarar seus require()módulos, sem usar a palavra-chave 'import':

const app = require("example_dependency");

Em seguida, crie um arquivo .babelrc:

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

Então, no seu gulpfile, certifique-se de declarar seus require()módulos:

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