Skip to content

Рецепты и решения при разработке ​

Примеры используют вымышленные функции Catalog/Identity. Они показывают ответственность слоёв, а не копируют production-код другого приложения.

Добавить функцию без угадывания папок ​

  1. Независимо назовите бизнес-контекст (Catalog), агрегат (Product), границу приложения (Public) и scope (Shopping).
  2. Сгенерируйте чтение через CLI; схемы DTO нужны там, где есть входные данные для валидации.
  3. Сверьте resource/port и адаптацию ответа datasource с контрактом бэкенда.
  4. Проверьте CompositionRoot и внедрите интерфейс юзкейсов в презентер.
  5. В компоненте используйте signal/form. Транспортные детали не должны попадать в шаблон.

Пройдите полный пример композиции. В нём намеренно показана явная передача вызовов до знакомства с ClassMirror: так зависимости видны целиком.

Текущий пользователь: от middleware к реактивному классу ​

Серверная middleware проверяет авторизацию и получает публичный снимок пользователя. Запишите его в RequestContext.state, а не в общий модульный стор. Синхронный useBoot заполняет Svelte-класс с singleton-регистрацией RegisterProvider во время SSR и первой гидрации. Полный пример состояния.

Не передавайте токены, cookies, внутренние секретные данные прав или целый request event. Сериализованное в HTML значение видно браузеру. После гидрации явно обновляйте клиентское состояние при login/logout: следующий серверный запрос не синхронизирует boot-снимок автоматически.

Resource и action — разные задачи ​

Метод чтения презентера может использовать createAsyncResource, метод записи — createAsyncAction. Оба используют общую политику ошибок, но отличаются семантикой результата/исключений. createAsyncSignal в компоненте отвечает за реактивный статус запроса, createActiveForm — за редактируемые значения и отправку. Это разные слои, а не взаимозаменяемые названия fetch.

См. delivery helpers и реактивные API. Для передачи метода презентера в callback используйте closure либо bindMethods: иначе JavaScript может потерять this.

Данные SSR или только клиента? ​

Если ответ нужен в исходном HTML, используйте await server-сигнала со стабильным ключом конкретных данных. Его callback должен оставаться работоспособным при клиентской навигации/refresh: hydratable — сериализация, не граница серверного RPC. Серверные операции выносите в endpoint/remote function. См. сигналы.

Для интерактивных необязательных данных используйте обычный клиентский сигнал. Его начальный pending может удерживать связанную форму в ожидании без искусственного SSR-запроса. Используйте SvelteKit load там, где HTTP-поведение маршрута, редиректы и server-only зависимости делают его более ясной границей.

Переводы без ручных lifecycle-обёрток ​

Создайте регистрацию TranslationManager и передайте её в app.useTranslations. Приложение выполнит серверную загрузку, синхронизацию языка и клиентскую инициализацию. Экспортируйте t из менеджера для удобного импорта в компонентах; не сохраняйте готовые переводы в модульные константы. Руководство переводов.

UI-поведение без смешивания с инфраструктурой ​

Открывайте ленивую модалку из success-handler презентера/action или компонента, а не из репозитория. UI-kit поддерживает module/promise-источники компонентов и асинхронный show. Стили Slider/Cropper остаются в UI-слое; zoom/animation attachments применяются там, где нужно браузерное взаимодействие. UI-kit.

Частые ошибки ​

СимптомЧто проверить
Нет контекста запросаРазрешение зависимостей на уровне модуля или вне Kit-запроса
Состояние сбрасывается при каждом обращении в браузереScoped по умолчанию у RegisterProvider означает новый экземпляр на вызов в браузере
Утечка пользовательского состоянияИзменяемый экземпляр/результат закэширован вне запроса
Страница тянет все модули функцийСтатические импорты/общие barrels; ленивый конструктор не разбивает код
Перевод остаётся на старом языкеСтрока переведена один раз вне реактивного чтения
Helper нарушает presenter namingОбновите CLI до правил с явными признаками презентера
Вложенные типы ответа нарушают Resource namingРазместите составные типы внутри папки именованного ресурса; обновите CLI
Enum в ApiResponse требует переименовать файлТекущий CLI требует суффикс файла только внутри Enums

Практический чеклист ​

Тестируйте юзкейсы с fake-реализациями интерфейсов, адаптеры — с реальными формами ответов API, SSR — параллельными запросами двух пользователей и локалей. Отдельно проверяйте первую гидрацию и последующую навигацию, ошибки/retry и отмену запросов. Собирайте проект под фактический адаптер. Запускайте CLI и компилятор, но не принимайте зелёный lint за доказательство отсутствия утечек или production-корректности.