Parcel использует систему трансформеров, позволяющую обрабатывать
файлы различных типов через подключаемые плагины. Для Svelte-компонентов
предназначен пакет @parcel/transformer-svelte, который
интегрирует компиляцию .svelte файлов в граф сборки Parcel
и обеспечивает их преобразование в JavaScript-модули с поддержкой
реактивности, scoped-стилей и дополнительных возможностей фреймворка
Svelte.
Parcel работает по принципу графа зависимостей, где каждый файл
проходит через цепочку трансформеров.
@parcel/transformer-svelte выполняет ключевую задачу —
компиляцию Svelte Single File Components в исполняемый
JavaScript-код.
Общий процесс включает несколько этапов:
.svelte файла как assetВ отличие от ручной настройки Svelte + bundler, Parcel автоматически управляет зависимостями внутри компонента, включая:
Для интеграции используется пакет
@parcel/transformer-svelte, который устанавливается как dev
dependency:
npm install -D @parcel/transformer-svelte svelte
Parcel автоматически распознаёт .svelte файлы после
установки плагина, если конфигурация не переопределена через
.parcelrc.
Базовая конфигурация .parcelrc выглядит следующим
образом:
{
"extends": "@parcel/config-default",
"transformers": {
"*.svelte": ["@parcel/transformer-svelte"]
}
}
Parcel использует расширение файла как ключ маршрутизации трансформера. При наличии нескольких трансформеров порядок влияет на итоговую компиляцию, поэтому Svelte обычно ставится до JavaScript-трансформаций.
Svelte-компонент содержит три основные секции:
<script> — логика<style> — scoped CSSПример:
<script>
let count = 0;
function increment() {
count += 1;
}
</script>
<button on:click={increment}>
Count: {count}
</button>
<style>
button {
padding: 8px 12px;
border-radius: 6px;
}
</style>
@parcel/transformer-svelte преобразует этот компонент в
JavaScript-модуль, в котором:
Результат становится частью бандла Parcel без необходимости дополнительной обработки.
Parcel анализирует импортируемые модули внутри
<script>:
<script>
import { format } from './utils.js';
</script>
Каждый импорт добавляется в граф зависимостей Parcel. Это позволяет:
Также поддерживаются алиасы, определённые в Parcel config
(package.json или .parcelrc через
резолверы).
Svelte и Parcel совместно обеспечивают granular HMR, где обновляются только изменённые компоненты.
@parcel/transformer-svelte генерирует HMR-API
вызовы:
Пример поведения:
<style> — обновляется только CSS<script> — пересоздаётся логика
компонентаParcel обеспечивает доставку обновлений через WebSocket-сервер разработки.
Svelte поддерживает scoped CSS, и трансформер Parcel учитывает это при компиляции.
<style>
.box {
color: red;
}
</style>
После трансформации:
Если подключены preprocessors (например, PostCSS), Parcel применяет их до или после Svelte-компиляции в зависимости от конфигурации pipeline.
@parcel/transformer-svelte может работать с
препроцессорами через Svelte preprocess API.
Поддерживаются:
<script lang="ts"><style lang="scss">Пример с TypeScript:
<script lang="ts">
let message: string = 'Hello';
function setMessage(value: string) {
message = value;
}
</script>
Parcel передаёт файл в Svelte compiler уже после применения соответствующего preprocess этапа.
При использовании TypeScript Parcel обрабатывает цепочку:
Важно, что типизация удаляется до runtime, но используется для проверки на этапе сборки.
Parcel применяет несколько уровней оптимизации:
@parcel/transformer-svelte дополнительно уменьшает
нагрузку за счёт повторного использования AST при частичных
изменениях.
Svelte поддерживает SSR, и Parcel может участвовать в серверной сборке через отдельный target.
При SSR:
Пример различия:
// client build
import App from './App.svelte';
// server build
import { render } from './App.svelte';
Parcel различает окружение через targets в конфигурации.
Parcel активно использует файловый кэш. Для Svelte это особенно важно:
Кэш хранится в .parcel-cache и может быть инвалидирован
при изменении зависимостей или конфигурации трансформера.
При использовании @parcel/transformer-svelte встречаются
характерные сценарии:
1. Несовпадение версии Svelte Трансформер зависит от
установленной версии svelte. Несовместимость может привести
к ошибкам компиляции.
2. Конфликт preprocessors При одновременном использовании нескольких preprocess-слоёв порядок обработки становится критичным.
3. HMR сброс состояния Если изменяется структура компонента (например, добавляются/удаляются элементы), Parcel пересоздаёт компонент полностью.
4. Alias resolution Некорректные алиасы могут приводить к двойной загрузке зависимостей внутри Svelte компонентов.
Svelte-трансформер часто работает совместно с:
@parcel/transformer-js@parcel/transformer-typescript-tsc@parcel/transformer-postcss@parcel/optimizer-terserПайплайн формируется автоматически, но может быть переопределён через
.parcelrc.
Пример цепочки:
.svelte → Svelte transformer → JS transformer → optimizer → bundle
Parcel оптимизирует Svelte сборки за счёт:
При больших приложениях основная нагрузка распределяется между worker-процессами Parcel, что снижает время полной сборки.
@parcel/transformer-svelte может быть расширен
через:
Пример передачи опций:
{
"transformers": {
"*.svelte": {
"package": "@parcel/transformer-svelte",
"options": {
"dev": true
}
}
}
}
Эти параметры влияют на режим компиляции и поведение runtime.
Svelte-трансформер является специализированным адаптером между декларативным компонентным синтаксисом и системой модульной сборки Parcel. Он обеспечивает: