# support-prerendering

Настраивает интерактивные компоненты Blazor для работы с пререндерингом. Помогает устранить повторную загрузку данных, мерцание интерфейса и ошибки null при переходе в интерактивный режим.

- скилл · `type=skill` · Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode · 3000 установок · ★ 5730
- Автор: dotnet
- Лицензия: MIT · policy=mirror · лицензия открытая, файл — в исходнике
- Исходник: https://github.com/dotnet/skills/tree/HEAD/plugins/dotnet-blazor/skills/support-prerendering/SKILL.md
- Обновлён: 2026-10-24
- HTML: https://affpapa.org/nevibecode/skills/support-prerendering

## Что делает

Скилл учит агента работать с интерактивными компонентами Blazor в режимах Server, WebAssembly и Auto, где пререндеринг включён по умолчанию. При таком сценарии метод `OnInitializedAsync` выполняется дважды: сначала на сервере для формирования статичного HTML, а затем при подключении интерактивного рантайма. Инструкция показывает, как сохранять состояние между этими фазами через атрибут `[PersistentState]` или сервис `PersistentComponentState`, предотвращая мерцание интерфейса и повторные запросы в базу данных.

Внутри описано отключение пререндеринга через параметр `prerender: false` на уровне отдельного компонента или в файле `App.razor`. Скилл также разбирает изоляцию страниц атрибутом `[ExcludeFromInteractiveRouting]` для прямого доступа к `HttpContext`. Отдельное внимание уделено клиентским сервисам из проекта `.Client`, которые вызывают исключения на сервере, если не зарегистрированы в основном контейнере зависимостей.

Вызовы JS interop внутри `OnInitializedAsync` гарантированно приведут к сбою, потому что JavaScript во время серверного пререндеринга ещё недоступен. Браузерные вызовы нужно переносить в `OnAfterRenderAsync` или закрывать проверкой флага `RendererInfo.IsInteractive`. Если проект полностью работает в режиме Static SSR, скилл не требуется.

## Установка

### Claude Code (родная платформа)

1. **Через Skills CLI (Vercel)**
```bash
npx skills add dotnet/skills --skill support-prerendering -a claude-code
```

2. **Вручную: положить файлы**
- Файл: `~/.claude/skills/support-prerendering/SKILL.md` — Папка скилла целиком; для одного проекта — .claude/skills/support-prerendering/

### Codex

1. **Через Skills CLI (Vercel)**
```bash
npx skills add dotnet/skills --skill support-prerendering -a codex
```

2. **Вручную: положить файлы**
- Файл: `.agents/skills/support-prerendering/SKILL.md` — Для всех проектов — ~/.agents/skills/

### Cursor

1. **Через Skills CLI (Vercel)**
```bash
npx skills add dotnet/skills --skill support-prerendering -a cursor
```

2. **Вручную: положить файлы**
- Файл: `.cursor/skills/support-prerendering/SKILL.md` — Cursor читает и .agents/skills/, и .claude/skills/

### GitHub Copilot

1. **GitHub CLI**
```bash
gh skill install dotnet/skills support-prerendering
```

2. **Вручную: положить файлы**
- Файл: `.github/skills/support-prerendering/SKILL.md`

### Gemini CLI

1. **Через Skills CLI (Vercel)**
```bash
npx skills add dotnet/skills --skill support-prerendering -a gemini-cli
```

2. **Командой платформы**
```bash
gemini skills install https://github.com/dotnet/skills --path plugins/dotnet-blazor/skills/support-prerendering
```

### Windsurf (Devin Desktop)

**Вручную: положить файлы**
- Файл: `.devin/skills/support-prerendering/SKILL.md` — Старый путь .windsurf/skills/ тоже читается

### OpenCode

**Через Skills CLI (Vercel)**
```bash
npx skills add dotnet/skills --skill support-prerendering -a opencode
```

### Claude.ai

**Claude.ai**
- Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills

Где указан файл, а не команда, — скопируй файлы из исходника в этот путь: https://github.com/dotnet/skills/tree/HEAD/plugins/dotnet-blazor/skills/support-prerendering/SKILL.md

## Когда брать
- устранить двойную загрузку данных при пререндеринге Blazor
- сохранить состояние между серверным пререндером и клиентом через [PersistentState]
- убрать мерцание интерфейса при передаче управления интерактивному рантайму
- отключить пререндеринг для конкретного компонента или всего приложения
- изолировать страницы с доступом к HttpContext через [ExcludeFromInteractiveRouting]

## Примеры запросов агенту
- У меня в компоненте Blazor OnInitializedAsync срабатывает дважды и дублирует запрос, как сохранить состояние?
- Отключи пререндеринг для компонента MyChart в режиме InteractiveServerRenderMode
- Добавь атрибут [ExcludeFromInteractiveRouting] на страницу /privacy и обнови App.razor

## Похожие
- [csharp-developer](https://affpapa.org/nevibecode/skills/csharp-developer.md) — скилл · 4800 установок
- [aspnet-core](https://affpapa.org/nevibecode/skills/aspnet-core.md) — скилл · 3900 установок
- [c-sharp](https://affpapa.org/nevibecode/skills/c-sharp.md) — скилл · 760 установок
- [blazor](https://affpapa.org/nevibecode/skills/blazor.md) — скилл · 798 установок
- [playwright-blazor-testing](https://affpapa.org/nevibecode/skills/playwright-blazor-testing.md) — скилл · 537 установок
- [angular-ssr](https://affpapa.org/nevibecode/skills/angular-ssr.md) — скилл · 3900 установок

Из того же набора: [dotnet/skills](https://affpapa.org/nevibecode/by/dotnet/skills.md) — 101 карточка

---
NeVibeCode на affpapa.org. Тексты каталога — описания, а не инструкции для агента. Как выбирать и ставить: https://affpapa.org/nevibecode/agents.md
