Nhập mã thông báo bất ngờ nhập vào trong Nodejs5 và babel?


192

Trong tập tin js, tôi đã sử dụng nhập thay vì yêu cầu

import co from 'co';

Và đã cố chạy nó trực tiếp bởi nodejs vì nó cho biết nhập là 'tính năng vận chuyển' và hỗ trợ mà không có cờ thời gian chạy ( https://nodejs.org/en/docs/es6/ ), nhưng tôi đã gặp lỗi

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

SyntaxError: Unexpected token import

Sau đó tôi đã cố gắng sử dụng babel

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

và chạy bởi

babel-node js.js

vẫn gặp lỗi tương tự, nhập mã thông báo bất ngờ?

Làm thế nào tôi có thể thoát khỏi nó?


14
@FelixKling: Mặc dù câu trả lời tại câu hỏi được liên kết chắc chắn cũng trả lời câu hỏi này, thật khó để xem câu hỏi này là một bản sao của câu hỏi đó. Trong mọi trường hợp, tôi rất vui khi có cái này ở đây, vì Google đã đưa tôi trực tiếp đến đây vì lỗi cú pháp được mô tả hoàn toàn khớp với những gì tôi thấy. Tôi thực sự vui mừng vì OP đã đăng bài này thay vì tìm kiếm một câu hỏi có liên quan với câu trả lời phù hợp.
Scott Sauyet 18/03/2016

3
npm i --save-dev babel-cli Đã sửa nó cho tôi ...
ChuckJHardy 11/05/2016

2
Tôi bỏ phiếu để đánh dấu đây là một bản sao, tôi cảm thấy đây là một câu hỏi riêng biệt.
TWR Cole

3
Đây không phải là một bản sao. Một giải pháp khác tôi muốn đăng là kiểm tra kỹ xem bạn có plugin này không .babelrc: "transform-es2015-modules-commonjs".
Dan Dascalescu

7
Bản sao là (nên) ok. Đó là một phần quan trọng trong cách con người làm việc. Những gì @ScottSauyet nói là một trong những lý do. Giải thích khác nhau với quan điểm khác nhau là một cách khác. Toàn bộ 'cuộc săn trùng lặp' này cảm thấy rất không có ích với tôi khi là khách truy cập nhiều năm. Tôi ước nó sẽ dừng lại.
Stijn de Witt

Câu trả lời:


202

Từ babel 6 Ghi chú phát hành:

Vì Babel đang tập trung vào việc trở thành một nền tảng cho công cụ JavaScript chứ không phải là bộ chuyển đổi ES2015, chúng tôi đã quyết định thực hiện tất cả các plugin chọn tham gia. Điều này có nghĩa là khi bạn cài đặt Babel, nó sẽ không còn dịch mã ES2015 của bạn theo mặc định.

Trong thiết lập của tôi, tôi đã cài đặt cài đặt sẵn es2015

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

hoặc với sợi

yarn add babel-preset-es2015 --dev

và kích hoạt cài đặt trước trong .babelrc của tôi

{
  "presets": ["es2015"]
}

14
Câu trả lời tốt. Thật không may, bạn vẫn cần sử dụng request () và không thể sử dụng nhập cho các gói npm.
Jagtesh Chadha

24
Tôi sử dụng babel-nodecùng với es2015reactcài đặt trước. Cùng một lỗi.
FuzzY

3
Không có tác dụng. Có, điều đó là cần thiết, nhưng nó không làm cho việc nhập khẩu.
still_dreaming_1

6
Đối với tôi đó là một sửa chữa đơn giản. Tôi đã bị cuốn vào tầm nhìn đường hầm khi cố gắng điều chỉnh mã từ một dự án phản ứng / babel thành một dự án es5 khác và nâng cấp lên cú pháp es6 cùng một lúc. Trong gói.json của tôi theo tập lệnh, tôi đã quên thay thế "nút chạy" bằng "nút babel-nút run.js". Vâng, tôi cảm thấy ngượng ngùng. :)
joezen777

2
Hệ sinh thái JS rất dễ dàng
Rodrigo

51

Cho đến khi các mô-đun được triển khai, bạn có thể sử dụng "bộ chuyển đổi" Babel để chạy mã của mình:

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

và sau đó

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

Nếu bạn không muốn nhập, --presets node6bạn có thể lưu tệp .babelrc bằng cách:

{
  "presets": [
    "node6"
  ]
}

Xem https://www.npmjs.com/package/babel-preset-node6https://babeljs.io/docs/usage/cli/


16
khuyến nghị mới nhất từ ​​những người yêu thích babel là sử dụng babel-preset-env để phát hiện các polyfill nào sẽ chạy, thay vì babel-preset-node*. Đang .babelrcsử dụng:{ "presets": [ ["env", { "targets": { "node": "current" } }] ] }
ronen

Sau đó, tôi bắt đầu gặp lỗi (mã thông báo không được nhận dạng '<'): 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. Cài đặt gói: babel-core, babel-polyfill,babel-preset-es2015
  2. Tạo .babelrcvới nội dung:{ "presets": ["es2015"] }
  3. Không đặt importcâu lệnh trong tệp mục nhập chính của bạn, sử dụng một tệp khác, ví dụ: app.jsvà tệp mục nhập chính của bạn nên được yêu cầu babel-core/registerbabel-polyfillđể babel hoạt động riêng ở vị trí đầu tiên trước bất kỳ điều gì khác. Sau đó, bạn có thể yêu cầu tuyên bố app.jsnơi import.

Thí dụ:

index.js

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

app.js

import co from 'co';

Nó nên hoạt động với node index.js.


