Czy można używać węzła babel w produkcji?

87

Pracowałem nad witryną wykorzystującą węzeł babel i przeglądarkę z transformacją babelify, aby obsługiwać składnię ES6.

Zastanawiam się tylko, czy mogę uruchomić to w środowisku produkcyjnym, babel-node server a nie node server Jakie inne opcje mam, aby uruchomić ES6 w węźle?

Oto polecenia, które uruchamiam w celu kompilacji i rozpoczęcia programowania

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

// npm start
babel-node server.js"

Oto moje zależności dev

"babel": "^4.0.1",
"babelify": "^5.0.3",
"browserify": "^8.0.3"
svnm
źródło

Odpowiedzi:

114

W przypadku kodu po stronie klienta robisz właściwą rzecz. babelifyi wyślij do klienta.


W przypadku kodu po stronie serwera po prostu zrobiłbym zwykłą kompilację przy użyciu babel-cli

Według http://babeljs.io/docs/setup/#babel_register , niebabel-register jest przeznaczony do użytku produkcyjnego - Wymagany hak jest zalecany przede wszystkim w prostych przypadkach.

dla Babel 6+

Od wersji Babel 6 żadne transformacje nie są domyślnie uwzględniane. Zacznijmy więc od zainstalowania babel-clii babel-preset-es2015.

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

Dodaj transformację do swojego .babelrcpliku - to jest moduł końcowy, który pobraliśmy powyżej. Zapoznaj się z pełną listą ustawień wstępnych, aby zobaczyć, które z nich najlepiej Ci odpowiadają.

{
  "presets": ["es2015"]
}

Dodaj buildskrypt do swojego package.json. Poniżej srcznajdują się pliki wejściowe i buildprzekształcone pliki wyjściowe

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

Następnie zbuduj to!

$ npm run build

Następnie uruchom kod. W tym momencie będziesz chciał wykonywać pliki w swoim buildkatalogu

$ npm start

dla Babel <= 5, po prostu użyj haka require.

require("babel/register");

Wszystkie kolejne pliki wymagane przez węzeł z rozszerzeniami .es6 , .es , .jsx i .js zostaną przekształcone przez Babel. Polyfill jest również automatycznie wymagane.

Będziesz mógł zachować swoje pliki źródłowe w ES6, ale nadal wykonywać je za pomocą node server.js


Z twoich komentarzy wynika, że ​​masz małe kłopoty. Zwróć szczególną uwagę na zaznaczoną na żółto część powyżej. Pierwszym plikiem może być tylko plik ES5, który jest uruchamiany przez sam węzeł. Wszystkie kolejne wymagania zostaną przekształcone przez Babel ...

Oto, jak może wyglądać typowa konfiguracja

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

odpal to!

$ node server.js
Dziękuję Ci
źródło
9
Właściwie właśnie to wypróbowałem, umieszczając require("babel/register");node server.jsUnexpected reserved word: import ...
plik server.js,
1
@steveniseki, moja aktualizacja powinna pokazywać, jak wszystko działa.
Dziękuję
Niesamowite, wielkie dzięki za to, tak naprawdę założyłem, że tak będzie i próbowałem zrobić mój server.js w ES5, ale to nie zadziałało, tak czy owak to rozwiązanie jest o wiele przyjemniejsze, przenosząc aplikację do app.js i działało idealnie. Dzięki
svnm
Przykładowy projekt, który teraz działa w ten sposób z node server.js :) jest tutaj, jeśli ktoś jest zainteresowany, aby zobaczyć przykład. Jest to przykład z użyciem routera reakcji, babel i alt, którego będę używał w prawdziwej witrynie.
svnm
4
w międzyczasie zmienił się na require ("babel-register"); .. w każdym razie otrzymuję komunikat „Nieoczekiwany import tokena” ..
smotru
54

Właśnie napisałem wpis na blogu na ten temat

Dokumentacja Babeljs CLI ostrzega, co następuje:

węzeł babel nie jest przeznaczony do użytku produkcyjnego

