“Impor token yang tak terduga” di Nodejs5 dan babel?

192

Dalam file js, saya menggunakan impor bukannya membutuhkan

import co from 'co';

Dan mencoba menjalankannya secara langsung oleh nodejs karena dikatakan impor adalah 'fitur pengiriman' dan dukungan tanpa tanda runtime ( https://nodejs.org/en/docs/es6/ ), tetapi saya mendapat kesalahan

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

SyntaxError: Unexpected token import

Kemudian saya mencoba menggunakan babel

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

dan dijalankan oleh

babel-node js.js

masih mendapat kesalahan yang sama, impor token yang tidak terduga?

Bagaimana saya bisa menyingkirkannya?

periang
sumber
14
@ Feliksling: Meskipun jawaban pada pertanyaan yang ditautkan juga menjawab pertanyaan ini, sulit untuk melihat pertanyaan ini sebagai duplikat dari pertanyaan itu. Bagaimanapun, saya senang memiliki yang satu ini di sini, karena Google membawa saya langsung ke sini karena kesalahan sintaks yang dijelaskan persis sesuai dengan apa yang saya lihat. Saya jujur ​​senang bahwa OP memposting ini daripada mencari pertanyaan yang agak terkait dengan jawaban yang cocok.
Scott Sauyet
3
npm i --save-dev babel-cli Memperbaikinya untuk saya ...
ChuckJHardy
2
Saya memilih untuk menghapus tanda ini sebagai duplikat, saya merasa ini adalah pertanyaan terpisah.
TWR Cole
3
Ini bukan duplikat. Salah satu solusi lain saya ingin posting adalah untuk periksa Anda memiliki plugin ini di .babelrc: "transform-es2015-modules-commonjs".
Dan Dascalescu
7
Duplikat (harus) ok. Ini adalah bagian penting dari cara manusia bekerja. Apa yang dikatakan @ScottSauyet adalah salah satu alasannya. Penjelasan berbeda dengan perspektif berbeda adalah yang lain. Seluruh 'perburuan duplikat' ini terasa sangat tidak membantu bagi saya sebagai pengunjung biasa selama bertahun-tahun. Saya berharap itu akan berhenti.
Stijn de Witt

Jawaban:

202

Dari catatan rilis Babel 6:

Karena Babel berfokus untuk menjadi platform untuk tooling JavaScript dan bukan transpiler ES2015, kami telah memutuskan untuk membuat semua plugin ikut serta. Ini berarti ketika Anda menginstal Babel, kode ES2015 Anda tidak akan lagi transparan.

Dalam pengaturan saya, saya menginstal preset es2015

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

atau dengan benang

yarn add babel-preset-es2015 --dev

dan mengaktifkan preset di .babelrc saya

{
  "presets": ["es2015"]
}
Laurence Bortfeld
sumber
14
Jawaban yang bagus. Sayangnya, Anda masih perlu menggunakan require () dan tidak dapat menggunakan impor untuk paket npm.
Jagtesh Chadha
24
Saya menggunakan babel-nodebersama dengan es2015dan reactpreset. Kesalahan yang sama.
FuzzY
3
Tidak berfungsi Ya itu diperlukan, tetapi itu tidak membuat impor berfungsi.
still_dreaming_1
6
Bagi saya itu adalah perbaikan sederhana. Saya terperangkap dalam visi terowongan mencoba mengadaptasi kode dari satu proyek reaksi / babel ke proyek es5 lain dan memutakhirkan ke sintaksis ES6 pada saat yang sama. Dalam script package.json saya, saya lupa mengganti "node run" dengan "babel-node run.js". Ya, saya merasa malu. :)
joezen777
2
Ekosistem JS sangat mudah
Rodrigo
51

Sampai modul diimplementasikan, Anda dapat menggunakan Babel "transpiler" untuk menjalankan kode Anda:

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

lalu

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

Jika Anda tidak ingin mengetik, --presets node6Anda dapat menyimpan file .babelrc dengan:

{
  "presets": [
    "node6"
  ]
}

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

vincent mathew
sumber
16
rekomendasi terbaru dari orang-orang babel adalah menggunakan babel-preset-env yang mendeteksi polyfill mana yang harus dijalankan, bukan babel-preset-node*. Sedang .babelrcdigunakan:{ "presets": [ ["env", { "targets": { "node": "current" } }] ] }
ronen
Setelah ini saya mulai mendapatkan kesalahan (token yang tidak dikenal '<'): 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. Install paket: babel-core, babel-polyfill,babel-preset-es2015
  2. Buat .babelrcdengan konten:{ "presets": ["es2015"] }
  3. Jangan meletakkan importpernyataan dalam file entri utama Anda, gunakan file lain misalnya: app.jsdan file entri utama Anda harus diminta babel-core/registerdan babel-polyfillagar babel berfungsi secara terpisah di tempat pertama sebelum yang lainnya. Maka Anda bisa meminta pernyataan di app.jsmana import.

Contoh:

index.js

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

app.js

import co from 'co';

Itu harus bekerja dengan node index.js.

