¿Está bien usar babel-node en producción?

87

He estado desarrollando un sitio usando babel-node y browserify con la transformación babelify, para admitir la sintaxis de ES6.

Me pregunto, ¿puedo ejecutar esto en producción como en babel-node server lugar de node server qué otras opciones tengo para ejecutar ES6 en el nodo?

Estos son los comandos que estoy ejecutando para compilar y comenzar en desarrollo

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

// npm start
babel-node server.js"

Aquí están mis dependencias de desarrollo

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

Respuestas:

114

Para el código del lado del cliente , está haciendo lo correcto. babelifyy envíelo al cliente.


Para el código del lado del servidor , simplemente haría una compilación regular usando babel-cli

De acuerdo con http://babeljs.io/docs/setup/#babel_register , nobabel-register está diseñado para uso en producción : el enlace require se recomienda principalmente para casos simples.

para Babel 6+

A partir de Babel 6, no se incluyen transformaciones por defecto. Así que comencemos instalando babel-cliy babel-preset-es2015.

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

Agregue una transformación a su .babelrcarchivo: este es el módulo personalizado que descargamos anteriormente. Eche un vistazo a la lista completa de ajustes preestablecidos para ver cuáles son los más adecuados para usted.

{
  "presets": ["es2015"]
}

Agregue un buildscript a su package.json. A continuación srcse muestran sus archivos de entrada y buildlos archivos de salida transformados

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

¡Entonces constrúyelo!

$ npm run build

Luego ejecuta tu código. En este punto, querrá ejecutar los archivos en su builddirectorio

$ npm start

para Babel <= 5, solo use el gancho require.

require("babel/register");

Todos los archivos posteriores requeridos por el nodo con las extensiones .es6 , .es , .jsx y .js serán transformados por Babel. El polyfill también se requiere automáticamente.

Podrá mantener sus archivos fuente en ES6 pero aún ejecutarlos usando node server.js


Según sus comentarios, parece que tiene un pequeño problema. Preste especial atención a la parte resaltada en amarillo arriba. Su primer archivo solo puede ser ES5, que es ejecutado por el propio nodo. Todas las necesidades posteriores serán transformadas por Babel ...

Así es como podría verse una configuración típica

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

¡préndelo!

$ node server.js
Gracias
fuente
9
En realidad, acabo de probar esto, colocando require("babel/register");mi server.js y cuando lo ejecuto aparece node server.jsel error: Unexpected reserved word: import ... así que no parece funcionar
svnm
1
@steveniseki mi actualización debería demostrar cómo poner las cosas en funcionamiento.
Gracias
Impresionante, muchas gracias por eso, de hecho asumí que ese sería el caso e intenté hacer que mi server.js fuera todo en ES5 pero no parecía funcionar, de todos modos esta solución es mucho mejor empujando la aplicación a un app.js , y funcionó perfectamente. Gracias
svnm
El proyecto de ejemplo que ahora funciona de esta manera con node server.js :) está aquí si alguien está interesado en ver el ejemplo. Es un ejemplo que usa react router, babel y alt, que usaré para un sitio real.
svnm
4
mientras tanto, cambió a require ("babel-register"); .. de todos modos obtengo "Importación de token inesperada" ..
smotru
54

Acabo de escribir una publicación de blog sobre este tema.

La documentación de la CLI de Babeljs advierte lo siguiente:

babel-node no está diseñado para uso de producción

No debería utilizar babel-node en producción. Es innecesariamente pesado, con un alto uso de memoria debido a que el caché se almacena en la memoria. También siempre experimentará una penalización en el rendimiento de inicio, ya que toda la aplicación debe compilarse sobre la marcha.

Este es un ejemplo de cómo puede configurar los scripts npm para ejecutar su aplicación con node en lugar de 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"
},

Puede encontrar más detalles en la publicación del blog.

cuadraman
fuente
3
Dado que el Nodo 4.0 es compatible con ES6, ¿aún necesitamos usar babel para compilar el código?
lvarayut
8
@LVarayut Sí, dependiendo de las características, todavía se necesita babel del lado del servidor. El nodo v4.0.0 no es compatible con todas las funciones de ES6 (especialmente los módulos a través de la sintaxis de importación / exportación). Consulte nodejs.org/en/docs/es6 para obtener más información sobre el tema, o escriba node --v8-options | grep "en progreso" en una terminal para obtener una lista de las funciones de ES6 aún no implementadas.
jbmusso
@jbmusso Gracias por su gran explicación :)
lvarayut
14
Babel no es solo para ES6, sino para ESNext. Por lo tanto, agrega continuamente características de ES7 y las últimas tan pronto como se instalan en la especificación TC39.
cuadraman
15

Es importante sopesar los pros y los contras de usar babel-node en producción.

  • babel-nodeagrega entre medio segundo y un segundo al costo de inicio, en hardware básico. Pero si su aplicación es un servidor de larga duración, ese costo inicial no importará mucho.
  • Intente medir el consumo de memoria adicional. Para mi aplicación, por ejemplo (leer y procesar datos de series de tiempo), solo tenía 20 MB. Dependiendo de su situación, esto puede ser significativo o no.

Por otra parte,

  • el uso de babel-node simplifica directamente el desarrollo: no necesitará scripts de "compilación" y no tendrá directorios src/ liby separadosdist
  • si es importde archivos locales, ¿importará desde src/myutilso desde lib/myutils? El uso babel-nodeelimina ese problema.

Solo uso Babel para soporte de módulos. Ahora, V8 acaba de lanzar soporte para módulos el 10 de enero de 2017. Con suerte, veremos el soporte de módulos en Node bajo una bandera en unos meses, haciendo que mi razón para usar Babel sea discutible.

Dan Dascalescu
fuente
8

La respuesta de @ cuadraman es más precisa que @naomik.

Para responder brevemente a su pregunta: no, babel-nodeusted no debería invocarlo explícitamente. babel-nodees una biblioteca privada que consume babel-cli.

El tutorial oficial tiene todo lo que necesita para comenzar a funcionar en el nodo (¡no en el lado del navegador!): Https://github.com/babel/example-node-server . LEERLO! Encontré tantos tutoriales de blogs engañosos que se usaban en varias formas, y encontré este artículo el más fácil de seguir.

Bono: contrariamente a lo que mucha gente piensa, toda la magia transpiling se puede instalar localmente (usando npm install --save-dev babel-cli nodemon babel-preset-es2015 babel-preset-stage-2). ¡No es necesario instalar Babel o cualquiera de sus módulos auxiliares a nivel mundial! Bastante ingenioso.

wle8300
fuente