Рецепты и решения при разработке
Примеры используют вымышленные функции Catalog/Identity. Они показывают ответственность слоёв, а не копируют production-код другого приложения.
Добавить функцию без угадывания папок
- Независимо назовите бизнес-контекст (Catalog), агрегат (Product), границу приложения (Public) и scope (Shopping).
- Сгенерируйте чтение через CLI; схемы DTO нужны там, где есть входные данные для валидации.
- Сверьте resource/port и адаптацию ответа datasource с контрактом бэкенда.
- Проверьте CompositionRoot и внедрите интерфейс юзкейсов в презентер.
- В компоненте используйте 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-корректности.