Как я переезжал с Webpack на Parcel - часть 3
✳️
Часть 1
✳️
Часть 2
Я обычно не пакую файл конфигурации в билд. Конфиг я загружаю таким образом:
<script type='text/javascript' src="/config.js"></script>
сам "/config.js" выглядит так:
window.APP_CONFIG = {
// my configuration here
};
и прячу его за модулем "src/config.js", чтобы код не ходил в глобальную переменную.
// src/config.js
export default window.APP_CONFIG;
такой подход позволяет использовать один и тот же билд в разных окружениях. Билд один, но для каждого окружения свой конфиг (по модели 12 factor app). Идея - выкатывать в прод только те билды, которые были протестированы.
И вот такое практически невозможно заставить работать в Parcel. Это оказался целый квест :)
То есть, если вы напишите:
<script type='text/javascript' src="/config.js"></script>
И вас нет файла config.js, то Parcel ругнется ошикой, а если config.js есть, то он попадет в бандл, что нас тоже не устраивает.
Я начал искать решение и оказалось, что на эту тему много issues (например,
https://github.com/parcel-bundler/parcel/issues/144), но разработчики не добавляют такую фичу. Кто-то пытается писать дополнительные плагины для решения проблемы, но плагины оказались не сильно высокого качества.
Затем я попробовал
posthtml с плагином "include", но в итоге все, что мы инклудим точно также процессится Parcel-ом.
Потом я подумал, почему не грузить динамически конфиг и написал такой код:
const script = document.createElement("script");
script.async = false;
script.type = "text/javascript";
script.src = "/config.js";
document.head.appendChild(script);
Но этот код не заработал, поскольку файл с конфигом выполнялся после main.js даже с опцией async=false.
В итоге, вот такое решение заработало:
<script type='text/javascript'>
document.write(`<${"script"} src="/config.js"> </${"script"}>`);
</script>
Что дальше? Сейчас для меня Parcel - это вариант по умолчанию, использую webpack только когда появляется необходимость в специфических фичах (например, для изоморфных приложений).
В итоге все сложилось, результатом я более чем доволен. Ну и возможно когда-то появится более законный способ исключить процессинг конфига.
Надеюсь, что этот опыт будет полезен читателям канала 🙂