Nie powinieneś używać węzła babel w produkcji. Jest niepotrzebnie ciężki, z dużym zużyciem pamięci ze względu na pamięć podręczną przechowywaną w pamięci. Zawsze będziesz również doświadczać spadku wydajności podczas uruchamiania, ponieważ cała aplikacja musi zostać skompilowana w locie.

To jest przykład, jak można skonfigurować skrypty npm do uruchamiania aplikacji z węzłem zamiast węzła 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"
},

Więcej szczegółów znajdziesz w poście na blogu

cuadraman
źródło
3
Skoro Node 4.0 obsługuje ES6, czy nadal musimy używać babel do kompilowania kodu?
lvarayut
8
@LVarayut Tak, w zależności od funkcji, babel jest nadal potrzebny po stronie serwera. Węzeł 4.0.0 nie obsługuje wszystkich funkcji ES6 (zwłaszcza modułów za pośrednictwem składni importu / eksportu). Aby uzyskać więcej informacji na ten temat, zobacz nodejs.org/en/docs/es6 lub wpisz node --v8-options | grep „w toku” w terminalu, aby uzyskać listę jeszcze nie zaimplementowanych funkcji ES6.
jbmusso
@jbmusso Dzięki za wspaniałe wyjaśnienie :)
lvarayut
14
Babel jest przeznaczony nie tylko dla ES6, ale także dla ESNext. Dlatego w sposób ciągły dodaje funkcje z ES7 i najnowsze, gdy tylko zostaną one ustalone w specyfikacji TC39.
cuadraman
15

Ważne jest, aby rozważyć zalety i wady używania węzła babel w produkcji.

  • babel-nodezwiększa koszt uruchomienia od pół sekundy do jednej sekundy w przypadku zwykłego sprzętu. Ale jeśli Twoja aplikacja jest serwerem działającym od dawna, ten koszt uruchomienia nie ma większego znaczenia.
  • Spróbuj zmierzyć dodatkowe zużycie pamięci. Na przykład w przypadku mojej aplikacji (odczytywanie i przetwarzanie danych szeregów czasowych) było to tylko 20 MB. W zależności od sytuacji może to być znaczące lub nie.

Z drugiej strony,

  • używanie węzła babel bezpośrednio upraszcza programowanie - nie będziesz potrzebować skryptów "budowania" i nie będziesz mieć oddzielnych src/ libi distkatalogów
  • jeśli korzystasz importz plików lokalnych, czy importujesz z src/myutilsczy z lib/myutils? Używanie babel-nodeeliminuje ten problem.

Używam Babel tylko do obsługi modułów. Teraz V8 właśnie udostępnił obsługę modułów 10 stycznia 2017 r. Mam nadzieję, że za kilka miesięcy zobaczymy obsługę modułów w Node pod flagą, co wyjaśnia mój powód, dla którego używam Babel do dyskusji.

Dan Dascalescu
źródło
8

Odpowiedź @ cuadramana jest dokładniejsza niż @naomik.

Odpowiadając krótko na twoje pytanie: nie, babel-nodenie powinieneś przywoływać ich wprost. babel-nodejest prywatną biblioteką używaną przez babel-cli.

Oficjalny samouczek zawiera wszystko, czego potrzebujesz, aby rozpocząć pracę w węźle (nie po stronie przeglądarki!): Https://github.com/babel/example-node-server . PRZECZYTAJ TO! Znalazłem tak wiele wprowadzających w błąd samouczków na blogu, które były używane w różnych sposobach, i uznałem ten artykuł za najłatwiejszy do naśladowania.

Bonus: w przeciwieństwie do tego, co myśli wielu ludzi, cała magia transpiling może być zainstalowana lokalnie (za pomocą npm install --save-dev babel-cli nodemon babel-preset-es2015 babel-preset-stage-2). Nie ma potrzeby globalnej instalacji Babel ani żadnego z jego modułów pomocniczych! Całkiem fajnie.

wle8300
źródło