2015-06-11 10 views
69

Ho sviluppato un sito utilizzando babel-node e browserify con la trasformazione babelify, per supportare la sintassi ES6.È corretto utilizzare il nodo babel nella produzione

Mi chiedo solo, posso eseguire questo in produzione comebabel-node serverpiuttosto chenode serverQuali altre opzioni devo correre ES6 in nodo?

Qui ci sono i comandi Sono in esecuzione per Costruire e avviare lo sviluppo

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

// npm start 
babel-node server.js" 

Qui sono le mie dipendenze dev

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

risposta

91

Per il codice lato client, stai facendo la cosa giusta babelify e spedirlo al cliente.


Per il codice lato server, vorrei solo fare una build regolare utilizzando babel-cli

According to http://babeljs.io/docs/setup/#babel_register , babel-register is not meant for production use — The require hook is primarily recommended for simple cases.

per Babel 6+

Come di Babele 6, non trasformazioni sono inclusi di default . Quindi iniziamo installando babel-cli e babel-preset-es2015.

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

Aggiungi una trasformazione al .babelrc file di — questo è il modulo prest abbiamo scaricato in precedenza. Dai uno sguardo allo full list of presets per vedere quale (i) si adatta meglio a te.

{ 
    "presets": ["es2015"] 
} 

aggiungere uno script build al vostro package.json. Qui di seguito è src i file di input e build è il file di output

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

Poi costruirlo trasformato!

$ npm run build 

Quindi eseguire il codice. A questo punto, ti consigliamo di essere in esecuzione i file nella directory build

$ npm start 

per Babel < = 5, basta usare il gancio richiedono.

require("babel/register"); 

All subsequent files required by node with the extensions .es6, .es, .jsx and .js will be transformed by Babel. The polyfill is also automatically required.

Sarete in grado di mantenere i file sorgente in ES6 ma ancora eseguirli utilizzando node server.js


Secondo i vostri commenti, ti sembra di essere visto un po 'di problemi. Prestare particolare attenzione alla parte evidenziata in giallo sopra. Il tuo primo file può essere solo ES5, che viene eseguito dal nodo stesso.Tutti successiva richiede sarà trasformato da Babel ...

Ecco cosa una tipica configurazione potrebbe apparire come

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 

abete e così su!

$ node server.js 
+9

In realtà ho appena provato questo, mettendo 'require (" babel/register ");' nel mio server.js e quando eseguo 'node server.js' ottengo l'errore:' Parola riservata inaspettata: import ... 'così non sembra funzionare –

+1

@steveniseki il mio aggiornamento dovrebbe dimostrare come far funzionare le cose. – naomik

+0

Fantastico, grazie mille per questo, in realtà ho pensato 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ù bella spingendo l'app su un'app. js, e ha funzionato perfettamente. Grazie –

49

ho appena scritto a blog post on this topic

Babeljs CLI documentation avverte i seguenti:

babel-node not meant for production use

You should not be using babel-node in production. It is unnecessarily heavy, with high memory usage due to the cache being stored in memory. You will also always experience a startup performance penalty as the entire app needs to be compiled on the fly.

Questo è un esempio di come si possa configurare gli script NPM per eseguire la vostra applicazione con il nodo al posto di Babel -nodo.

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

è possibile trovare ulteriori dettagli sul blog post

+3

Dato che il Node 4.0 supporta ES6, dobbiamo ancora usare Babel per compilare il codice? – lvarayut

+6

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

+0

@jbmusso Grazie per la tua grande spiegazione :) – lvarayut

7

@ risposta di cuadraman è più preciso @naomik.

Per rispondere brevemente alla domanda: no, babel-node non deve essere invocato esplicitamente dall'utente. babel-node è una libreria privata consumata da babel-cli.

Il tutorial ufficiale ha tutto il necessario per essere installato e funzionante sul nodo (non sul lato del browser!): https://github.com/babel/example-node-server. LEGGILO! Ho trovato così tanti tutorial fuorvianti sui blog che hanno usato molti modi e ho trovato questo articolo il più facile da seguire.

Bonus: contrariamente a quanto molti pensano, tutta la magia di 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 helper a livello globale! Abbastanza elegante.

10

È importante valutare i vantaggi e gli svantaggi dell'utilizzo di babel-node in produzione.

  • babel-node aggiunge da mezzo secondo a un secondo al costo di avvio, su hardware commodity. Ma se la tua app è un server di lunga durata, i costi di avvio non contano molto.
  • Provare a misurare il consumo di memoria extra. Ad esempio, per la mia app (lettura ed elaborazione dei dati delle serie temporali), erano 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 avrete separati src/lib e dist directory
  • se si usa import da file locali, si importa da src/myutils o da lib/myutils? L'utilizzo di babel-node elimina questo problema.

Io uso solo Babel per il supporto dei moduli. Ora il V8 ha appena rilasciato support for modules il 10 gennaio 2017. Speriamo di vedere il supporto dei moduli in Node sotto una bandiera in pochi mesi, il che rende la mia ragione per usare Babel Moot.

Problemi correlati