Чи нормально використовувати 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"

Відповіді:


114

Що стосується коду на стороні клієнта , ви робите правильно. babelifyйого і відправити клієнту.


Для коду на стороні сервера я б просто зробив звичайну збірку, використовуючи babel-cli

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

для Babel 6+

Станом на Babel 6 за замовчуванням жодні перетворення не включаються. Отже, почнемо з встановлення babel-cliта babel-preset-es2015.

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

Додайте перетворення до свого .babelrcфайлу - це перший модуль, який ми завантажили вище. Погляньте на повний список попередньо встановлених налаштувань, щоб побачити, які з них найкраще підходять для вас.

{
  "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

Приклад проекту, який зараз працює таким чином із вузлом server.js :), є тут, якщо комусь цікаво побачити приклад. Це приклад використання реакційного маршрутизатора, babel та alt, який я буду використовувати для реального сайту.
svnm

4
тим часом він змінився на вимогу ("babel-register"); .. у будь-якому разі я отримую "Несподіваний імпорт токена" ..
smotru

54

Я щойно написав допис у блозі на цю тему

Документація CLI Babeljs попереджає наступне:

вузол babel, не призначений для виробничого використання

Ви не повинні використовувати 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"
},

Більш детальну інформацію ви можете знайти у дописі блогу


3
Оскільки Node 4.0 підтримує ES6, чи все-таки нам потрібно використовувати babel для компіляції коду?
lvarayut

8
@LVarayut Так, залежно від особливостей, babel все ще потрібен на стороні сервера. Вузол v4.0.0 не підтримує всі функції ES6 (особливо модулі за допомогою синтаксису імпорту / експорту). Для отримання додаткової інформації по темі див. Nodejs.org/en/docs/es6 або введіть node --v8-options | grep "виконується" в терміналі, щоб отримати список ще не реалізованих функцій ES6.
jbmusso

@jbmusso Дякую за чудове пояснення :)
lvarayut

14
Babel призначений не тільки для ES6, але і для ESNext .. Тож він постійно додає функції ES7 та найновіші, як тільки вони влаштовуються в специфікації TC39.
cuadraman

15

Важливо зважити плюси і мінуси використання babel-node у виробництві.

  • babel-nodeдодає від півсекунди до однієї секунди до вартості запуску на товарному обладнанні. Але якщо ваш додаток є давно працюючим сервером, вартість запуску не матиме великого значення.
  • Спробуйте виміряти додаткове споживання пам'яті. Наприклад, для мого додатка (зчитування та обробка даних часових рядів) це було лише 20 МБ. Залежно від вашої ситуації, це може бути чи не бути суттєвим.

З іншого боку,

  • використання babel-node безпосередньо спрощує розробку - вам не знадобляться сценарії "побудови", і у вас не буде окремих src/ libі distкаталогів
  • якщо ви importз локальних файлів, чи будете ви імпортувати з src/myutilsабо з lib/myutils? Використання babel-nodeусуває цю проблему.

Я використовую Babel лише для підтримки модулів. Зараз V8 щойно випустив підтримку модулів 10 січня 2017 року. Сподіваємось, ми побачимо підтримку модулів у Node під прапором через кілька місяців, що робить мою причину використання Babel moot.


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 або будь-який з його допоміжних модулів у всьому світі! Досить витончена.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.