Va bene usare babel-node in produzione


87

Ho sviluppato un sito utilizzando babel-node e browserify con la trasformazione babelify, per supportare la sintassi ES6.

Mi chiedo solo, posso eseguirlo in produzione come babel-node server invece di node server quali altre opzioni devo eseguire ES6 nel nodo?

Ecco i comandi che sto eseguendo per compilare e avviare in fase di sviluppo

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

// npm start
babel-node server.js"

Ecco le mie dipendenze dev

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

Risposte:


114

Per il codice lato client , stai facendo la cosa corretta. babelifye spedirlo al cliente.


Per il codice lato server , farei solo una build normale usando babel-cli

Secondo http://babeljs.io/docs/setup/#babel_register , nonbabel-register è inteso per uso di produzione - L'hook require è consigliato principalmente per casi semplici.

per Babel 6+

A partire da Babel 6, nessuna trasformazione è inclusa per impostazione predefinita. Quindi iniziamo installando babel-clie babel-preset-es2015.

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

Aggiungi una trasformazione al tuo .babelrcfile: questo è il primo modulo che abbiamo scaricato sopra. Dai un'occhiata all'elenco completo dei preset per vedere quale (i) è più adatto a te.

{
  "presets": ["es2015"]
}

Aggiungi uno buildscript al tuo file package.json. Di seguito srcsono riportati i file di input e buildi file di output trasformati

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

Allora costruiscilo!

$ npm run build

Quindi esegui il codice. A questo punto, ti consigliamo di eseguire i file nella tua builddirectory

$ npm start

per Babel <= 5, usa semplicemente l'hook require.

require("babel/register");

Tutti i file successivi richiesti dal nodo con le estensioni .es6 , .es , .jsx e .js verranno trasformati da Babel. Anche il polyfill è richiesto automaticamente.

Sarai in grado di mantenere i tuoi file sorgente in ES6 ma comunque eseguirli usando node server.js


Secondo i tuoi commenti, sembra che tu abbia un piccolo problema. Prestare particolare attenzione alla parte evidenziata in giallo sopra. Il tuo primo file può essere solo ES5, che viene eseguito dal nodo stesso. Tutte le successive richieste saranno trasformate da Babel ...

Ecco come potrebbe apparire una configurazione tipica

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

accendilo!

$ node server.js

9
In realtà l'ho appena provato, inserendo il require("babel/register");mio server.js e quando corro node server.jsottengo l'errore: Unexpected reserved word: import ... quindi non sembra funzionare
svnm

1
@steveniseki il mio aggiornamento dovrebbe dimostrare come far funzionare le cose.
Grazie

Fantastico, grazie mille per questo, in realtà pensavo che sarebbe stato il caso e ho provato a fare il mio server.js tutto in ES5 ma non sembrava funzionare, comunque questa soluzione è in realtà molto più carina che spinge l'app su un'app.js e ha funzionato perfettamente. Grazie
svnm

Il progetto di esempio che ora funziona in questo modo con node server.js :) è qui se qualcuno è interessato a vedere l'esempio. È un esempio che utilizza il router React, Babel e Alt, che userò per un sito reale.
svnm

4
nel frattempo è cambiato in require ("babel-register"); .. comunque ottengo "Importa token imprevisto" ..
smotru

54

Ho appena scritto un post sul blog su questo argomento

La documentazione della CLI di Babeljs avverte quanto segue:

babel-node non è pensato per l'uso in produzione

Non dovresti usare babel-node in produzione. È inutilmente pesante, con un elevato utilizzo della memoria a causa della cache archiviata in memoria. Inoltre, si verificherà sempre una penalizzazione delle prestazioni all'avvio poiché l'intera app deve essere compilata al volo.

Questo è un esempio di come potresti impostare gli script npm per eseguire la tua app con node invece di 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"
},

Puoi trovare maggiori dettagli nel post del blog


3
Dato che il Nodo 4.0 supporta ES6, dobbiamo ancora usare babel per compilare il codice?
lvarayut

8
@LVarayut Sì, a seconda delle caratteristiche, babel è ancora necessario lato server. Il nodo v4.0.0 non supporta tutte le funzionalità ES6 (in particolare i moduli tramite la sintassi di importazione / esportazione). Vedere nodejs.org/en/docs/es6 per ulteriori informazioni sull'argomento, oppure digitare node --v8-options | grep "in progress" in un terminale per ottenere un elenco di funzionalità ES6 non ancora implementate.
jbmusso

@jbmusso Grazie per la tua ottima spiegazione :)
lvarayut

14
Babel non è solo per ES6, ma per ESNext .. Quindi aggiunge continuamente funzionalità da ES7 e le ultime non appena vengono stabilite nelle specifiche TC39.
cuadraman

15

È importante valutare i pro ei contro dell'utilizzo di babel-node nella produzione.

  • babel-nodeaggiunge da mezzo secondo a un secondo al costo di avvio, su hardware di base. Ma se la tua app è un server di lunga durata, il costo di avvio non avrà molta importanza.
  • Prova a misurare il consumo di memoria extra. Per la mia app, ad esempio (lettura ed elaborazione di dati di serie temporali), era solo 20 MB. A seconda della situazione, questo può o non può essere significativo.

D'altra parte,

  • utilizzando babel-nodo semplifica direttamente lo sviluppo - non avrete bisogno di script di "costruire", e non avrà separati src/ libe distdirectory
  • se provieni importda file locali, importerai da src/myutilso da lib/myutils? L'utilizzo babel-nodeelimina questo problema.

Uso Babel solo per il supporto dei moduli. Ora V8 ha appena rilasciato il supporto per i moduli il 10 gennaio 2017. Si spera di vedere il supporto dei moduli in Node sotto un flag tra pochi mesi, rendendo discutibile la mia ragione per l'utilizzo di Babel.


8

La risposta di @ cuadraman è più accurata di @naomik.

Per rispondere brevemente alla tua domanda: no, babel-nodenon dovrebbe essere invocato esplicitamente da te. babel-nodeè una libreria privata consumata da babel-cli.

Il tutorial ufficiale ha tutto ciò di cui hai bisogno per essere attivo e funzionante su node (non lato browser!): Https://github.com/babel/example-node-server . LEGGILO! Ho trovato così tanti tutorial di blog fuorvianti che utilizzavano modi e ho trovato questo articolo il più facile da seguire.

Bonus: contrariamente a quanto pensano molte persone, tutta la magia del transpiling può essere installata localmente (usando npm install --save-dev babel-cli nodemon babel-preset-es2015 babel-preset-stage-2). Non è necessario installare Babel o uno dei suoi moduli di supporto a livello globale! Abbastanza elegante.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.