javascript - standalone - babelify
¿Está bien usar babel-node en producción? (4)
He estado desarrollando un sitio usando babel-node y browserify con la transformación babelify, para soportar la sintaxis de ES6.
Me pregunto, ¿puedo ejecutar esto en producción como
babel-node server
lugar de
node server
¿Qué otras opciones tengo para ejecutar ES6 en el nodo?
Aquí están 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"
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 destinado para uso en producción
No debe usar 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 de rendimiento de inicio ya que toda la aplicación debe compilarse sobre la marcha.
Este es un ejemplo de cómo podría 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"
},
Puedes encontrar más detalles en la publicación del blog
Es importante sopesar los pros y los contras del uso de babel-node en la producción.
-
babel-node
agrega 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 de inicio no importará mucho. - Intenta 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 o no ser significativo.
Por otra parte,
-
el uso de babel-node simplifica directamente el desarrollo: no necesitará scripts de "compilación" y no tendrá directorios
src
/lib
ydist
separados -
si
import
desde archivos locales, ¿importará desdesrc/myutils
o desdelib/myutils
? Usarbabel-node
elimina ese problema.
Solo uso Babel para el soporte de módulos. Ahora V8 acaba de lanzar soporte para módulos el 10 de enero de 2017. Esperemos ver soporte de módulos en Node bajo una bandera en unos pocos meses, lo que hace que mi razón para usar Babel sea discutible.
La respuesta de @ cuadraman es más precisa que @naomik.
Para responder brevemente a su pregunta: no, usted no debe invocar explícitamente el
babel-node
.
babel-node
es una biblioteca privada que es consumida por
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 . LEER Encontré tantos tutoriales de blog engañosos que se usaban en varias formas, y este artículo me pareció el más fácil de seguir.
Bonificación: al contrario de 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 ni ninguno de sus módulos auxiliares a nivel mundial!
Bastante ingenioso
Para el código del lado del cliente
, estás haciendo lo correcto.
babelify
y
babelify
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 ,
babel-register
no está diseñado para uso en producción : el gancho require se recomienda principalmente para casos simples.
para Babel 6+
A partir de Babel 6, no se incluyen transformaciones por defecto.
Comencemos instalando
babel-cli
y
babel-preset-es2015
.
$ npm install --save-dev babel-cli babel-preset-es2015
Agregue una transformación a su archivo
.babelrc
: este es el módulo perst que hemos descargado 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 script de
build
a su
package.json
.
Debajo de
src
están sus archivos de entrada y
build
son los 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 directorio de
build
$ npm start
para Babel <= 5, solo use el gancho require.
require("babel/register");
Babel transformará todos los archivos posteriores requeridos por el nodo con las extensiones .es6 , .es , .jsx y .js . El polyfill también se requiere automáticamente.
Podrá mantener sus archivos fuente en ES6 pero aún así ejecutarlos usando el
node server.js
Según sus comentarios, parece estar teniendo un pequeño problema. Presta especial atención a la parte amarilla resaltada arriba. Su primer archivo solo puede ser ES5, que es ejecutado por el propio nodo. Todos los requisitos posteriores serán transformados por Babel ...
Así es como se vería 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