Границы
Что ломает загрузку модуля или сборку фронта
Правила ниже проверяются автоматически: нарушение видно сразу, а не через месяц в проде.
Пространства имён
id модуля задаёт префиксы для таблиц, настроек, прав, строк и маршрутов. Модуль, который лезет за свои префиксы, не загружается — причина пишется в лог и показывается на странице «Модули». Так удаление модуля остаётся чистым: ядро знает, что именно ему принадлежит.
Имена компонентов
Компонент без префикса роняет сборку
components/Button.vue в слое молча перекрыл бы Button из PrimeVue во всём приложении — не только на страницах модуля. Поэтому componentPrefix обязателен, а совпадение имени с компонентом PrimeVue или ядра останавливает сборку с явным сообщением.
Компоненты PrimeVue
В сборку попадают только те компоненты PrimeVue, которые действительно используются: перед сборкой шаблоны ядра и всех подключённых слоёв сканируются, найденное подтягивается вместе с внутренними зависимостями. Компонент, который подставляется строкой (<component :is="'Select'" />), так не находится — пишите обычный тег.
Слоты и места навигации
Неизвестное имя слота или места ядро сообщает в консоли при регистрации модуля. Опечатка не превращается в молча пустой экран.
Компонент в слот передаётся импортом, а не именем: строка резолвится только для компонентов, объявленных в слое с global: true, и на собранном фронте даёт пустое место без единой ошибки.
Зависимости
Модулям нельзя объявлять зависимости, которые уже есть у сервера. При nodeLinker: hoisted чужая версия общего пакета поднимется в корень и сломает ядро: два экземпляра @nestjs/common или typeorm в одном процессе не живут.
Если пакет нужен и он уже есть у ядра — просто импортируйте, резолв найдёт корневой.
Guard'ы и валидация
Глобальные гварды закрывают все маршруты, включая маршруты модулей: публичной ручке нужен @Public(). Глобальный ValidationPipe({ whitelist: true }) вырезает поля, не описанные через class-validator, — опишите DTO целиком, иначе значения не дойдут до обработчика.
Что расширение не может
| Хотелось бы | Почему нельзя |
|---|---|
| Переключать тему в рантайме | Слои Nuxt резолвятся на сборке; после смены темы фронт пересобирается |
| Подменить страницу ядра из модуля | Подмена страниц — работа темы, у модуля свои страницы внутри /mod/<id> |
| Импортировать код сервера напрямую | Ядро поставляется собранным и обфусцированным, исходников в поставке нет |
| Обойтись без перезапуска сервера | Nest строит граф зависимостей один раз при старте |