Est-il acceptable d'utiliser Babel-node en production?

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

Je me demande simplement, puis-je exécuter ceci en production en tant que babel-node server plutôt que de node server Quelles autres options dois-je exécuter ES6 dans un nœud?

Voici les commandes que je suis en cours d'exécution pour la construction et commencer dans le 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 développement

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

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


Pour le code côté serveur , je ferais simplement une compilation régulière en utilisant babel-cli

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

Pour Babel 6+

À partir de Babel 6, aucune transformation n'est incluse par défaut. Commençons 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 de synchronisation que nous avons téléchargé ci-dessus. Jetez un oeil à la liste complète des presets pour voir lequel (s) vous convient le mieux.

 { "presets": ["es2015"] } 

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

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

Ensuite, construisez-le!

 $ npm run build 

Ensuite, exécutez votre code. À ce stade, vous voulez exécuter les fichiers dans votre répertoire de build

 $ npm start 

Pour Babel <= 5, utilisez le crochet requis.

 require("babel/register"); 

Tous les fichiers ultérieurs requis par le nœud avec les extensions .es6 , .es , .jsx et .js seront transformés par Babel. Le polyfill est également automatiquement requis.

Vous pourrez conserver vos fichiers source dans ES6, mais les exécuter à l'aide de node server.js


Selon vos commentaires, vous semblez avoir un petit problème. Faites attention à la partie surlignée jaune ci-dessus. Votre premier fichier ne peut être que ES5, qui est exécuté par le nœud lui-même. Toutes les demandes suivantes seront transformées par Babel …

Voici à quoi ressemble 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 

mets le feu!

 $ node server.js 

Je viens d'écrire un blog sur ce sujet

La documentation de Babeljs CLI avertit ce qui suit:

Babel-node non destiné à l'utilisation de la production

Vous ne devriez pas utiliser le babel-node en production. Il est inutilement lourd, avec une forte utilisation de la mémoire en raison du stockage du cache en mémoire. Vous recevrez également une pénalité de performance de démarrage car l'application complète doit être compilée à la volée.

Voici un exemple de la façon dont vous pouvez configurer les scripts npm pour exécuter votre application avec un noeud 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 la publication du blog

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 consommée par babel-cli .

Le didacticiel officiel a tout ce dont vous avez besoin pour démarrer sur un nœud (pas sur le navigateur!): https://github.com/babel/example-node-server . LIS LE! J'ai trouvé tellement de tutoriels de blog trompeux qui ont utilisé autour des manières, et trouvé cet article le plus facile à suivre.

Bonus: contrairement à ce que beaucoup de gens pensent, toute la magie de transpiration 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 aucun de ses modules helper à l'échelle mondiale! Astucieux.

Il est important de peser les avantages et inconvénients de l'utilisation de babel-node en production.

  • babel-node ajoute entre une demi-seconde à une seconde du 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 n'aura pas beaucoup d'importance.
  • Essayez de mesurer la consommation de mémoire supplémentaire. Pour mon application par exemple (lecture et traitement de données de séries temporelles), ce n'était que 20 Mo. Selon votre situation, cela peut ou non être significatif.

D'autre part,

  • L'utilisation de babel-node simplifie directement le développement: vous n'aurez pas besoin de scripts "build" et vous n'aurez pas de répertoires src / lib et dist indépendants
  • Si vous import partir de fichiers locaux, importez-vous sur src/myutils ou sur lib/myutils ? L'utilisation de babel-node élimine ce problème.

J'utilise uniquement Babel pour le support de modules. Maintenant, V8 vient de publier un support pour les modules le 10 janvier 2017. Espérons que nous verrons les modules supportés dans Node sous un drapeau dans quelques mois, rendant ma raison d'utiliser Babel Moot.