Sử dụng nút babel trong sản xuất có được không


87

Tôi đã và đang phát triển một trang web bằng cách sử dụng nút babel và duyệt qua biến đổi babelify để hỗ trợ cú pháp ES6.

Tôi chỉ đang tự hỏi, liệu tôi có thể chạy điều này trong sản xuất babel-node server thay vì node server Tôi có những lựa chọn nào khác để chạy ES6 trong nút không?

Đây là các lệnh tôi đang chạy để xây dựng và bắt đầu phát triển

// npm run build
browserify -t [babelify] client.js > public/js/bundle.js",

// npm start
babel-node server.js"

Đây là phụ thuộc nhà phát triển của tôi

"babel": "^4.0.1",
"babelify": "^5.0.3",
"browserify": "^8.0.3"

Câu trả lời:


114

Đối với mã phía máy khách , bạn đang làm đúng. babelifynó và gửi nó cho khách hàng.


Đối với mã phía máy chủ , tôi sẽ chỉ tạo một bản dựng thông thường bằng cách sử dụng babel-cli

Theo http://babeljs.io/docs/setup/#babel_register , babel-registerđược không có nghĩa là để sử dụng sản xuất - Các yêu cầu móc chủ yếu được khuyên dùng cho các trường hợp đơn giản.

cho Babel 6+

Kể từ Babel 6, không có phép biến đổi nào được bao gồm theo mặc định. Vì vậy, hãy bắt đầu bằng cách cài đặt babel-clibabel-preset-es2015.

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

Thêm một chuyển đổi vào .babelrctệp của bạn - đây là mô-đun cá nhân mà chúng tôi đã tải xuống ở trên. Hãy xem danh sách đầy đủ các cài đặt trước để xem (các) cài đặt nào phù hợp nhất với bạn.

{
  "presets": ["es2015"]
}

Thêm một buildtập lệnh vào của bạn package.json. Dưới đây srclà tệp đầu vào của bạn và buildlà tệp đầu ra được chuyển đổi

"scripts": {
  "build": "babel src -d build"
}

Sau đó xây dựng nó!

$ npm run build

Sau đó chạy mã của bạn. Tại thời điểm này, bạn sẽ muốn thực thi các tệp trong buildthư mục của mình

$ npm start

đối với Babel <= 5, chỉ cần sử dụng hook yêu cầu.

require("babel/register");

Tất cả các tệp tiếp theo được yêu cầu bởi nút có phần mở rộng .es6 , .es , .jsx.js sẽ được Babel chuyển đổi. Các polyfill cũng được tự động yêu cầu.

Bạn sẽ có thể giữ các tệp nguồn của mình trong ES6 nhưng vẫn thực thi chúng bằng cách sử dụng node server.js


Theo nhận xét của bạn, bạn có vẻ đang gặp một chút rắc rối. Đặc biệt chú ý đến phần được đánh dấu màu vàng ở trên. Tệp đầu tiên của bạn chỉ có thể là ES5, được chạy bởi chính nút. Tất cả các yêu cầu tiếp theo sẽ được chuyển đổi bởi Babel ...

Đây là thiết lập điển hình có thể trông như thế nào

server.js

// only ES5 is allowed in this file
require("babel/register");

// other babel configuration, if necessary

// load your app
var app = require("./app.js");

app.js

// this file will be loaded through babel
// you can now use ES6 here and in every other include

đốt nó lên!

$ node server.js

9
Thật sự tôi chỉ cố gắng này, đặt require("babel/register");trong server.js của tôi và khi tôi chạy node server.jstôi nhận được lỗi: Unexpected reserved word: import ... vì thế nó không có vẻ để làm việc
svnm

1
@steveniseki Bản cập nhật của tôi sẽ trình bày cách bắt đầu và chạy mọi thứ.
Cảm ơn bạn

Tuyệt vời, cảm ơn rất nhiều vì điều đó, tôi thực sự cho rằng sẽ đúng như vậy và đã thử tạo server.js của mình tất cả trong ES5 nhưng nó có vẻ không hoạt động, dù sao thì giải pháp này thực sự tốt hơn nhiều khi đẩy ứng dụng lên app.js , và nó hoạt động hoàn hảo. Cảm ơn
svnm

Dự án ví dụ hiện hoạt động theo kiểu này với node server.js :) có ở đây nếu ai quan tâm có thể xem ví dụ. Đó là một ví dụ sử dụng bộ định tuyến phản ứng, babel và alt, mà tôi sẽ sử dụng cho một trang web thực.
svnm

4
trong khi đó nó đã thay đổi thành request ("babel-register"); .. dù sao thì tôi vẫn nhận được "Nhập mã thông báo không mong muốn" ..
smotru

54

Tôi vừa viết một bài blog về chủ đề này

Tài liệu Babeljs CLI cảnh báo những điều sau:

