feat: add json-ld

This commit is contained in:
2026-10-12 17:07:59 +05:00
parent 4bb4efd29b
commit 1981afbc64
7 changed files with 163 additions and 5 deletions
+10
View File
@@ -34,6 +34,16 @@
правило такое (запретить toContain без i18n)
- [ ] посмотреть ошибки e2e, разрешить запускать е2е без ручного подтверждения,
и рассмотреть - может уже пора включить их в ci\cd гейт
- [ ] пересмотреть `{@html}` в `web/src/lib/components/JsonLd.svelte`: сейчас
там инлайновый `eslint-disable-next-line svelte/no-at-html-tags`, потому
что `<script>{json}</script>` не подставляет значение (Svelte читает
содержимое script как raw text — это видно по ошибке «'json' is assigned a
value but never used»), а другой способ вставки разметки в Svelte нет.
Варианты к рассмотрению: исключение для файла в `web/eslint.config.js`
вместо suppress'а в коде; генерация JSON-LD на этапе сборки рядом с
sitemap (`web/scripts/gen-sitemap.mjs`); отказ от компонента. Критерий
закрытия: в production-коде нет `eslint-disable`, и разметка продолжает
попадать в собранный HTML
## Pipeline
+12 -5
View File
@@ -326,11 +326,18 @@
### S3. Структурированные данные + GEO
- [ ] **[S3a]** JSON-LD: `SoftwareApplication` (+ `offers` price 0) и `FAQPage`
на страницах инструментов; `WebSite` + `Organization` на главной;
`BreadcrumbList` на всех внутренних. Учесть: Google ограничил rich results
по FAQ/HowTo для мелких сайтов — разметка нужна прежде всего для
LLM-парсинга, она безвредна.
- [x] **[S3a]** JSON-LD — на странице инструмента `SoftwareApplication`
(`offers` price 0), `FAQPage` (из уже написанного FAQ) и `BreadcrumbList`
(из тех же крошек, что видны в UI); на главной — `WebSite` +
`Organization`; на каталоге — `BreadcrumbList`. Построители в
`web/src/lib/seo.ts`, вывод — `web/src/lib/components/JsonLd.svelte`.
Проверено на сборке: три разбора в `build/tools/crop-png.html`, FAQPage с
4 вопросами, два узла на главной. **Известная грязь:** в `JsonLd.svelte`
инлайновый `eslint-disable svelte/no-at-html-tags` — `{@html}`
единственный способ вставить значение в Svelte, а
`<script>{json}</script>` не работает (Svelte читает содержимое script как
raw text). Suppress обоснован экранированием `<` в `\u003c`, но
пересмотрен не позже: задача в `docs/backlog.md`, раздел «Тесты и lint».
- [ ] **[S3b]** `llms.txt` в статике: короткий манифест сайта + список
инструментов с одним предложением на каждый (генерится из реестра тем же
скриптом, что sitemap).