Bolehkah menggunakan babel-node dalam produksi


87

Saya telah mengembangkan situs menggunakan babel-node dan browserify dengan transformasi babelify, untuk mendukung sintaks ES6.

Saya hanya bertanya-tanya, dapatkah saya menjalankan ini dalam produksi babel-node server daripada node server Opsi lain apa yang saya miliki untuk menjalankan ES6 di node?

Berikut adalah perintah yang saya jalankan untuk membangun dan memulai pengembangan

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

// npm start
babel-node server.js"

Berikut adalah dependensi dev saya

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

Jawaban:


116

Untuk kode sisi klien , Anda melakukan hal yang benar. babelifydan mengirimkannya ke klien.


Untuk kode sisi server , saya hanya akan melakukan build biasa menggunakan babel-cli

Menurut http://babeljs.io/docs/setup/#babel_register , babel-registerini tidak dimaksudkan untuk penggunaan produksi - Hook Requirement terutama disarankan untuk kasus sederhana.

untuk Babel 6+

Mulai Babel 6, tidak ada transformasi yang disertakan secara default. Jadi mari kita mulai dengan menginstal babel-clidan babel-preset-es2015.

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

Tambahkan transformasi ke .babelrcfile Anda - ini adalah modul perst yang kami unduh di atas. Lihat daftar lengkap preset untuk melihat mana yang paling cocok untuk Anda.

{
  "presets": ["es2015"]
}

Tambahkan buildskrip ke package.json. Di bawah srcini adalah file masukan Anda danbuild file output yang diubah

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

Lalu bangunlah!

$ npm run build

Kemudian jalankan kode Anda. Pada titik ini, Anda ingin menjalankan file di filebuild direktori

$ npm start

untuk Babel <= 5, cukup gunakan hook yang dibutuhkan.

require("babel/register");

Semua file selanjutnya yang dibutuhkan oleh node dengan ekstensi .es6 , .es , .jsx dan .js akan diubah oleh Babel. Itu polyfill juga secara otomatis diperlukan.

Anda akan dapat menyimpan file sumber Anda di ES6 tetapi tetap menjalankannya menggunakan node server.js


Menurut komentar Anda, Anda tampaknya mengalami sedikit masalah. Beri perhatian khusus pada bagian yang disorot kuning di atas. File pertama Anda hanya bisa ES5, yang dijalankan oleh node itu sendiri. Semua kebutuhan selanjutnya akan diubah oleh Babel ...

Seperti inilah tampilan penyiapan biasanya

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

nyalakan!

$ node server.js

9
Sebenarnya saya baru saja mencoba ini, memasukkan require("babel/register");server.js saya dan ketika saya menjalankan node server.jssaya mendapatkan kesalahan: Unexpected reserved word: import ... jadi sepertinya tidak berfungsi
svnm

1
@steveniseki, pemutakhiran saya harus mendemonstrasikan cara menyiapkan dan menjalankan semuanya.
Terima kasih

Luar biasa, terima kasih banyak untuk itu, saya benar-benar berasumsi bahwa itu akan terjadi dan mencoba membuat server.js saya semuanya di ES5 tetapi tampaknya tidak berhasil, bagaimanapun solusi ini sebenarnya jauh lebih baik mendorong aplikasi ke app.js , dan itu bekerja dengan sempurna. Terima kasih
svnm

Proyek contoh yang sekarang bekerja dengan cara ini dengan node server.js :) ada di sini jika ada yang tertarik untuk melihat contoh tersebut. Ini adalah contoh menggunakan react router, babel dan alt, yang akan saya gunakan untuk situs nyata.
svnm

4
sementara itu berubah menjadi require ("babel-register"); .. pula saya mendapatkan "Impor token tak terduga" ..
smotru

54

Saya baru saja menulis posting blog tentang topik ini

Dokumentasi CLI Babeljs memperingatkan hal berikut:

babel-node tidak dimaksudkan untuk penggunaan produksi

Anda tidak boleh menggunakan babel-node dalam produksi. Ini tidak perlu berat, dengan penggunaan memori yang tinggi karena cache disimpan dalam memori. Anda juga akan selalu mengalami penalti kinerja startup karena seluruh aplikasi perlu dikompilasi dengan cepat.

Ini adalah contoh bagaimana Anda dapat menyiapkan skrip npm untuk menjalankan aplikasi Anda dengan node alih-alih babel-node.

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

Anda dapat menemukan detail selengkapnya di entri blog


3
Karena Node 4.0 mendukung ES6, apakah kita masih perlu menggunakan babel untuk mengkompilasi kode?
lvarayut

8
@LVarayut Ya, tergantung dari fiturnya, babel masih dibutuhkan di sisi server. Node v4.0.0 tidak mendukung semua fitur ES6 (terutama modul melalui sintaks impor / ekspor). Lihat nodejs.org/en/docs/es6 untuk informasi lebih lanjut tentang topik, atau ketik node --v8-options | grep "dalam proses" di terminal untuk mendapatkan daftar fitur ES6 yang belum diterapkan.
jbmusso

@jbmusso Terima kasih atas penjelasan Anda yang luar biasa :)
lvarayut

14
Babel tidak hanya untuk ES6, tetapi untuk ESNext .. Jadi Babel terus menambahkan fitur-fitur dari ES7 dan yang terbaru segera setelah mereka mendapatkan spesifikasi TC39.
cuadraman

15

Penting untuk mempertimbangkan pro dan kontra penggunaan babel-node dalam produksi.

  • babel-nodememang menambah antara setengah detik hingga satu detik ke biaya awal, pada perangkat keras komoditas. Tetapi jika aplikasi Anda adalah server yang berjalan lama, biaya mulai tersebut tidak akan menjadi masalah.
  • Cobalah untuk mengukur konsumsi memori ekstra. Untuk aplikasi saya misalnya (membaca dan memproses data deret waktu), ukurannya hanya 20MB. Bergantung pada situasi Anda, ini mungkin signifikan atau mungkin tidak.

Di samping itu,

  • menggunakan babel-node secara langsung menyederhanakan pengembangan - Anda tidak memerlukan skrip "build", dan Anda tidak akan memiliki direktori src/ libdan yang terpisahdist
  • jika Anda importdari file lokal, apakah Anda akan mengimpor dari src/myutils, atau dari lib/myutils? Menggunakan babel-nodemenghilangkan masalah itu.

Saya hanya menggunakan Babel untuk dukungan modul. Sekarang V8 baru saja merilis dukungan untuk modul pada 10 Januari 2017. Semoga kita akan melihat dukungan modul di Node di bawah bendera dalam beberapa bulan, menjelaskan alasan saya menggunakan Babel moot.


8

Jawaban @ cuadraman lebih akurat dari @naomik.

Untuk menjawab pertanyaan Anda secara singkat: tidak, babel-nodetidak boleh diminta secara eksplisit oleh Anda. babel-nodeadalah perpustakaan pribadi yang dikonsumsi oleh babel-cli.

Tutorial resmi memiliki semua yang Anda butuhkan untuk bangun dan berjalan di node (bukan sisi browser!): Https://github.com/babel/example-node-server . MEMBACANYA! Saya menemukan begitu banyak tutorial blog menyesatkan yang menggunakan banyak cara, dan menemukan artikel ini yang paling mudah diikuti.

Bonus: bertentangan dengan apa yang dipikirkan banyak orang, semua keajaiban transparan dapat dipasang secara lokal (menggunakan npm install --save-dev babel-cli nodemon babel-preset-es2015 babel-preset-stage-2). Tidak perlu menginstal Babel atau modul pembantu apa pun secara global! Cukup bagus.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.