Компонент во Vue.js существует как обычный JavaScript-объект или функция, но становится доступным в шаблонах только после регистрации. Регистрация определяет область видимости компонента: где именно его можно использовать — во всём приложении или только внутри конкретного компонента. Во Vue предусмотрены два подхода: глобальная и локальная регистрация.
Глобальная регистрация делает компонент доступным во всех шаблонах приложения, независимо от иерархии компонентов.
Во Vue 3 глобальная регистрация выполняется через экземпляр приложения:
import { createApp } from 'vue'
import App from './App.vue'
import BaseButton from './components/BaseButton.vue'
const app = createApp(App)
app.component('BaseButton', BaseButton)
app.mount('#app')
После этого компонент <BaseButton> может
использоваться в любом шаблоне без дополнительного импорта.
Для глобально регистрируемых компонентов используется соглашение Base / App / The:
BaseButtonBaseInputAppHeaderTheSidebarЭто подчёркивает их универсальный характер и предотвращает конфликты имён.
Глобальная регистрация удобна, но при масштабировании проекта создаёт ряд архитектурных сложностей:
Неявные зависимости По шаблону невозможно понять, откуда появился компонент.
Рост общего пространства имён При большом количестве компонентов повышается риск конфликтов.
Потеря контроля над использованием Компоненты могут применяться там, где это не планировалось.
Снижение оптимизаций сборки Некоторые компоненты попадают в финальный бандл даже без фактического использования.
По этим причинам глобальную регистрацию применяют ограниченно.
Локальная регистрация ограничивает область видимости компонента одним родительским компонентом. Это основной и рекомендуемый способ работы с компонентами.
import UserCard from './UserCard.vue'
export default {
components: {
UserCard
}
}
Теперь <UserCard> доступен только внутри шаблона
данного компонента.
<template>
<div>
<UserCard />
</div>
</template>
Локальная регистрация делает структуру приложения предсказуемой и управляемой.
<script setup>В Vue 3 с использованием Composition API и
<script setup> локальная регистрация выполняется
автоматически.
<script setup>
import UserCard from './UserCard.vue'
</script>
<template>
<UserCard />
</template>
Импортированный компонент сразу доступен в шаблоне без объекта
components. Это снижает шаблонный код и уменьшает
вероятность ошибок.
Локально зарегистрированный компонент:
Это обеспечивает строгий контроль над использованием компонентов.
Часто глобальная регистрация используется внутри плагинов:
export default {
install(app) {
app.component('BaseButton', BaseButton)
app.component('BaseModal', BaseModal)
}
}
Подключение:
app.use(BaseComponents)
Такой подход централизует глобальные компоненты и делает их подключение явным.
В некоторых проектах применяется автоматическая регистрация компонентов через динамический импорт:
const components = import.meta.glob('./components/base/*.vue', { eager: true })
for (const path in components) {
const component = components[path].default
app.component(component.name, component)
}
Метод удобен, но снижает прозрачность структуры и требует строгой дисциплины в именовании компонентов.
Глобальная регистрация
Локальная регистрация
Использовать локальную регистрацию по умолчанию
Глобально регистрировать только:
Хранить глобальную регистрацию в одном месте
Использовать <script setup> для упрощения
кода
Такой подход сохраняет баланс между удобством и архитектурной строгостью.