«Неожиданный импорт токенов» в Nodejs5 и babel?

192

В js-файле я использовал import вместо require

import co from 'co';

И попытался запустить его напрямую с помощью nodejs, так как он сказал, что импорт - это «функции доставки» и поддержка без какого-либо флага времени выполнения ( https://nodejs.org/en/docs/es6/ ), но я получил ошибку

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

SyntaxError: Unexpected token import

Тогда я попытался использовать Babel

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

и запустить

babel-node js.js

все еще появляется та же ошибка, неожиданный импорт токена?

Как я мог избавиться от этого?

Jovi
источник
14
@FelixKling: Хотя ответ на связанный вопрос, безусловно, также отвечает на этот вопрос, его трудно воспринимать как дубликат этого вопроса. В любом случае, я был рад получить это здесь, так как Google привел меня прямо сюда, потому что описанная синтаксическая ошибка точно соответствовала тому, что я видел. Я искренне рад, что ОП опубликовал это, а не искал несколько связанный вопрос с ответом, который оказался подходящим.
Скотт Саует
3
npm i --save-dev babel-cli
Исправил
2
Я голосую, чтобы пометить это как дубликат, я чувствую, что это отдельный вопрос.
TWR Коул
3
Это не дубликат. Еще одно решение , которое я хотел бы пост является двойной проверки у вас есть этот плагин в .babelrc: "transform-es2015-modules-commonjs".
Дан Даскалеску
7
Дубликаты (должны быть) в порядке. Это важная часть работы людей. То, что @ScottSauyet говорит, является одной из причин. Разные объяснения с разных точек зрения это другое. Вся эта «двойная охота» кажется мне бесполезной в течение многих лет. Я бы хотел, чтобы это прекратилось.
Стейн де Витт

Ответы:

203

От Babel 6 Примечания к выпуску:

Поскольку Babel стремится быть платформой для инструментов JavaScript, а не транспортера ES2015, мы решили включить все плагины. Это означает, что при установке Babel он больше не будет переносить ваш код ES2015 по умолчанию.

В моей настройке я установил пресет es2015

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

или с пряжей

yarn add babel-preset-es2015 --dev

и включил пресет в моем .babelrc

{
  "presets": ["es2015"]
}
Лоуренс Бортфельд
источник
14
Хороший ответ. К сожалению, вам все еще нужно использовать require () и не можете использовать импорт для пакетов npm.
Джагтеш Чадха
24
Я использую babel-nodeвместе с es2015и reactпресеты. Та же ошибка.
FuzzY
3
Не работает Да, это необходимо, но импорт не работает.
still_dreaming_1
6
Для меня это было просто исправить. Я попал в туннельное зрение, пытаясь адаптировать код из одного проекта «Реакция / Бабель» в другой проект es5 и одновременно обновлять до синтаксиса es6. В моем package.json под скриптами я забыл заменить "запуск узла" на "babel-node run.js". Да, я чувствую себя застенчивым. :)
joezen777
2
Экосистема JS настолько проста
Родриго
51

Пока не реализованы модули, вы можете использовать «транспайлер» Babel для запуска вашего кода:

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

а потом

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

Если вы не хотите печатать, --presets node6вы можете сохранить его .babelrc файл:

{
  "presets": [
    "node6"
  ]
}

См. Https://www.npmjs.com/package/babel-preset-node6 и https://babeljs.io/docs/usage/cli/.

Винсент Мэтью
источник
16
Последняя рекомендация от babel - использовать babel-preset-env, который определяет, какие полифилы использовать, а не babel-preset-node*. В .babelrcиспользовании:{ "presets": [ ["env", { "targets": { "node": "current" } }] ] }
Ронен
После этого я начал получать сообщение об ошибке (нераспознанный токен '<'): 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. Установка пакетов: babel-core, babel-polyfill,babel-preset-es2015
  2. Создать .babelrcс содержанием:{ "presets": ["es2015"] }
  3. Не помещайте importвыписки в ваш основной входной файл, используйте другой файл, например: app.jsи ваш основной входной файл должен быть обязательным, babel-core/registerи babel-polyfillчтобы сначала сделать babel работала отдельно, прежде всего. Тогда вы можете потребовать, app.jsгде importзаявление.

Пример:

index.js

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

app.js

import co from 'co';

Это должно работать с node index.js.

Adiono
источник
1
Это простой обходной путь, который можно использовать для разработки. Хотя для производства вы всегда должны скомпилировать код es5.
Джонас Дротлефф
подождите ... это то, что я думаю? Несколько месяцев назад у меня была мечта, чтобы javascript / perl / любой язык мог быть расширен без обновлений путем дополнительного анализа существующего языка на том же языке. Это то, что здесь происходит ???
Дмитрий
Отличный ответ. Но в сценарии вы можете поместить что-то вроде ниже. Таким образом, вы можете использовать в любом файле. "scripts": {"build": "babel src -d dist", "start": "node dist / index.js"}
gkarthiks
15

babel-preset-es2015 теперь устарела, и вы получите предупреждение, если попытаетесь использовать решение Лоуренса.

Чтобы это работало с Babel 6.24.1+, используйте babel-preset-envвместо этого:

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

Затем добавьте envсвои настройки в ваш .babelrc:

{
  "presets": ["env"]
}

См. Babel Docs для получения дополнительной информации.

кристина
источник
Есть ли способ сделать это с помощью CLI?
19
6

если вы используете предустановку для Reaction-native, он принимает импорт

npm i babel-preset-react-native --save-dev

и поместите его в ваш файл .babelrc

{
  "presets": ["react-native"]
}

в корневой директории вашего проекта

https://www.npmjs.com/package/babel-preset-react-native

JDE-Чил
источник
5

Возможно, вы запускаете некомпилированные файлы. Давайте начнем с чистого листа!

В вашей рабочей директории создайте:

  • Две папки. Один для скомпилированного кода es2015. Другой для вывода Бабель. Мы назовем их "src" и "lib" соответственно.
  • Файл package.json со следующим объектом:

    { 
      "scripts": {
          "transpile-es2015": "babel src -d lib"
      },
      "devDependencies": {
          "babel-cli": "^6.18.0",
          "babel-preset-latest": "^6.16.0"
      }
    }
  • Файл с именем «.babelrc» со следующими инструкциями: {"presets": ["latest"]}

  • Наконец, напишите тестовый код в файл src / index.js. В твоем случае: import co from 'co'.

Через вашу консоль:

  • Установите ваши пакеты: npm install
  • Перенесите ваш исходный каталог в ваш выходной каталог с флагом -d (aka --out-dir), как уже указано в нашем package.json: npm run transpile-es2015
  • Запустите ваш код из выходного каталога! node lib/index.js
MarbinJavier
источник
Не сработало, к сожалению. Unexpected token import,
dipole_moment
1
Убедитесь, что babelкоманда находится в вашем пути поиска. Вот небольшое изменение. 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 "]}
Максим Егоров
5

Текущий метод заключается в использовании:

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

А потом в в .babelrc

{
    "presets": ["env"]
}

Эта установка Поддержка Babel для последней версии JS (ES2015 и выше) Проверьте Babeljs

Не забудьте добавить babel-nodeв свои сценарии внутреннее package.jsonиспользование при запуске файла js следующим образом.

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

Теперь вы можете npm populate yourfile.jsвнутри терминала.

Если вы работаете в Windows и выполняете внутреннюю или внешнюю команду, в которой ошибка не распознана, используйте узел перед сценарием следующим образом

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

затем npm run populate

Исаак Секаматте
источник
3

Вы должны использовать babel-preset-env и nodemon для горячей перезагрузки.

Затем создайте файл .babelrc со следующим содержанием:

{
  "presets": ["env"]
}

Наконец, создайте скрипт в package.json:

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

Или просто используйте этот шаблон:

Boilerplate: node-es6

Прияншу Чаухан
источник
2
  • установить -> "npm i --save-dev babel-cli babel-preset-es2015 babel-preset-stage-0"

далее в файл package.json добавьте в сценарии "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"
}

и создайте файл для babel, в корне ".babelrc"

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

и запустить npm start в терминале

Лиор Бен Йосеф
источник
1

Для решения проблемы выполните следующие действия:

1) Установите CLI и предустановку env

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

2) Создайте файл .babelrc

{
  "presets": ["env"]
}

3) настроить запуск npm в package.json

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

4) затем запустите приложение

$ npm start
KARTHIKEYAN.A
источник
0

Я сделал следующее, чтобы преодолеть проблему (скрипт ex.js)

проблема

$ 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

решение

# 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
источник
0

@jovi все, что вам нужно сделать, это добавить файл .babelrc следующим образом:

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

и установите эти плагины как зависимости от npm.

затем попробуйте babel-node ***. js снова. надеюсь, это поможет вам

高 建德
источник
-4

В вашем приложении вы должны объявить свои require()модули, не используя ключевое слово import:

const app = require("example_dependency");

Затем создайте файл .babelrc:

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

Затем в своем gulpfile обязательно объявите свои require()модули:

var gulp = require("gulp");
anycoloryoulike84
источник