Можно ли использовать babel-node в продакшене?

87

Я разрабатываю сайт с использованием babel-node и просматриваю с помощью преобразования babelify для поддержки синтаксиса ES6.

Мне просто интересно, могу ли я запустить это в производстве, babel-node server а не node server Какие еще варианты у меня есть для запуска ES6 в узле?

Вот команды, которые я запускаю для сборки и запускаю в разработке

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

// npm start
babel-node server.js"

Вот мои зависимости от разработчиков

"babel": "^4.0.1",
"babelify": "^5.0.3",
"browserify": "^8.0.3"
svnm
источник

Ответы:

114

Для кода на стороне клиента вы делаете правильные вещи. babelifyего и отправьте клиенту.


Для кода на стороне сервера я бы просто сделал обычную сборку с помощью babel-cli

Согласно http://babeljs.io/docs/setup/#babel_register , babel-registerон не предназначен для использования в производстве - ловушка require рекомендуется в первую очередь для простых случаев.

для Babel 6+

Начиная с Babel 6, по умолчанию никакие преобразования не включаются. Итак, начнем с установки babel-cliи babel-preset-es2015.

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

Добавьте преобразование в свой .babelrcфайл - это perst-модуль, который мы скачали выше. Взгляните на полный список предустановок, чтобы узнать, какие из них подходят вам лучше всего.

{
  "presets": ["es2015"]
}

Добавьте buildскрипт в свой package.json. Ниже приведены srcваши входные файлы и buildпреобразованные выходные файлы.

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

Тогда собери его!

$ npm run build

Затем запустите свой код. На этом этапе вы захотите запустить файлы в своем buildкаталоге.

$ npm start

для Babel <= 5 просто используйте хук require.

require("babel/register");

Все последующие файлы, требуемые узлом с расширениями .es6 , .es , .jsx и .js, будут преобразованы Babel. Polyfill также автоматически требуется.

Вы сможете сохранить свои исходные файлы в ES6, но по-прежнему выполнять их, используя node server.js


Судя по вашим комментариям, у вас возникли небольшие проблемы. Обратите особое внимание на выделенную желтым цветом часть выше. Ваш первый файл может быть только ES5, который запускается самим узлом. Все последующие требования будут преобразованы Babel ...

Вот как может выглядеть типичная установка

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

сожги это!

$ node server.js
Спасибо
источник
9
На самом деле я просто попробовал это, вставив require("babel/register");свой server.js, и когда я запустил, node server.jsя получаю сообщение об ошибке: Unexpected reserved word: import ... так что, похоже, это не сработало
svnm
1
@steveniseki, мое обновление должно продемонстрировать, как все наладить и запустить.
Спасибо
Потрясающе, большое спасибо за это, я на самом деле предположил, что это будет так, и попытался сделать свой server.js полностью на ES5, но, похоже, это не сработало, в любом случае это решение на самом деле намного лучше, проталкивая приложение в app.js , и он работал отлично. Спасибо
svnm
Пример проекта, который теперь работает таким образом с node server.js :), находится здесь, если кому-то интересно посмотреть пример. Это пример использования response router, babel и alt, который я буду использовать для реального сайта.
svnm
4
тем временем он изменился на require ("babel-register"); .. все равно получаю "Неожиданный импорт токена" ..
смотр
54

Я только что написал в блоге сообщение по этой теме

Документация по интерфейсу командной строки Babeljs предупреждает следующее:

babel-node не предназначен для производственного использования

Вы не должны использовать babel-node в производстве. Он излишне тяжелый, с большим использованием памяти из-за того, что кеш хранится в памяти. Вы также всегда будете испытывать снижение производительности при запуске, так как все приложение необходимо компилировать на лету.

Это пример того, как вы можете настроить скрипты npm для запуска вашего приложения с помощью node вместо 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"
},

Вы можете найти более подробную информацию в сообщении блога

Cuadraman
источник
3
Поскольку Node 4.0 поддерживает ES6, нужно ли нам по-прежнему использовать babel для компиляции кода?
lvarayut
8
@LVarayut Да, в зависимости от возможностей, babel все равно нужна серверная часть. Node v4.0.0 не поддерживает все функции ES6 (особенно модули с синтаксисом импорта / экспорта). См. Nodejs.org/en/docs/es6 для получения дополнительной информации по теме или введите node --v8-options | grep «в процессе» в терминале, чтобы получить список еще не реализованных функций ES6.
jbmusso
@jbmusso Спасибо за отличное объяснение :)
lvarayut
14
Babel предназначен не только для ES6, но и для ESNext. Таким образом, он постоянно добавляет функции из ES7 и последних, как только они будут учтены в спецификации TC39.
Куадраман,
15

Важно взвесить плюсы и минусы использования babel-node в продакшене.

  • babel-nodeдействительно добавляет от полсекунды до одной секунды к затратам на запуск на обычном оборудовании. Но если ваше приложение является долго работающим сервером, стоимость запуска не будет иметь большого значения.
  • Попробуй замерить лишнее потребление памяти. Например, для моего приложения (чтение и обработка данных временных рядов) это было всего 20 МБ. В зависимости от вашей ситуации это может быть или не иметь значения.

С другой стороны,

  • использование babel-node напрямую упрощает разработку - вам не понадобятся скрипты "build", и у вас не будет отдельных каталогов src/ libиdist
  • если вы importиз локальных файлов, вы будете импортировать из src/myutilsили из lib/myutils? Использование babel-nodeустраняет эту проблему.

Я использую Babel только для поддержки модулей. Теперь V8 выпустили поддержку модулей на 10 января 2017 года , надеюсь , мы увидим , модули поддерживают в узле под флагом в течение нескольких месяцев, что делают мою причину для использования Babel спорного.

Дэн Даскалеску
источник
8

Ответ @ cuadraman более точен, чем @naomik.

Коротко отвечу на ваш вопрос: нет, вы babel-nodeне должны вызывать его явно. babel-node- это частная библиотека, которую использует babel-cli.

В официальном руководстве есть все, что вам нужно, чтобы начать работу на узле (не на стороне браузера!): Https://github.com/babel/example-node-server . ПРОЧИТАЙТЕ! Я нашел так много вводящих в заблуждение руководств в блогах, которые использовались разными способами, и нашел эту статью самой простой для понимания.

Бонус: вопреки мнению многих, всю магию транспилирования можно установить локально (используя npm install --save-dev babel-cli nodemon babel-preset-es2015 babel-preset-stage-2). Нет необходимости устанавливать Babel или какие-либо его вспомогательные модули по всему миру! Довольно изящно.

wle8300
источник