web-dev-qa-db-fra.com

Puis-je utiliser babel-node en production?

J'ai développé un site utilisant babel-node et browserify avec la transformation babelify, afin de prendre en charge la syntaxe ES6.

Je me demande juste, puis-je utiliser ceci en production en tant que babel-node server plutôt que node server Quelles autres options dois-je utiliser pour exécuter ES6 dans le noeud?

Voici les commandes que je lance pour la construction et commence en développement

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

// npm start
babel-node server.js"

Voici mes dépendances de dev

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

Pour le code côté client , vous faites la bonne chose. babelify et l'envoyer au client.


Pour le code côté serveur , je voudrais juste faire une construction régulière en utilisant babel-cli

Selon http://babeljs.io/docs/setup/#babel_register , babel-register n'est pas destiné à une utilisation en production - Le crochet requis est principalement recommandé pour les cas simples.

pour Babel 6+

A partir de Babel 6, aucune transformation n'est incluse par défaut. Commençons donc par installer babel-cli et babel-preset-es2015.

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

Ajoutez une transformation à votre fichier .babelrc - il s’agit du module perst que nous avons téléchargé ci-dessus. Jetez un coup d’œil sur le liste complète des préréglages pour voir lequel vous convient le mieux.

{
  "presets": ["es2015"]
}

Ajoutez un script build à votre package.json. Ci-dessous src sont vos fichiers d'entrée et build sont les fichiers de sortie transformés.

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

Alors construis-le!

$ npm run build

Ensuite, lancez votre code. À ce stade, vous voudrez exécuter les fichiers de votre répertoire build

$ npm start

pour Babel <= 5, utilisez simplement le crochet require.

require("babel/register");

Tous les fichiers suivants requis par le noeud avec les extensions . Es6 , . Es , . jsx et . js sera transformé par Babel. Le polyfill est également requis automatiquement.

Vous pourrez conserver vos fichiers source dans ES6 tout en les exécutant avec node server.js


Selon vos commentaires, vous semblez avoir un petit problème. Portez une attention particulière à la partie en surbrillance jaune ci-dessus. Votre premier fichier ne peut être que ES5, qui est exécuté par le noeud lui-même. Tous nécessitent par la suite seront transformés par Babel ...

Voici à quoi pourrait ressembler une configuration typique

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

Lancez-le!

$ node server.js
109
user633183

Je viens d'écrire n article de blog sur ce sujet

documentation CLI de Babeljs met en garde contre les éléments suivants:

babel-node n'est pas destiné à une utilisation en production

Vous ne devriez pas utiliser babel-node en production. Il est inutilement lourd, avec une utilisation importante de la mémoire en raison du stockage en mémoire cache du cache. Vous serez également toujours pénalisé par les performances de démarrage car l’application entière doit être compilée à la volée.

Voici un exemple de la manière dont vous pourriez configurer les scripts npm pour exécuter votre application avec node au lieu 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"
},

Vous pouvez trouver plus de détails sur le blog post

53
cuadraman

Il est important de peser le pour et le contre de l'utilisation de babel-node en production.

  • babel-node ajoute une demi-seconde à une seconde au coût de démarrage, sur le matériel de base. Mais si votre application est un serveur de longue durée, ce coût de démarrage importera peu.
  • Essayez de mesurer la consommation de mémoire supplémentaire. Pour mon application par exemple (lecture et traitement de données chronologiques), elle ne faisait que 20 Mo. Selon votre situation, cela peut être important ou non.

D'autre part,

  • l'utilisation directe de babel-node simplifie le développement: vous n'avez pas besoin de scripts de "génération" ni de répertoires src/lib et dist distincts.
  • si vous import à partir de fichiers locaux, importerez-vous à partir de src/myutils ou de lib/myutils? Utiliser babel-node élimine ce problème.

J'utilise uniquement Babel pour le support des modules. V8 vient tout juste de sortir support pour les modules le 10 janvier 2017. Espérons que nous verrons le support des modules dans Node sous un drapeau dans quelques mois, ce qui rendra ma raison d'utiliser Babel moot .

13
Dan Dascalescu

La réponse de @ cuadraman est plus précise que @naomik.

Pour répondre brièvement à votre question: non, babel-node ne doit pas être invoqué explicitement par vous. babel-node est une bibliothèque privée utilisée par babel-cli.

Le didacticiel officiel contient tout ce dont vous avez besoin pour utiliser un nœud (pas du côté du navigateur!): https://github.com/babel/example-node-server . LIS LE! J'ai trouvé tellement de tutoriels de blogues trompeurs qui utilisaient différentes méthodes, et j'ai trouvé cet article le plus facile à suivre.

Bonus: contrairement à ce que beaucoup de gens pensent, toute la magie de la transcription peut être installée localement (en utilisant npm install --save-dev babel-cli nodemon babel-preset-es2015 babel-preset-stage-2). Pas besoin d'installer Babel ou l'un de ses modules d'assistance dans le monde entier! Assez chouette.

7
williamle8300