docs: фреймворком приложения выбран Vue 3 с роутером 5 и сборкой Vite

- заведены записка разведки docs/research/spa-framework.md со сравнением Svelte,
  Vue и React на одном экране и решение ADR-2026-08-11-spa-on-vue
- docs/conventions/web-ui.md переписан под Vue: компоненты, маршруты, состояние,
  обращение к API и показ ошибок
- закрыт вопрос «Приложение» в docs/architecture.md, уточнена задача spa-skeleton
This commit is contained in:
av
2026-08-11 14:51:55 +03:00
parent f1524fefd8
commit 54ca4c0e50
8 changed files with 324 additions and 29 deletions
+20 -7
View File
@@ -5,16 +5,20 @@
- **Зачем:** Экранов нет и собирать их нечем: ни сборки фронтенда, ни раздачи статики в проекте не существует.
- **Теги:** goal:web-access
Двигает «Завершение» цели опосредованно: сам по себе каркас пользователю ничего
не даёт, но без него ни один экран не соберётся. Видимая польза — приложение
открывается и показывает, что оно живо и кто вошёл.
Ни одной строки «Завершения» цели каркас не закрывает: он готовит четыре
экранные — 1, 2, 3 и 4, — но сам по себе пользователю ничего не даёт. Видимое от
него одно: приложение открывается и достаёт данные с живого сервера, а не отдаёт
пустую страницу.
Берётся после `spa-framework-choice`: собирать не на чем, пока фреймворк не
выбран.
Фреймворк выбран 2026-08-11 — Vue 3 с роутером пятой версии и сборкой Vite
([ADR](../../docs/adr/ADR-2026-08-11-spa-on-vue.md)); правила кода приложения
лежат в [conventions/web-ui.md](../../docs/conventions/web-ui.md).
## Затрагивает
- новый каталог фронтенда: исходники, зависимости, конфигурация сборки;
- роут, отдающий `index.html` на неизвестный путь вне `/api/`: адреса маршрутов
обычные, а не после решётки;
- `Taskfile.yml` — шаг сборки статики и его место в `task gate` и `task image`;
- `Dockerfile` — сборка статики внутри образа, чтобы выкладка не зависела от
машины разработчика;
@@ -34,10 +38,19 @@
тест либо ручная проверка на запущенном сервере с сессией.
- Шаг сборки статики входит в `task gate` и краснеет при ошибке сборки. Оракул —
намеренно сломанный исходник роняет `task gate`.
- Обновление страницы на любом маршруте приложения открывает тот же экран, а
адрес внутри `/api/` в приложение не проваливается. Оракул — тест на два
запроса: неизвестный путь вне `/api/` отдаёт разметку, неизвестный путь внутри
`/api/` отдаёт ошибку контракта.
## Рамки
Экранов, кроме заглушки с именем вошедшего, не делаем — это `upload-and-status-screen`
и `records-list-screen`. Установку на телефон не делаем — это `installable-pwa`.
Появление шага сборки в гейте меняет требования к машине разработчика: это
решение уровня ADR, и оно записывается.
Готовый набор компонентов не берём: он не выбран, а способен удвоить собранный
файл.
Шаг сборки входит в гейт и в образ решением
[ADR](../../docs/adr/ADR-2026-08-11-spa-on-vue.md) 2026-08-11 — заново это
решение не принимается. Во что слой Node обходится образу по времени и по весу,
не замерялось: замер делает эта задача.