Ist es in Ordnung, Babel-Node in der Produktion zu verwenden?

86

Ich habe eine Site mit babel-node und browserify mit der babelify-Transformation entwickelt, um die ES6-Syntax zu unterstützen.

Ich frage mich nur, ob ich dies in der Produktion ausführen kann, babel-node server anstatt node server Welche anderen Optionen muss ich haben, um ES6 im Knoten auszuführen?

Hier sind die Befehle, die ich zum Erstellen und Starten in der Entwicklung ausführe

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

// npm start
babel-node server.js"

Hier sind meine Entwicklungsabhängigkeiten

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

Antworten:

112

Für den clientseitigen Code machen Sie das Richtige. babelifyes und versenden es an den Kunden.


Für den serverseitigen Code würde ich nur einen regulären Build mit babel-cli durchführen

Nach http://babeljs.io/docs/setup/#babel_register , babel-registerist für den produktiven Einsatz nicht gemeint - Der erfordern Haken in erster Linie für einfache Fälle empfohlen.

für Babel 6+

Ab Babel 6 sind standardmäßig keine Transformationen enthalten. Beginnen wir also mit der Installation von babel-cliund babel-preset-es2015.

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

Fügen Sie Ihrer .babelrcDatei eine Transformation hinzu - dies ist das erste Modul, das wir oben heruntergeladen haben. Sehen Sie sich die vollständige Liste der Voreinstellungen an, um festzustellen , welche für Sie am besten geeignet sind.

{
  "presets": ["es2015"]
}

Fügen Sie buildIhrem Skript ein Skript hinzu package.json. Unten finden Sie srcIhre Eingabedateien und builddie transformierten Ausgabedateien

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

Dann baue es!

$ npm run build

Führen Sie dann Ihren Code aus. Zu diesem Zeitpunkt möchten Sie die Dateien in Ihrem buildVerzeichnis ausführen

$ npm start

Verwenden Sie für Babel <= 5 einfach den erforderlichen Haken.

require("babel/register");

Alle nachfolgenden Dateien, die der Knoten mit den Erweiterungen .es6 , .es , .jsx und .js benötigt , werden von Babel transformiert. Die Polyfüllung wird ebenfalls automatisch benötigt.

Sie können Ihre Quelldateien in ES6 behalten und dennoch mit ausführen node server.js


Ihren Kommentaren zufolge scheinen Sie ein wenig Probleme zu haben. Achten Sie besonders auf den gelb hervorgehobenen Teil oben. Ihre erste Datei kann nur ES5 sein, das vom Knoten selbst ausgeführt wird. Alle nachfolgenden Anforderungen werden von Babel ...

So könnte ein typisches Setup aussehen

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

mach es an!

$ node server.js
Danke dir
quelle
9
Eigentlich habe ich es einfach versucht, indem require("babel/register");ich meine server.js eingefügt habe und beim Ausführen node server.jsbekomme ich den Fehler: Unexpected reserved word: import ... also schien es nicht zu funktionieren
svnm
1
@steveniseki Mein Update sollte zeigen, wie man Dinge zum Laufen bringt.
Vielen Dank, dass Sie
Super, vielen Dank dafür, ich habe tatsächlich angenommen, dass dies der Fall sein würde, und versucht, meine server.js alle in ES5 zu erstellen, aber es schien nicht zu funktionieren, trotzdem ist diese Lösung viel besser, wenn ich die App auf eine app.js schiebe und es hat perfekt funktioniert. Danke
svnm
Das Beispielprojekt, das jetzt auf diese Weise mit node server.js :) funktioniert, ist hier, wenn jemand daran interessiert ist, das Beispiel zu sehen. Es ist ein Beispiel mit React Router, Babel und Alt, das ich für eine reale Site verwenden werde.
Svnm
4
in der Zwischenzeit wurde es geändert, um zu erfordern ("babel-register"); .. trotzdem bekomme ich "Unerwarteter Token Import" ..
smotru
54

Ich habe gerade einen Blog-Beitrag zu diesem Thema geschrieben

