Parcel функционирует как zero-configuration сборщик, автоматически анализирующий зависимости приложения и формирующий оптимизированный граф модулей. При использовании Web Components и библиотеки Lit он особенно эффективно обрабатывает модульную структуру, обеспечивая быстрые сборки, горячую замену модулей и встроенную поддержку современных стандартов JavaScript.
Web Components опираются на нативные браузерные API: Custom Elements, Shadow DOM и HTML Templates. Parcel не вмешивается в их рантайм-логику, а работает на уровне сборки, трансформируя исходный код, стили и зависимости.
Ключевая особенность связки Parcel + Lit заключается в минимальном пороге конфигурации: компоненты пишутся как ES-модули, а сборщик автоматически выполняет транспиляцию, бандлинг и оптимизацию без ручной настройки пайплайна.
Web Components регистрируются через
customElements.define, после чего становятся частью DOM
API. Parcel воспринимает такие модули как обычные ES-модули.
Основные этапы обработки:
Shadow DOM при этом остаётся полностью на стороне браузера, а Parcel не изменяет его поведение.
Lit предоставляет минималистичный реактивный слой поверх Web Components. Основные принципы:
Parcel не требует специальных плагинов для Lit, так как библиотека не зависит от нестандартного синтаксиса. Однако при использовании TypeScript или экспериментальных декораторов могут подключаться соответствующие трансформации.
Структура проекта обычно опирается на стандартные ES-модули:
src/
components/
app-root.js
my-button.js
index.html
Parcel автоматически определяет entry point через
index.html.
npm init -y
npm install parcel
npm install lit
Компонент реализуется через класс, наследующий
LitElement.
import { LitElement, html, css } from 'lit';
class MyButton extends LitElement {
static properties = {
label: { type: String },
disabled: { type: Boolean }
};
static styles = css`
button {
padding: 8px 12px;
border: none;
border-radius: 6px;
cursor: pointer;
}
button[disabled] {
opacity: 0.5;
cursor: not-allowed;
}
`;
constructor() {
super();
this.label = 'Click';
this.disabled = false;
}
render() {
return html`
<button ?disabled=${this.disabled}>
${this.label}
</button>
`;
}
}
customElements.define('my-button', MyButton);
Parcel автоматически обрабатывает этот модуль, включая CSS-in-JS
внутри Lit.
import './components/my-button.js';
const root = document.getElementById('app');
root.innerHTML = `
<my-button label="Submit"></my-button>
`;
Parcel связывает модульную структуру и гарантирует, что компонент будет включён в итоговый бандл.
Web Components инкапсулируют стили через Shadow DOM, что исключает глобальные конфликты CSS.
Lit использует:
styles для scoped CSScss tagged literalParcel в этом процессе выполняет только упаковку CSS внутри JS-модулей или отдельную экстракцию при production-сборке.
Parcel обеспечивает HMR для компонентов Lit без полной перезагрузки страницы.
Особенности:
При изменении шаблона Lit обновляет только затронутые части DOM через свой реактивный механизм.
Parcel поддерживает TypeScript из коробки.
Пример компонента:
import { LitElement, html, css } from 'lit';
import { property } from 'lit/decorators.js';
class CounterElement extends LitElement {
@property({ type: Number })
count = 0;
static styles = css`
span {
font-weight: bold;
}
`;
private increment() {
this.count++;
}
render() {
return html`
<span>${this.count}</span>
<button @click=${this.increment}>+</button>
`;
}
}
customElements.define('counter-element', CounterElement);
Parcel автоматически транспилирует декораторы при соответствующей конфигурации TypeScript.
Parcel поддерживает автоматическое разделение кода на чанки на уровне ES dynamic imports.
button.addEventListener('click', async () => {
const module = await import('./heavy-component.js');
customElements.define('heavy-component', module.HeavyComponent);
});
Это позволяет:
Parcel выполняет ряд оптимизаций:
В production-режиме активируется агрессивная оптимизация графа зависимостей.
Web Components и Lit часто используются для построения дизайн-систем, где каждый компонент является автономным модулем.
Parcel обеспечивает:
Структура:
components/
button/
input/
modal/
index.js
Каждый компонент экспортируется как отдельный модуль, что позволяет использовать их независимо.
Parcel позволяет импортировать ассеты напрямую в компоненты:
import logo from './logo.png';
render() {
return html`<img src=${logo} />`;
}
Аналогично обрабатываются:
Это упрощает инкапсуляцию компонентов без внешних зависимостей.
Parcel минимизирует необходимость конфигурации, но поддерживает:
.env переменныеLit при этом остаётся независимым слоем и не требует специальных адаптеров.
В production режиме Parcel:
Результирующая сборка ориентирована на браузерное выполнение без дополнительного runtime.
Компоненты Lit, собранные через Parcel, остаются полностью независимыми от фреймворков:
Parcel не добавляет фреймворк-специфичных обёрток, сохраняя универсальность Web Components слоя.