2

Webpack hot reloading (webpack-hot-middleware) прекрасно работает для клиента; он восстанавливает и обновляет активы на клиенте всякий раз, когда файл изменяется. Но для универсальных/изоморфных серверов, где серверу требуется предварительный ответ HTML, это очень сложно.webpack - перезагрузка горячего модуля на сервере

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

Немного лучшее решение для ручного просмотра активов (например, с помощью chokidar) и очистки кеша/необходимости снова после изменения файла. Но для этого требуется дополнительная сложность, когда необходимо следить за зависимостями; файлы должны быть проанализированы, чтобы определить, что им требуется.

Кроме того, если код написан на языке компиляции в js, лучше всего запустить скомпилированный сервер для производства (не более babel-node). С скомпилированный сервером, он больше не является возможным использовать механизм, описанный выше, потому что:

  • WebPack имеет плохую поддержку динамических требует: require(variable) в отличие от require('./file.js')
  • узел не может напрямую требовать код

В моем случае я отменил функцию require в пакете, который использует babel-register ed require (ранее я использовал API-интерфейс babel, но полагался на много недокументированного источника узла).

Это решение, которое я использую в настоящее время в https://github.com/edge/cyc, которое работает несколько, но оно беспорядочно и имеет множество предостережений. В общем, чем больше пользовательского кода, написанного параллельно webpack, тем дальше от желаемого поведения.

Есть ли надежный способ более простого дублирования поведения webpack?

ответ

1

Я написал package, который может немного помочь. Вы можете использовать if (module.hot) {...} в своих кодах сервера.

Вкратце, в конфигурации webpack этот function создает сервер как разветвленный процесс. Если исходные файлы меняются, веб-пакет повторно компилируется и отправляет сигнал дочернему процессу. В ваших кодах сервера вы можете включить if (module.hot) {... module.hot.accept(...) ...}, чтобы принять или отклонить обновление.

Если вы согласны с обновлением, не забудьте удалить все возможные побочные эффекты. При отказе сервер снова будет перезапущен.

Я все еще учусь ... надеюсь, что это помогает

1

Я недавно потушить webpack-hot-server-middleware, который предназначен для использования вместе с webpack-dev-middleware (и, возможно, webpack-hot-middleware).

Это очень простой подход, позволяющий вам быстро обновлять пакет рендеринга серверов без необходимости перезапускать процесс или делать что-либо особенно особенное с вашим кодом.