Die CLI-Dokumentation von Babeljs warnt vor Folgendem:

babel-node nicht für den produktionsgebrauch gedacht

Sie sollten babel-node nicht in der Produktion verwenden. Es ist unnötig schwer und verwendet viel Speicher, da der Cache im Speicher gespeichert ist. Außerdem tritt immer eine Leistungsminderung beim Start auf, da die gesamte App im laufenden Betrieb kompiliert werden muss.

Dies ist ein Beispiel dafür, wie Sie die npm-Skripte so einrichten können, dass Ihre App mit node anstelle von babel-node ausgeführt wird.

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

Weitere Details finden Sie im Blogbeitrag

Cuadraman
quelle
3
Müssen wir, da Node 4.0 ES6 unterstützt, immer noch babel verwenden, um den Code zu kompilieren?
lvarayut
8
@LVarayut Ja, abhängig von den Funktionen wird babel weiterhin serverseitig benötigt. Node v4.0.0 unterstützt nicht alle ES6-Funktionen (insbesondere Module über Import / Export-Syntax). Weitere Informationen zum Thema finden Sie unter nodejs.org/en/docs/es6 , oder geben Sie node --v8-options | ein grep "in Bearbeitung" in einem Terminal, um eine Liste der noch nicht implementierten ES6-Funktionen abzurufen.
jbmusso
@ jbmusso Vielen Dank für Ihre tolle Erklärung :)
lvarayut
14
Babel ist nicht nur für ES6, sondern auch für ESNext. Daher werden kontinuierlich Funktionen von ES7 und den neuesten hinzugefügt, sobald sie in der TC39-Spezifikation festgelegt sind.
Cuadraman
15

Es ist wichtig, die Vor- und Nachteile der Verwendung von Babel-Node in der Produktion abzuwägen.

  • babel-nodeerhöht die Startkosten für Standardhardware zwischen einer halben und einer Sekunde. Wenn Ihre App jedoch ein Server mit langer Laufzeit ist, spielen diese Startkosten keine große Rolle.
  • Versuchen Sie, den zusätzlichen Speicherverbrauch zu messen. Für meine App zum Beispiel (Lesen und Verarbeiten von Zeitreihendaten) waren es nur 20 MB. Abhängig von Ihrer Situation kann dies von Bedeutung sein oder auch nicht.

Andererseits,

  • Die direkte Verwendung von babel-node vereinfacht die Entwicklung - Sie benötigen keine "Build" -Skripte und haben keine separaten src/ libund distVerzeichnisse
  • Wenn Sie importaus lokalen Dateien stammen, werden Sie aus src/myutilsoder aus importieren lib/myutils? Die Verwendung babel-nodebeseitigt dieses Problem.

Ich benutze Babel nur für die Modulunterstützung. Jetzt hat V8 gerade die Unterstützung für Module am 10. Januar 2017 veröffentlicht. Hoffentlich wird die Unterstützung von Modulen in Node in ein paar Monaten unter einem Flag angezeigt, was meinen Grund für die Verwendung von Babel moot darstellt.

Dan Dascalescu
quelle
8

@ cuadramans Antwort ist genauer als @naomik.

Um Ihre Frage kurz zu beantworten: Nein, babel-nodesollte nicht explizit von Ihnen aufgerufen werden. babel-nodeist eine private Bibliothek, die von konsumiert wird babel-cli.

Das offizielle Tutorial enthält alles, was Sie benötigen, um auf dem Knoten (nicht auf der Browserseite!) In Betrieb zu gehen: https://github.com/babel/example-node-server . LIES ES! Ich fand so viele irreführende Blog-Tutorials, in denen es um verschiedene Wege ging, und fand diesen Artikel am einfachsten zu befolgen.

Bonus: Entgegen der Meinung vieler Menschen kann die gesamte Transpiling-Magie lokal installiert werden (mithilfe von npm install --save-dev babel-cli nodemon babel-preset-es2015 babel-preset-stage-2). Sie müssen Babel oder eines seiner Hilfsmodule nicht global installieren! Ziemlich geschickt.

wle8300
quelle