Tudo bem usar o babel-node na produção

87

Eu tenho desenvolvido um site usando babel-node e browserify com a transformação babelify, para oferecer suporte à sintaxe ES6.

Estou apenas pensando, posso executar isso em produção em babel-node server vez de node server Quais outras opções eu tenho para executar o ES6 no nó?

Aqui estão os comandos que estou executando para construir e iniciar o desenvolvimento

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

// npm start
babel-node server.js"

Aqui estão minhas dependências de desenvolvimento

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

Respostas:

114

Para o código do lado do cliente , você está fazendo a coisa certa. babelifye envie para o cliente.


Para o código do lado do servidor , eu faria apenas uma compilação regular usando babel-cli

De acordo com http://babeljs.io/docs/setup/#babel_register , babel-registeré não significava para uso em produção - O necessitam de gancho é recomendado principalmente para casos simples.

para Babel 6+

A partir do Babel 6, nenhuma transformação é incluída por padrão. Portanto, vamos começar instalando babel-clie babel-preset-es2015.

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

Adicione uma transformação ao seu .babelrcarquivo - este é o módulo perst que baixamos acima. Dê uma olhada na lista completa de predefinições para ver quais são mais adequadas para você.

{
  "presets": ["es2015"]
}

Adicione um buildscript ao seu package.json. Abaixo srcestão seus arquivos de entrada e buildos arquivos de saída transformados

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

Então construa!

$ npm run build

Em seguida, execute seu código. Neste ponto, você deseja executar os arquivos em seu builddiretório

$ npm start

para Babel <= 5, basta usar o gancho require.

require("babel/register");

Todos os arquivos subsequentes exigidos pelo nó com as extensões .es6 , .es , .jsx e .js serão transformados pelo Babel. O polyfill também é necessário automaticamente.

Você será capaz de manter seus arquivos de origem no ES6, mas ainda executá-los usando node server.js


De acordo com seus comentários, você parece estar tendo alguns problemas. Preste atenção especial à parte destacada em amarelo acima. Seu primeiro arquivo só pode ser ES5, que é executado pelo próprio nó. Todos os requisitos subsequentes serão transformados por Babel ...

Esta é a aparência de uma configuração 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

Queime isso!

$ node server.js
Obrigado
fonte
9
Na verdade, eu apenas tentei isso, colocando require("babel/register");meu server.js e quando eu executo node server.jsobtenho o erro: Unexpected reserved word: import ... então não pareceu funcionar
svnm
1
@steveniseki minha atualização deve demonstrar como fazer as coisas começarem a funcionar.
Obrigado
Incrível, muito obrigado por isso, eu realmente assumi que seria o caso e tentei fazer meu server.js todo em ES5, mas não pareceu funcionar, de qualquer maneira esta solução é realmente muito mais agradável enviar o aplicativo para um app.js , e funcionou perfeitamente. Obrigado
svnm
O projeto de exemplo que agora funciona dessa maneira com o node server.js :) está aqui se alguém estiver interessado em ver o exemplo. É um exemplo usando react router, babel e alt, que irei usar para um site real.
svnm
4
entretanto mudou para require ("babel-register"); .. de qualquer maneira, recebo "Importação de token inesperada" ..
smotru
54

Acabei de escrever uma postagem no blog sobre este tópico

A documentação da CLI do Babeljs avisa o seguinte:

nó de babel não destinado para uso em produção

Você não deve usar o babel-node na produção. É desnecessariamente pesado, com alto uso de memória devido ao cache sendo armazenado na memória. Você também sempre enfrentará uma penalidade de desempenho na inicialização, pois o aplicativo inteiro precisa ser compilado em tempo real.

Este é um exemplo de como você pode configurar os scripts npm para executar seu aplicativo com node em vez 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"
},

Você pode encontrar mais detalhes na postagem do blog

Cuadraman
fonte
3
Uma vez que o Node 4.0 suporta ES6, ainda precisamos usar o babel para compilar o código?
lvarayut
8
@LVarayut Sim, dependendo dos recursos, o babel ainda é necessário do lado do servidor. O Node v4.0.0 não suporta todos os recursos ES6 (especialmente módulos via sintaxe de importação / exportação). Consulte nodejs.org/en/docs/es6 para obter mais informações sobre o tópico ou digite node --v8-options | grep "em andamento" em um terminal para obter uma lista de recursos ES6 ainda não implementados.
jbmusso
@jbmusso Obrigado por sua ótima explicação :)
lvarayut
14
Babel não é apenas para ES6, mas para ESNext. Portanto, ele adiciona continuamente recursos do ES7 e os mais recentes assim que eles são definidos na especificação TC39.
cuadraman
15

É importante pesar os prós e os contras do uso do babel-node na produção.

  • babel-nodeadiciona entre meio segundo a um segundo ao custo inicial, em hardware comum. Mas se o seu aplicativo for um servidor de longa duração, esse custo de inicialização não terá muita importância.
  • Tente medir o consumo de memória extra. Para meu aplicativo, por exemplo (leitura e processamento de dados de série temporal), era de apenas 20 MB. Dependendo da sua situação, isso pode ou não ser significativo.

Por outro lado,

  • usar o babel-node simplifica diretamente o desenvolvimento - você não precisará de scripts de "construção" e não terá diretórios src/ libe separadosdist
  • se você for importde arquivos locais, vai importar de src/myutilsou de lib/myutils? O uso babel-nodeelimina esse problema.

Eu só uso o Babel para suporte a módulos. Agora o V8 acaba de lançar suporte para módulos em 10 de janeiro de 2017. Esperançosamente, veremos suporte a módulos no Node sob uma bandeira em alguns meses, tornando minha razão para usar o Babel discutível.

Dan Dascalescu
fonte
8

A resposta de @cuadraman é mais precisa do que @naomik.

Para responder brevemente à sua pergunta: não, babel-nodenão deve ser invocado explicitamente por você. babel-nodeé uma biblioteca privada que é consumida por babel-cli.

O tutorial oficial tem tudo que você precisa para começar a funcionar no node (não no lado do navegador!): Https://github.com/babel/example-node-server . LEIA-O! Encontrei muitos tutoriais de blog enganosos que costumavam ser redondos e achei este artigo o mais fácil de seguir.

Bônus: ao contrário do que muitas pessoas pensam, toda a magia transpiladora pode ser instalada localmente (usando npm install --save-dev babel-cli nodemon babel-preset-es2015 babel-preset-stage-2). Não há necessidade de instalar o Babel ou qualquer um de seus módulos auxiliares globalmente! Muito bacana.

wle8300
fonte