Adiono
sumber
1
Ini adalah solusi mudah yang dapat digunakan untuk pengembangan. Meskipun untuk produksi Anda harus selalu mengkompilasi kode es5 Anda.
Jonas Drotleff
tunggu ... apa ini yang kupikirkan? beberapa bulan yang lalu saya bermimpi bahwa javascript / perl / bahasa apa pun dapat diperpanjang tanpa pembaruan oleh penguraian tambahan khusus dari bahasa yang ada dalam bahasa yang sama. Apakah ini yang terjadi di sini ???
Dmitry
Jawaban yang sangat bagus. Tetapi dalam skrip, Anda dapat meletakkan sesuatu seperti di bawah ini. Jadi Anda bisa menggunakan file apa saja. "script": {"build": "babel src -d dist", "start": "node dist / index.js"}
gkarthiks
15

babel-preset-es2015 sekarang sudah usang dan Anda akan mendapatkan peringatan jika Anda mencoba menggunakan solusi Laurence.

Untuk mengaktifkan ini dengan Babel 6.24.1+, gunakan babel-preset-envsebagai berikut:

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

Kemudian tambahkan envke preset Anda di .babelrc:

{
  "presets": ["env"]
}

Lihat dokumen Babel untuk info lebih lanjut.

kristina
sumber
Apakah ada cara untuk melakukan ini dengan CLI?
jcollum
5

Mungkin Anda menjalankan file yang tidak dikompilasi. Ayo mulai bersih!

Di direktori kerja Anda, buat:

  • Dua folder. Satu untuk kode es2015 yang telah dikompilasi. Yang lain untuk output babel. Kami akan menamai mereka masing-masing "src" dan "lib".
  • File package.json dengan objek berikut:

    { 
      "scripts": {
          "transpile-es2015": "babel src -d lib"
      },
      "devDependencies": {
          "babel-cli": "^6.18.0",
          "babel-preset-latest": "^6.16.0"
      }
    }
  • File bernama ".babelrc" dengan instruksi berikut: {"presets": ["latest"]}

  • Terakhir, tulis kode uji dalam file src / index.js Anda. Dalam kasus Anda: import co from 'co'.

Melalui konsol Anda:

  • Instal paket Anda: npm install
  • Transpile direktori sumber Anda ke direktori output Anda dengan flag -d (alias --out-dir) seperti yang sudah ditentukan dalam package.json kami: npm run transpile-es2015
  • Jalankan kode Anda dari direktori keluaran! node lib/index.js
MarbinJavier
sumber
Tidak berhasil unfortunatley. Unexpected token import.
dipole_moment
1
Pastikan babelperintah ada di jalur pencarian Anda. Berikut sedikit variasi. package.json: {"script": {"transpile": "./node_modules/.bin/babel src -d lib"}, "devDependencies": {"babel-cli": "^ 6.24.1", "babel-preset- env ":" ^ 1.6.0 "}} .babelrc: {" preset ": [" env "]}
Maksim Yegorov
5

Metode saat ini adalah menggunakan:

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

Dan kemudian masuk .babelrc

{
    "presets": ["env"]
}

ini instal dukungan Babel untuk versi terbaru js (es2015 dan lebih tinggi) Lihatlah babeljs

Jangan lupa untuk menambahkan babel-nodeskrip Anda dalam package.jsonpenggunaan saat menjalankan file js Anda sebagai berikut.

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

Sekarang Anda bisa npm populate yourfile.jsberada di dalam terminal.

Jika Anda menjalankan windows dan menjalankan perintah kesalahan internal atau eksternal yang tidak dikenali, gunakan node infront script sebagai berikut

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

Kemudian npm run populate

Isaac Sekamatte
sumber
3

Anda harus menggunakan babel-preset-env dan nodemon untuk hot-reload.

Kemudian buat file .babelrc dengan konten di bawah ini:

{
  "presets": ["env"]
}

Akhirnya, buat skrip di package.json:

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

Atau cukup gunakan boilerplate ini:

Boilerplate: node-es6

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

selanjutnya di file package.json tambahkan skrip "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"
}

dan buat file untuk babel, di root ".babelrc"

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

dan jalankan mulai npm di terminal

lior ben yosef
sumber
1

Libatkan langkah-langkah berikut untuk menyelesaikan masalah:

1) Instal CLI dan pengaturan awal

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

2) Buat file .babelrc

{
  "presets": ["env"]
}

3) konfigurasikan npm mulai di package.json

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

4) kemudian mulai aplikasi

$ npm start
KARTHIKEYAN.A
sumber
0

Saya telah melakukan yang berikut untuk mengatasi masalah (skrip ex.js)

masalah

$ 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

larutan

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

@ joovi yang perlu Anda lakukan adalah menambahkan file .babelrc seperti ini:

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

dan instal plugin ini sebagai dependensi dengan npm.

lalu coba babel-node ***. js lagi. Semoga ini bisa membantu Anda.

高 建德
sumber
-4

Di aplikasi Anda, Anda harus mendeklarasikan require()modul Anda , tidak menggunakan kata kunci 'impor':

const app = require("example_dependency");

Kemudian, buat file .babelrc:

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

Kemudian, di gulpfile Anda, pastikan untuk mendeklarasikan require()modul Anda :

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