nút babel không dành cho mục đích sản xuất

Bạn không nên sử dụng nút babel trong sản xuất. Nó nặng không cần thiết, sử dụng bộ nhớ cao do bộ nhớ đệm được lưu trong bộ nhớ. Bạn cũng sẽ luôn gặp phải hình phạt về hiệu suất khởi động vì toàn bộ ứng dụng cần được biên dịch nhanh chóng.

Đây là một ví dụ về cách bạn có thể thiết lập các tập lệnh npm để chạy ứng dụng của mình với nút thay vì nút babel.

"scripts": {
  "clean": "rm -rf build && mkdir build",
  "build-css": "node-sass scss/app.scss public/css/app.css",
  "build-server": "babel -d ./build ./server -s",
  "build": "npm run clean && npm run build-css && npm run build-server",
  "lint": "eslint source/ --quiet",
  "start": "node ./build/index.js",
  "debug": "node --debug ./build/index.js",
  "test": "for i in $(ls tests/); do babel-node \"./tests/${i}\" | faucet ; done",
  "validate": "npm run lint; npm run test && npm outdated --depth 0"
},

Bạn có thể tìm thêm chi tiết trên bài đăng trên blog


3
Vì Node 4.0 hỗ trợ ES6, chúng ta có cần sử dụng babel để biên dịch mã không?
lvarayut

8
@LVarayut Có, tùy thuộc vào các tính năng, babel vẫn cần phía máy chủ. Node v4.0.0 không hỗ trợ tất cả các tính năng của ES6 (đặc biệt là các mô-đun thông qua cú pháp nhập / xuất). Xem nodejs.org/en/docs/es6 để biết thêm thông tin về chủ đề này hoặc nhập node --v8-options | grep "đang xử lý" trong một thiết bị đầu cuối để nhận danh sách các tính năng ES6 chưa được triển khai.
jbmusso

@jbmusso Cảm ơn vì lời giải thích tuyệt vời của bạn :)
lvarayut

14
Babel không chỉ dành cho ES6, mà còn dành cho ESNext .. Vì vậy, nó liên tục bổ sung các tính năng từ ES7 và mới nhất ngay sau khi chúng được giải quyết trong thông số kỹ thuật TC39.
cuadraman,

15

Điều quan trọng là phải cân nhắc những ưu và nhược điểm của việc sử dụng babel-node trong sản xuất.

  • babel-nodetính thêm từ nửa giây đến một giây vào chi phí khởi động, trên phần cứng hàng hóa. Nhưng nếu ứng dụng của bạn là một máy chủ hoạt động lâu dài, chi phí khởi động đó sẽ không thành vấn đề.
  • Cố gắng đo mức tiêu thụ bộ nhớ thêm. Ví dụ: đối với ứng dụng của tôi (đọc và xử lý dữ liệu chuỗi thời gian), nó chỉ là 20MB. Tùy thuộc vào tình hình của bạn, điều này có thể đáng kể hoặc không.

Mặt khác,

  • sử dụng babel-node trực tiếp đơn giản hóa việc phát triển - bạn sẽ không cần các tập lệnh "xây dựng" và bạn sẽ không có các thư mục src/ libvà riêng biệtdist
  • nếu bạn importtừ các tệp cục bộ, bạn sẽ nhập từ src/myutilshay từ lib/myutils? Sử dụng babel-nodeloại bỏ vấn đề đó.

Tôi chỉ sử dụng Babel để hỗ trợ mô-đun. Bây giờ V8 vừa phát hành hỗ trợ cho các mô-đun vào ngày 10 tháng 1 năm 2017. Hy vọng rằng chúng ta sẽ thấy các mô-đun hỗ trợ trong Node dưới một lá cờ trong vài tháng nữa, cho thấy lý do của tôi để sử dụng Babel moot.


8

Câu trả lời của @ cuadraman chính xác hơn @naomik.

Để trả lời câu hỏi của bạn một cách ngắn gọn: không, babel-nodebạn không nên gọi một cách rõ ràng. babel-nodelà một thư viện tư nhân được sử dụng bởi babel-cli.

Hướng dẫn chính thức có mọi thứ bạn cần để thiết lập và chạy trên nút (không phải phía trình duyệt!): Https://github.com/babel/example-node-server . ĐỌC NÓ! Tôi đã tìm thấy rất nhiều hướng dẫn trên blog sai lầm sử dụng vòng vo về các cách, và thấy bài viết này dễ làm theo nhất.

Phần thưởng: trái với những gì nhiều người nghĩ, tất cả ma thuật chuyển đổi đều có thể được cài đặt cục bộ (sử dụng npm install --save-dev babel-cli nodemon babel-preset-es2015 babel-preset-stage-2). Không cần cài đặt Babel hoặc bất kỳ mô-đun trợ giúp nào của nó trên toàn cầu! Khá tiện lợi.

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.