Для различных небольших демо я постоянно использую Parcel. Parcel - "zero configuration bundler" и это правда. Никаких конфигов, все работает из коробки и очень быстро. Если ты не пробовал Parcel, то обязательно попробуй.
Можно ли использовать Parcel в крупном проекте? Сложно ли переехать с Webpack на Parcel?
У меня выпала возможность это проверить.
Был у меня один проект для сборки которого использовался еще Webpack первой версии. И когда я начал обновлять Webpack и лоадеры, я понял, что проще написать все с нуля, чем исправлять существующую конфигурацию и зависимости. Если уже все равно все делать с нуля, то почему бы не подключить Parcel? 🙂
Что у меня было: Babel, JSX, ES6 modules, Less. Точкой входа был файл main.js.
Задача перевести все на Parcel с минимальным количеством плагинов и конфигурацией по умолчанию, с точкой входа index.html.
Делал я это в 2 этапа:
Этап 1: Перевести все на Parcel, но оставить точкой входа main.js
Этап 2: Поменять точку входа на index.html
Естественно, все из коробки не завелось, но в итоге все заработало. Давайте по порядку. Просто поделюсь со списком проблем, которые возникли и как удалось их решить, возможно мой опыт будет кому-то полезен.
Первый этап оказался сильно проще, чем второй и возникло всего 2 проблемы 🙂.
1️⃣ Перевести все на Parcel, но оставить точкой входа main.js
Проблема №1: В некоторых случаях перестал работать импорт функций (локализации и других утилит).
Этот код перестал работать, хотя до этого работал:
import { l } from '../i18n';Проблема оказалась в том, что в модуле i18n экспорт выглядел вот так:
export default {
l(text) {
return jed.gettext(text);
}
};Соответственно нужно было бы переписать на:
export function l(text) {
return jed.gettext(text);
};но после этого перестал работать код вида:
import i18n from '../i18n';
Чтобы это завелось, пришлось привести модуль i18n к такому виду:
export function l(text) {
return jed.gettext(text);
};
export default {
l
};По сути нужно было привести модули ES6 к корректному виду (их было 2-3 таких).
Проблема №2: Загрузка статики с неправильных путей.
В проекте была такая структура директорий для статики:
public/
index.html
static/
3d-party/
lang/
en.json
ru.json
uk.json
favicon.ico
build/
main.js
main.css
...
и соответственно пути в index.html выглядели так /static/build/main.js .
Все, что нужно было - это указать нужные аргументы командной строки для Parcel.
Финальная команда выглядела так:
parcel watch \
--out-dir publiс/static/build \
--public-url /static/build \
src/main.js
и после этого с точкой входа через main.js все заработало.
Осталось запустить http сервер для раздачи статики из папки public. Я использую для этого node-static (всегда установлен у меня глобально в систему).
cd public
// запустить в режиме SPA
// если запрашиваемого файла нет,
// то всегда возвращает index.html
static --spa -p 8090
Со вторым этапом все сложнее оказалось, опишу завтра 🙂