Почему в производстве не следует использовать babel-w630?

babel- node docs несут строгое предупреждение:

Не предназначен для использования в производстве

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

Давайте сломаем это:

  • Использование памяти - да? Все модули "кэшируются" в памяти в течение всего срока службы вашего приложения. Что они здесь получают?

  • Старт-аут - как это проблема производительности? Развертывание веб-приложения уже занимает несколько секунд (или минут, если вы тестируете в CI). Добавление половины времени к запуску ничего не значит. Фактически, если время запуска имеет значение где угодно, это имеет большее значение в развитии, чем производство. Если вы перезагружаете свой веб-сервер достаточно часто, чтобы время запуска было проблемой, у вас возникли гораздо большие проблемы.

Кроме того, нет такого предупреждения об использовании Babel потребовать hook (require('babel-register')) в производстве, хотя это, по-видимому, делает в значительной степени точно так же, как babel- node. Например, вы можете сделать node -r babel-register server.js и получить то же поведение, что и babel-node server.js. (Моя компания делает это именно в сотнях микросервисов, без проблем.)

Является ли Babel предупреждением только FUD, или я что-то упускаю? И если предупреждение действительно, почему он также не применим к Вавилону, требуется перехват?


Связанный: Можно ли использовать babel- node в производстве? - но этот вопрос просто спрашивает, рекомендуется ли использовать производство, а ответы просто цитируют официальный совет, т.е. "Нет". Напротив, я ставил под сомнение обоснование официального совета.

Ответ 1

babel- node

Предупреждение о производстве было добавлено для разрешения этой проблемы:

Без модуля kexec вы можете попасть в действительно уродливую ситуацию, когда ребенок_процесс умирает, но его смерть или ошибка никогда не пузырится. Для получения дополнительной информации см. https://github.com/babel/babel/issues/2137.

Было бы здорово, если бы в docs на babel-w631 объяснили, что он не предназначен для производства и что без установки kexec у него плохое поведение.

(акцент мой)

Ссылка на исходный номер # 2137 мертва, но вы можете найти здесь здесь.

Таким образом, здесь есть две проблемы:

  • "очень большое использование памяти в больших приложениях"
  • "без установки kexec, что у него плохое поведение"

Эти проблемы приводят к предупреждению о производстве.

Бабель-регистр

Кроме того, нет такого предупреждения о том, что использование Babel требует hook (require ('babel-register')) в производстве

Не может быть предупреждения, но это не рекомендуется. См. эта проблема:

babel-register в первую очередь рекомендуется для простых случаев. Если у вас проблемы с ним, кажется, что изменение рабочего процесса на один, построенный вокруг наблюдателя файлов, будет идеальным. Обратите внимание, что мы также никогда не рекомендуем babel-register для производственных случаев.

Ответ 2

Я не знаю достаточно о babel и node внутренних, чтобы дать полный ответ; некоторые из них - это спекуляция, но кэширование babel-w631 будет делать не то же самое, что делает кеш node.

Кэш-память

babel- node - это еще один кэш поверх node требует кеша, и в лучшем случае он должен кэшировать полученный исходный код (до того, как он будет отправлен на node).

Я полагаю, что node кэш, после оценки модуля, будет кэшировать вещи, доступные из экспорта, или, скорее, вещи, которые не достижимы больше, будут в конечном итоге GCed.

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

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