Üretimde babel-node kullanmak doğru mu


87

ES6 sözdizimini desteklemek için babel-node ve babelify dönüşümü ile browsererify kullanan bir site geliştiriyorum.

Merak ediyorum, ES6'yı düğümde çalıştırmak için başka hangi seçeneklere sahip olmak babel-node server yerine node server bunu üretimde çalıştırabilir miyim?

İşte derlemek ve geliştirmeye başlamak için çalıştırdığım komutlar

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

// npm start
babel-node server.js"

İşte geliştirici bağımlılıklarım

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

Yanıtlar:


116

Müşteri tarafı kodu için doğru olanı yapıyorsunuz. babelifymüşteriye gönderin.


Sunucu tarafı kodu için babel-cli kullanarak normal bir derleme yapardım

Göre http://babeljs.io/docs/setup/#babel_register , babel-registerbir üretim kullanıma yönelik değildir - kanca öncelikle basit durumlarda kullanılması önerilir gerektirir.

Babel 6+ için

Babel 6'dan itibaren, varsayılan olarak hiçbir dönüşüm dahil edilmemiştir. Öyleyse babel-clive kurarak başlayalım babel-preset-es2015.

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

.babelrcDosyanıza bir dönüşüm ekleyin - bu yukarıda indirdiğimiz perst modüldür. Sizin için en uygun olanı görmek için ön ayarların tam listesine bir göz atın .

{
  "presets": ["es2015"]
}

Dosyanıza bir buildkomut dosyası ekleyin package.json. Aşağıda srcgirdi dosyalarınız ve builddönüştürülmüş çıktı dosyaları var

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

O zaman inşa edin!

$ npm run build

Ardından kodunuzu çalıştırın. Bu noktada, builddizininizdeki dosyaları yürütmek isteyeceksiniz

$ npm start

Babel <= 5 için, sadece gerekli kancayı kullanın.

require("babel/register");

.Es6 , .es , .jsx ve .js uzantılarına sahip düğümün gerektirdiği sonraki tüm dosyalar Babel tarafından dönüştürülecektir. Polyfill da otomatik gereklidir.

Kaynak dosyalarınızı ES6'da tutabilecek, ancak yine de bunları kullanarak çalıştırabileceksiniz. node server.js


Yorumlarınıza göre biraz sorun yaşıyor gibisiniz. Yukarıdaki sarıyla vurgulanan kısma özellikle dikkat edin. İlk dosyanız yalnızca düğümün kendisi tarafından çalıştırılan ES5 olabilir. HerşeySonraki Babel tarafından dönüştürülecek ...

İşte tipik bir kurulum nasıl görünebilir

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

ateşle!

$ node server.js

9
Aslında bunu biraz önce denedim, require("babel/register");server.js'mi koydum ve çalıştırdığımda node server.jshatayı alıyorum: Unexpected reserved word: import ... bu yüzden işe yaramadı
svnm

1
@steveniseki güncellemem, işleri nasıl çalıştıracağımı göstermeli.
Teşekkürler

Harika, bunun için çok teşekkürler, aslında durumun böyle olacağını varsaydım ve server.js'mi ES5'te yapmayı denedim ama işe yaramadı, neyse bu çözüm aslında uygulamayı bir app.js'ye itmek için çok daha güzel ve mükemmel çalıştı. Teşekkürler
svnm

Şimdi node server.js :) ile bu şekilde çalışan örnek proje , örneği görmek isteyen varsa buradadır . Gerçek bir site için kullanacağım react router, babel ve alt kullanımına bir örnek.
svnm

4
bu arada gerekli ("babel-register") olarak değiştirildi; .. her neyse "Beklenmeyen jeton içe aktarımı"
alıyorum

54

Bu konuyla ilgili bir blog yazısı yazdım

Babeljs CLI belgeleri şu konularda uyarıda bulunur:

babel-node, üretim kullanımı için tasarlanmamıştır