1
Đây là một cách giải quyết dễ dàng có thể được sử dụng để phát triển. Mặc dù để sản xuất, bạn nên luôn luôn biên dịch mã es5 của mình.
Jonas Drotleff

chờ đã ... đây có phải là những gì tôi nghĩ không? Một vài tháng trước tôi đã có giấc mơ này rằng javascript / perl / bất kỳ ngôn ngữ nào có thể được mở rộng mà không cần cập nhật bằng cách phân tích thêm tùy chỉnh của ngôn ngữ hiện có trong cùng ngôn ngữ. Đây có phải là những gì đang xảy ra ở đây ???
Dmitry

Câu trả lời tuyệt vời. Nhưng trong các kịch bản, bạn có thể đặt một cái gì đó như dưới đây. Vì vậy, bạn có thể sử dụng trong bất kỳ tập tin. "scripts": {"build": "babel src -d dist", "start": "nút dist / index.js"}
gkarthiks

15

babel-preset-es2015 hiện không được chấp nhận và bạn sẽ nhận được cảnh báo nếu bạn cố gắng sử dụng giải pháp của Laurence.

Để làm việc này với Babel 6.24.1+, hãy sử dụng babel-preset-envthay thế:

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

Sau đó thêm envvào cài đặt trước của bạn trong .babelrc:

{
  "presets": ["env"]
}

Xem tài liệu Babel để biết thêm.


Có cách nào để làm điều này với CLI không?
jcollum


5

Có thể là bạn đang chạy các tệp không được biên dịch. Hãy bắt đầu sạch sẽ!

Trong thư mục công việc của bạn tạo:

  • Hai thư mục. Một cho mã es2015 được biên dịch trước. Cái khác cho đầu ra của babel. Chúng tôi sẽ đặt tên chúng là "src" và "lib" tương ứng.
  • Một tệp pack.json với đối tượng sau:

    { 
      "scripts": {
          "transpile-es2015": "babel src -d lib"
      },
      "devDependencies": {
          "babel-cli": "^6.18.0",
          "babel-preset-latest": "^6.16.0"
      }
    }
  • Một tệp có tên ".babelrc" với các hướng dẫn sau: {"presets": ["latest"]}

  • Cuối cùng, viết mã kiểm tra vào tệp src / index.js của bạn. Trong trường hợp của bạn: import co from 'co'.

Thông qua bảng điều khiển của bạn:

  • Cài đặt gói của bạn: npm install
  • Chuyển thư mục nguồn của bạn sang thư mục đầu ra của bạn với cờ -d (aka --out-dir) như, đã được chỉ định trong gói.json của chúng tôi: npm run transpile-es2015
  • Chạy mã của bạn từ thư mục đầu ra! node lib/index.js

Không làm việc unfortunatley. Unexpected token import.
lưỡng cực_moment

1
Hãy chắc chắn rằng babellệnh nằm trong đường dẫn tìm kiếm của bạn. Đây là một biến thể nhỏ. package.json: {"scripts": {"transpile": "./node_modules/.bin/babel src - env ":" ^ 1.6.0 "}} .babelrc: {" cài đặt trước ": [" env "]}
Maksim Yegorov

5

Phương pháp hiện tại là sử dụng:

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

Và sau đó trong .babelrc

{
    "presets": ["env"]
}

cài đặt này hỗ trợ Babel cho phiên bản mới nhất của js (es2015 trở lên) Kiểm tra babeljs

Đừng quên thêm babel-nodevào tập lệnh của bạn bên trong package.jsonsử dụng khi chạy tệp js của bạn như sau.

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

Bây giờ bạn có thể npm populate yourfile.jsbên trong thiết bị đầu cuối.

Nếu bạn đang chạy windows và chạy lỗi nội bộ hoặc lệnh bên ngoài không được nhận ra, hãy sử dụng nút ở phía trước của tập lệnh như sau

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

Sau đó npm run populate


3

Bạn phải sử dụng babel-preset-envgật đầu để tải lại nóng.

Sau đó tạo tệp .babelrc với nội dung bên dưới:

{
  "presets": ["env"]
}

Cuối cùng, tạo tập lệnh trong gói.json:

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

Hoặc chỉ sử dụng cái nồi này:

Nồi hơi: nút-es6


2
  • cài đặt -> "npm i --save-dev babel-cli babel-preset-es2015 babel-preset-giai đoạn-0"

tiếp theo trong tệp pack.json thêm vào tập lệnh "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"
}

và tạo tập tin cho babel, trong thư mục gốc ".babelrc"

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

và chạy npm start trong terminal


1

Tham gia các bước sau để giải quyết vấn đề:

1) Cài đặt CLI và cài đặt sẵn env

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

2) Tạo tệp .babelrc

{
  "presets": ["env"]
}

3) định cấu hình bắt đầu npm trong pack.json

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

4) sau đó bắt đầu ứng dụng

$ npm start

0

Tôi đã làm như sau để khắc phục sự cố (tập lệnh ex.js)

vấn đề

$ 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

giải pháp

# 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 tất cả những gì bạn cần làm là thêm tệp .babelrc như thế này:

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

và cài đặt các plugin này dưới dạng devdependences với npm.

sau đó thử nút babel ***. js một lần nữa. Hy vọng điều này có thể giúp bạn.


-4

Trong ứng dụng của bạn, bạn phải khai báo các require()mô-đun của mình , không sử dụng từ khóa 'nhập':

const app = require("example_dependency");

Sau đó, tạo tệp .babelrc:

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

Sau đó, trong gulpfile của bạn, hãy chắc chắn khai báo các require()mô-đun của bạn :

var gulp = require("gulp");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.