Интеграция Vue 3 в Parcel реализуется через трансформер
@parcel/transformer-vue, который обеспечивает обработку
.vue файлов на этапе сборки. Поддерживаются Single File
Components (SFC), включающие <template>,
<script> и <style>, а также
современные возможности Vue 3, включая Composition API и
<script setup>.
Parcel использует модульную архитектуру пайплайна, где трансформеры отвечают за преобразование исходного кода в промежуточные представления. Для Vue это означает компиляцию SFC в JavaScript-модули, совместимые с системой сборки Parcel.
Основной пакет трансформации подключается вместе с Vue и компилятором SFC:
npm install vue
npm install -D @parcel/transformer-vue @vue/compiler-sfc
Parcel автоматически подключает трансформеры через конфигурацию
.parcelrc, однако наличие @vue/compiler-sfc
обязательно, так как именно он выполняет разбор Vue SFC.
Parcel использует файл .parcelrc для определения
пайплайна трансформации:
{
"extends": "@parcel/config-default",
"transformers": {
"*.vue": ["@parcel/transformer-vue"]
}
}
При отсутствии явного указания Parcel может попытаться использовать встроенные правила, однако явная декларация обеспечивает предсказуемое поведение при работе с Vue-файлами.
Vue SFC проходит несколько этапов трансформации:
Разбор .vue файла через
@vue/compiler-sfc
Разделение на блоки:
Компиляция шаблона в render-функцию
Объединение результата в JavaScript-модуль
Пример SFC:
<template>
<div class="counter">{{ count }}</div>
</template>
<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>
<style scoped>
.counter {
font-size: 20px;
}
</style>
После обработки Parcel генерирует модуль, где шаблон преобразован в
render-функцию, а логика script setup становится частью
исполняемого кода.
Поддержка <script setup> реализуется через Vue
compiler без дополнительной конфигурации. Parcel передает содержимое
блока в @vue/compiler-sfc, который выполняет
десугаринг:
ref, reactive)
сохраняют поведение Vue 3 runtimeПример преобразования:
<script setup>
import { computed } from 'vue'
const value = computed(() => 42)
</script>
После компиляции формируется эквивалент setup-функции, интегрированной в компонент.
Template-блок компилируется в render-функцию с использованием оптимизаций Vue 3:
Parcel не выполняет самостоятельную трансформацию шаблонов, а делегирует её Vue compiler, выступая как оркестратор пайплайна.
CSS внутри .vue файлов обрабатывается Parcel как
отдельный pipeline:
scoped через атрибуты data-xxxПример scoped-стилей:
<style scoped>
.button {
background: blue;
}
</style>
Parcel преобразует стили в изолированные правила, предотвращая утечку селекторов между компонентами.
Поддержка TypeScript реализуется через комбинацию трансформеров Parcel и Vue compiler:
<script setup lang="ts">
import { ref } from 'vue'
const count = ref<number>(0)
</script>
При использовании lang="ts":
Parcel обеспечивает HMR для Vue компонентов без дополнительной настройки.
Механизм обновления:
.vue файловОсобенности поведения:
При production-сборке Parcel активирует оптимизации:
Компоненты Vue становятся отдельными чанками при динамическом импорте:
const AsyncComponent = () => import('./MyComponent.vue')
Parcel автоматически выделяет отдельный bundle для такого компонента.
Parcel использует resolver для обработки импортов внутри Vue файлов:
import в <script setup> разрешается
через стандартный resolver Parcel.parcelrc или
package.json.vue модулям резолвятся как ES modulesПример алиасов:
{
"@parcel/resolver-default": {
"alias": {
"@components": "./src/components"
}
}
}
Некоторые сценарии требуют точной конфигурации пайплайна:
Ошибка возникает при попытке компиляции SFC без установленного компилятора Vue.
Vue 3 требует @vue/compiler-sfc@^3.x. Несовместимость с
Vue 2 приводит к ошибкам парсинга template.
Отсутствие transformer для .vue приводит к восприятию
файла как обычного текста.
При отсутствии корректной обработки CSS возможно дублирование стилей между компонентами.
Vue transformer интегрируется в общий pipeline Parcel:
.vue файл@parcel/transformer-vueТакая архитектура обеспечивает единый подход к обработке Vue, React, TypeScript и CSS без отдельных конфигурационных систем для каждого фреймворка.