"Несподіваний імпорт маркера" в Nodejs5 та babel?


192

У js-файлі я використовував імпорт, а не вимагати

import co from 'co';

І спробував запустити його безпосередньо nodejs, оскільки він сказав, що імпорт - це "функції доставки" та підтримка без будь-якого прапора виконання ( https://nodejs.org/en/docs/es6/ ), але я отримав помилку

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

SyntaxError: Unexpected token import

Тоді я спробував використати вавило

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

все-таки виникла така ж помилка, несподіваний імпорт маркера?

Як я міг її позбутися?


14
@FelixKling: Хоча відповідь на пов'язане питання, безумовно, також відповідає на це питання, важко розглянути це питання як дублікат цього. У будь-якому випадку, я був радий, що це є тут, оскільки Google привів мене сюди безпосередньо, оскільки описана синтаксична помилка точно відповідала тому, що я бачив. Я чесно радий, що ОП розмістила це питання, а не шукала дещо пов’язане питання з відповіддю, яке, можливо, підходить.
Скотт Сойет

3
npm i --save-dev babel-cli Виправлено це для мене ...
ChuckJHardy

2
Я голосую, щоб відмітити це як дублікат, я вважаю, що це окреме питання.
TWR Коул

3
Це не дублікат. Ще одне рішення , яке я хотів би пост є подвійної перевірки у вас є цей плагін в .babelrc: "transform-es2015-modules-commonjs".
Дан Даскалеску

7
Дублікати (повинні бути) добре. Це важлива частина того, як працюють люди. Те, що говорить @ScottSauyet, є однією з причин. Різні пояснення з різними перспективами - це інше. Весь цей «дубльований полювання» роками мені як постійному відвідувачеві дуже непомітний. Я б хотів, щоб це припинилося.
Штійн де Вітт

Відповіді:


203

Від дівочої 6 Примітки до випуску:

Оскільки Babel зосереджує свою увагу на тому, щоб бути платформою для інструментів JavaScript, а не для транспілятора ES2015, ми вирішили включити всі плагіни. Це означає, що при встановленні Babel він за замовчуванням більше не перетворює ваш код ES2015.

У моїй установці я встановив попередньо встановлений es2015

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

або з пряжею

yarn add babel-preset-es2015 --dev

і ввімкнув попередньо встановлений в моєму .babelrc

{
  "presets": ["es2015"]
}

14
Хороша відповідь. На жаль, вам все одно потрібно використовувати requ () і не можна використовувати імпорт для npm-пакетів.
Jagtesh Chadha

24
Я використовую babel-nodeразом із es2015та reactпопередньо встановлені налаштування. Та сама помилка.
FuzzY

3
Не працює. Так, це потрібно, але це не змушує працювати над імпортом.
still_dreaming_1

6
Для мене це було просте виправлення. Мене спіймало бачення тунелю, намагаючись адаптувати код з одного проекту react / babel в інший проект es5 та одночасно перейти на синтаксис es6. У своєму пакет.json під сценаріями я забув замінити "запуск вузла" на "babel-node run.js". Так, я відчуваю вівчарство. :)
joezen777

2
Екосистема JS така проста
Родріго

51

До тих пір, поки модулі не будуть реалізовані, ви можете використовувати Bapilov "транспілер" для запуску свого коду:

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-preset-env, який виявляє, які поліфіли виконувати, а не babel-preset-node*. У .babelrcкористуванні:{ "presets": [ ["env", { "targets": { "node": "current" } }] ] }
ronen

Після цього я почав отримувати помилку (нерозпізнаний маркер '<'): 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також зробити так, щоб бабеля працювали окремо, в першу чергу, перш ніж щось інше. Тоді ви можете вимагати, app.jsде importзаява.

Приклад:

index.js

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

app.js

import co from 'co';

З ним слід працювати node index.js.


1
Це просте вирішення, яке можна використовувати для розвитку. Хоча для виробництва ви завжди повинні компілювати свій es5-код.
Jonas Drotleff

зачекайте ... це я думаю, що це? кілька місяців тому я мріяв, що JavaScript / perl / будь-яку мову можна розширити без оновлень шляхом спеціального додаткового розбору існуючої мови на тій же мові. Це що тут відбувається ???
Дмитро

Відмінна відповідь. Але в сценарії ви можете помістити щось на зразок нижче. Таким чином, ви можете використовувати в будь-якому файлі. "script": {"build": "babel src -d dist", "start": "вузол 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 .


Чи є спосіб це зробити з CLI?
jcollum

6

якщо ви використовуєте попередньо встановлену функцію для react-native, вона приймає імпорт

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

і помістіть його у свій файл .babelrc

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

у вашому кореневому каталозі проекту

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


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 (він же --out-dir), як уже вказано в нашому пакеті.json: npm run transpile-es2015
  • Запустіть свій код з вихідного каталогу! node lib/index.js

Не спрацювало нещастя. Unexpected token import.
dipole_moment

1
Переконайтеся, що babelкоманда знаходиться у вашому шляху пошуку. Ось невелика різниця. package.json: {"scriptpts": {"transpile": "./node_modules/.bin/babel src -d lib"}, "devDependitions": {"babel-cli": "^ 6.24.1", "babel-preset- env ":" ^ 1.6.0 "}} .babelrc: {" пресети ": [" 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 всередині терміналу.

Якщо у вас запущені вікна та запущена внутрішня чи зовнішня команда помилок не розпізнана, використовуйте вузол перед скриптом, як описано нижче

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"
  }

Або просто скористайтеся цією плитою:

Котельня: node-es6


2
  • install -> "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 start у package.json

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

4) потім запустіть додаток

$ npm start

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

0

@jovi все, що вам потрібно зробити, - це додати .babelrc файл таким чином:

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

і встановіть ці плагіни як залежність від npm.

потім спробуйте babel-вузол ***. js ще раз. сподіваюся, що це може вам допомогти.


-4

У своєму додатку ви повинні оголосити свої require()модулі, не використовуючи ключове слово "імпорт":

const app = require("example_dependency");

Потім створіть файл .babelrc:

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

Потім у своєму gulpfile обов'язково оголосіть свої require()модулі:

var gulp = require("gulp");
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.