Üretimde babel-node kullanmamalısınız. Önbelleğin bellekte saklanması nedeniyle yüksek bellek kullanımıyla gereksiz yere ağırdır. Ayrıca, tüm uygulamanın anında derlenmesi gerektiğinden her zaman bir başlangıç ​​performansı cezası yaşayacaksınız.

Bu, uygulamanızı babel-node yerine node ile çalıştırmak için npm komut dosyalarını nasıl kurabileceğinize bir örnektir.

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

Blog gönderisinde daha fazla ayrıntı bulabilirsiniz


3
Node 4.0 ES6'yı desteklediğine göre, kodu derlemek için babel kullanmamız gerekiyor mu?
lvarayut

8
@LVarayut Evet, özelliklere bağlı olarak babel hala sunucu tarafında gereklidir. Node v4.0.0, tüm ES6 özelliklerini desteklemez (özellikle içe / dışa aktarma sözdizimi aracılığıyla modüller). Konu hakkında daha fazla bilgi için nodejs.org/en/docs/es6 adresine bakın veya node --v8-options yazın | grep henüz uygulanmamış ES6 özelliklerinin bir listesini almak için bir terminalde "devam ediyor".
jbmusso

@jbmusso Harika açıklamanız için teşekkürler :)
lvarayut

14
Babel sadece ES6 için değil, ESNext için de geçerli. Bu nedenle, ES7'den gelen özellikleri ve TC39 spesifikasyonuna yerleşir yerleşmez en son özellikleri sürekli olarak ekler.
cuadraman

15

Üretimde babel-node kullanmanın artılarını ve eksilerini tartmak önemlidir.

  • babel-nodeemtia donanımında başlangıç ​​maliyetine yarım saniye ila bir saniye ekler. Ancak uygulamanız uzun süredir çalışan bir sunucuysa, bu başlangıç ​​maliyeti çok da önemli olmayacaktır.
  • Ekstra bellek tüketimini ölçmeye çalışın. Örneğin uygulamam için (zaman serisi verilerini okuma ve işleme), yalnızca 20MB idi. Durumunuza bağlı olarak, bu önemli olabilir veya olmayabilir.

Diğer yandan,

  • babel-node'u kullanmak doğrudan geliştirmeyi basitleştirir - "derleme" komut dosyalarına ihtiyacınız olmaz ve ayrı src/ libve distdizinlere sahip olmazsınız
  • eğer importyerel dosyalarından, aralarından ithal edecek src/myutils, ya da gelen lib/myutils? Kullanmak babel-nodebu sorunu ortadan kaldırır.

Babel'i sadece modül desteği için kullanıyorum. Şimdi V8 , 10 Ocak 2017'de modüller için destek yayınladı . Umarım, birkaç ay içinde Node'da modüller desteğini bir bayrak altında göreceğiz, bu da Babel moot'u kullanma nedenimi açıklıyor.


8

@ cuadraman'ın cevabı @naomik'ten daha doğru.

Sorunuzu kısaca cevaplamak için: hayır, babel-nodesizin tarafınızdan açıkça çağrılmamalıdır. babel-nodetarafından tüketilen özel bir kütüphanedir babel-cli.

Resmi eğitim, düğümde çalışmaya başlamak için ihtiyacınız olan her şeyi içerir (tarayıcı tarafında değil!): Https://github.com/babel/example-node-server . OKU ONU! Yollarla ilgili çok sayıda yanıltıcı blog öğreticisi buldum ve bu makaleyi takip etmesi en kolay olanı buldum.

Bonus: Birçok insanın düşündüğünün aksine, tüm aktarım sihri yerel olarak kurulabilir (kullanılarak npm install --save-dev babel-cli nodemon babel-preset-es2015 babel-preset-stage-2). Babel'i veya yardımcı modüllerinden herhangi birini global olarak kurmanıza gerek yok! Oldukça şık.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.