Est-il acceptable d'utiliser babel-node en production

87

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

Je me demande simplement, puis-je l'exécuter en production babel-node server plutôt que de node server quelles autres options dois-je exécuter ES6 dans le nœud?

Voici les commandes que j'exécute pour la construction et démarrer 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"
svnm
la source

Réponses:

114

Pour le code côté client , vous faites la bonne chose. babelifyet expédiez-le au client.


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

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

pour Babel 6+

Depuis Babel 6, aucune transformation n'est incluse par défaut. Commençons donc par installer babel-cliet babel-preset-es2015.

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

Ajoutez une transformation à votre .babelrcfichier - c'est le module perst que nous avons téléchargé ci-dessus. Jetez un œil à la liste complète des préréglages pour voir lequel (s) vous convient le mieux.

{
  "presets": ["es2015"]
}

Ajoutez un buildscript à votre package.json. Voici srcvos fichiers d'entrée et buildles fichiers de sortie transformés

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

Alors construisez-le!

$ npm run build

Ensuite, exécutez votre code. À ce stade, vous voudrez exécuter les fichiers de votre buildrépertoire

$ npm start

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

require("babel/register");

Tous les fichiers suivants 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 tout en les exécutant en utilisant node server.js


D'après vos commentaires, vous semblez avoir un peu de mal. Faites particulièrement attention à la partie surlignée en jaune ci-dessus. Votre premier fichier ne peut être que ES5, qui est exécuté par le nœud lui-même. Tous les besoins ultérieurs 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

mets le feu!

$ node server.js
Merci
la source
9
En fait , je viens d' essayer cela, mettre require("babel/register");dans mes server.js et quand je lance que node server.jsje reçois l'erreur: Unexpected reserved word: import ... il ne semble pas fonctionner
svnm
1
@steveniseki ma mise à jour devrait montrer comment mettre les choses en marche.
Merci
Génial, merci beaucoup pour cela, j'ai en fait supposé que ce serait le cas et j'ai essayé de faire de mon server.js tout dans ES5 mais cela ne semblait pas fonctionner, de toute façon, cette solution est en fait beaucoup plus agréable de pousser l'application vers un app.js , et cela a parfaitement fonctionné. Merci
svnm
L'exemple de projet qui fonctionne maintenant de cette manière avec le nœud server.js :) est ici si quelqu'un est intéressé à voir l'exemple. C'est un exemple utilisant react router, babel et alt, que je vais utiliser pour un vrai site.
svnm
4
pendant ce temps, il a changé pour require ("babel-register"); .. de toute façon j'obtiens "Importation de jeton inattendue" ..
smotru
54

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

La documentation de la CLI Babeljs avertit ce qui suit:

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 élevée de la mémoire en raison du cache stocké en mémoire. Vous serez également toujours confronté à une pénalité de performance au démarrage, car toute l'application 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 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 l' article du blog

cuadraman
la source
3
Puisque Node 4.0 prend en charge ES6, devons-nous toujours utiliser babel pour compiler le code?
lvarayut
8
@LVarayut Oui, selon les fonctionnalités, babel est toujours nécessaire côté serveur. Node v4.0.0 ne prend pas en charge toutes les fonctionnalités ES6 (en particulier les modules via la syntaxe d'importation / exportation). Voir nodejs.org/en/docs/es6 pour plus d'informations sur le sujet, ou tapez node --v8-options | grep "en cours" dans un terminal pour obtenir une liste des fonctionnalités ES6 non encore implémentées.
jbmusso
@jbmusso Merci pour votre excellente explication :)
lvarayut
14
Babel n'est pas seulement pour ES6, mais pour ESNext .. Il ajoute donc continuellement des fonctionnalités d'ES7 et des dernières dès qu'elles sont installées dans la spécification TC39.
cuadraman
15

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

  • babel-nodeajoute entre une demi-seconde et 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 n'aura pas beaucoup d'importance.
  • Essayez de mesurer la consommation de mémoire supplémentaire. Pour mon application par exemple (lecture et traitement des données de séries chronologiques), il ne faisait que 20 Mo. Selon votre situation, cela peut être important ou non.

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/ libet séparésdist
  • si vous à importpartir de fichiers locaux, allez-vous importer depuis src/myutilsou depuis lib/myutils? L'utilisation babel-nodeélimine ce problème.

J'utilise Babel uniquement pour le support des modules. Maintenant, V8 vient de publier le support des 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 sans objet.

Dan Dascalescu
la source
8

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

Pour répondre brièvement à votre question: non, babel-nodene devrait pas être invoqué explicitement par vous. babel-nodeest une bibliothèque privée consommée par babel-cli.

Le tutoriel officiel a tout ce dont vous avez besoin pour être opérationnel sur le nœud (pas côté navigateur!): Https://github.com/babel/example-node-server . LIS LE! J'ai trouvé tellement de tutoriels de blog trompeurs qui utilisaient des moyens différents, et j'ai trouvé cet article le plus facile à suivre.

Bonus: contrairement à ce que beaucoup de gens pensent, toute la magie de transpiling 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! Assez chouette.

wle8300
la source