Можно ли использовать вавилонский узел в производстве
Я разрабатывал сайт, используя babel-node и browserify с преобразованием 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"
Вот мои зависимости от dev
"babel": "^4.0.1",
"babelify": "^5.0.3",
"browserify": "^8.0.3"
4 ответа:
Для кода на стороне клиента Вы делаете правильную вещь.
babelify
это и отправить его клиенту.
Для кода на стороне сервера я бы просто сделал обычную сборку с использованием babel-cli
Согласно http://babeljs.io/docs/setup/#babel_register,
babel-register
не предназначен для производственного использования - требуемый крюк в первую очередь рекомендуется для простых случаев.Для Вавилона 6+
По состоянию на Вавилон 6, по умолчанию никакие преобразования не включаются. Итак, давайте начнем с установки
babel-cli
иbabel-preset-es2015
.$ npm install --save-dev babel-cli babel-preset-es2015
Добавьте преобразование в ваш файл
.babelrc
- это модуль prest, который мы загрузили выше. Взгляните на полный список пресетов, чтобы увидеть, какие из них лучше всего подходят для вас.{ "presets": ["es2015"] }
Добавьте скрипт
build
к вашемуpackage.json
. Нижеsrc
находятся ваши входные файлы, аbuild
- преобразованные выходные файлы"scripts": { "build": "babel src -d build" }
Тогда постройте его!
$ npm run build
Затем запустите ваш код. На этом этапе вы захотите выполнить файлы в вашем каталоге
build
$ npm start
Для Babel
require("babel/register");
Все последующие файлы, требуемые узлом с расширениями . es6, .Эс, .jsx и .js будет преобразован Вавилоном. Полифилл также требуется автоматически.
Вы сможете хранить исходные файлы в ES6, но все равно выполнять их с помощью
node server.js
Судя по Вашим комментариям, у вас, кажется, возникли небольшие проблемы. Обратите особое внимание на желтую выделенную часть выше. Ваш первый файл может быть только ES5, который запускается самим узлом. Все последующие требованиябудут преобразованы Бабелем...Вот как может выглядеть типичная установка
Сервер.js
// only ES5 is allowed in this file require("babel/register"); // other babel configuration, if necessary // load your app var app = require("./app.js");
Приложение.js
// this file will be loaded through babel // you can now use ES6 here and in every other include
Разожги огонь!
$ node server.js
Я только что написал сообщение в блоге на эту тему
Документация Babeljs CLI предупреждает следующее:
Вавилон-узел, не предназначенный для производственного использования
Вы не должны использовать 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" },
Важно взвесить все " за " и "против" использования вавилонского узла в производстве.
babel-node
добавляет от половины секунды до одной секунды к стоимости запуска, на товарном оборудовании. Но если ваше приложение является долго работающим сервером, то стоимость запуска не будет иметь большого значения.- попробуйте измерить потребление дополнительной памяти. Для моего приложения, например (чтение и обработка данных временных рядов), это было всего 20 МБ. В зависимости от вашей ситуации, это может быть или не быть значительное.
С другой стороны,
- использование babel-node напрямую упрощает разработку-вам не нужно будет "строить" скрипты, и у вас не будет отдельных
src
/lib
иdist
каталоги- Если вы
import
из локальных файлов, вы будете импортировать изsrc/myutils
или изlib/myutils
? Использованиеbabel-node
устраняет эту проблему.Я использую Babel только для поддержки модулей. Теперь V8 только что выпустила поддержку модулей10 января 2017 года. Надеюсь, мы увидим модули. поддержка в узле под флагом через несколько месяцев, что делает мою причину использования Babel спорной.
Ответ@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 или любой из его вспомогательных модулей глобально! Довольно изящно.