Можно ли динамически настроить `publicPath` в браузере с помощью webpack?

У меня есть проект, в котором я развертываю один и тот же пакет JSP для веб-пакетов в разных средах. В некоторых средах используется CDN для обслуживания статических активов, таких как JS файлы, а некоторые из них не имеют и просто имеют статические активы, которые обслуживаются из того же корня, что и остальная часть проекта.

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

При развертывании в не-cdn webpack отлично работает со статически настроенным publicPath в моей конфигурации webpack, обслуживающей все, что-то вроде /static/.

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

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

Мое серверное приложение предоставляет глобальный javascript, описывающий корневой путь CDN по строкам window.staticCDNRoot. И этот глобальный также присутствует в ситуациях, отличных от cdn, просто указывая на сервер приложений - поэтому он всегда разрешает правильное местоположение для загрузки статических активов.

Есть ли способ заставить Webpack использовать это во время выполнения, чтобы publicPath стал window.staticCDNRoot + publicPath без огромного хакера?

Или есть ли лучшее решение этой проблемы?

Ответ 1

Хорошо, поэтому я искал это весь день, а затем нашел его сразу после принятия решения о публикации здесь.

На всякий случай кому-то это понадобится:

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

Подробнее здесь:

http://webpack.github.io/docs/configuration.html#output-publicpath