blazor — скилл для Claude Code: правила разработки на Blazor
Скилл задаёт агенту правила разработки на Blazor: жизненный цикл компонентов, привязка данных, управление состоянием и оптимизация рендеринга.
npx skills add Mindrally/skills --skill blazor -a claude-codeЧто делает blazor
Скилл превращает ассистента в знатока Blazor Server и Blazor WebAssembly. Внутри — набор инструкций по архитектуре компонентов: параметры для входа, EventCallback для событий, IDisposable для очистки ресурсов. Агент будет опираться на эти правила, когда вы просите написать или переписать компонент.
Отдельные разделы посвящены жизненному циклу (OnInitializedAsync, OnParametersSet, OnAfterRenderAsync), привязке @bind, оптимизации рендеринга через @key и Virtualize, а также управлению состоянием через каскадные параметры и сервисы. Есть примеры HTTP-запросов через HttpClient, обработка ошибок с ErrorBoundary, тестирование через bUnit и настройка аутентификации с AuthorizeView.
Скилл полезен, если вы пишете на C# и .razor и хотите, чтобы агент не путал Blazor Server с WebAssembly и не советовал лишний JavaScript interop. Установка идёт через npx skills add — нужен Node.js с npx.
Какие задачи решает
- создать компонент с параметрами и событиями
- загрузить данные в
OnInitializedAsyncбез блокировки рендеринга - настроить двустороннюю привязку через
@bind - ускорить список через
Virtualizeи@key - покрыть компонент тестами на bUnit
Примеры запросов агенту
- Напиши компонент Blazor с параметром Id и загрузкой пользователя в OnInitializedAsync
- Почему мой компонент рендерится дважды? Проверь по правилам скилла
- Настрой AuthorizeView для страницы и добавь атрибут [Authorize]
Как установить blazor
1Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill blazor -a claude-code2Вручную: положить файлы
~/.claude/skills/blazor/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/blazor/
1Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill blazor -a codex2Вручную: положить файлы
.agents/skills/blazor/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill blazor -a cursor2Вручную: положить файлы
.cursor/skills/blazor/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install Mindrally/skills blazor2Вручную: положить файлы
.github/skills/blazor/SKILL.md1Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill blazor -a gemini-cli2Командой платформы
gemini skills install https://github.com/Mindrally/skills --path blazorВручную: положить файлы
.devin/skills/blazor/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add Mindrally/skills --skill blazor -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Из того же набора168
Похожие
Рядом в теме «Фронтенд и UI»
Всё по теме «Фронтенд и UI» →Вопросы о blazor
Как установить blazor в Claude?
Выполните npx skills add Mindrally/skills --skill blazor -a claude-code. Скилл появится в ~/.claude/skills/blazor/SKILL.md.
Что делает скилл blazor?
Даёт агенту инструкции по разработке на Blazor: архитектура компонентов, жизненный цикл, привязка данных, управление состоянием, оптимизация рендеринга, обработка ошибок, тестирование и аутентификация.
Скилл работает с Blazor Server и WebAssembly?
Да, в нём разобраны оба режима и их различия: где живёт состояние, как работает соединение, что с офлайн-режимом.
Исходный текст
SKILL.md · Apache-2.0
---
name: blazor
description: Guidelines for Blazor development including component lifecycle, state management, and performance optimization
metadata:
maintainer: Mindrally
source: https://github.com/Mindrally/skills
---
# Blazor Development Guidelines
You are an expert in Blazor development with deep knowledge of both Blazor Server and Blazor WebAssembly.
## Component Architecture
### Component Design
- Create small, focused components
- Use component parameters for input
- Use EventCallback for output/events
- Implement IDisposable for cleanup
- Use cascading parameters sparingly
### Component Structure
```razor
@page "/users/{Id:int}"
@inject IUserService UserService
<h1>@User?.Name</h1>
@code {
[Parameter]
public int Id { get; set; }
private User? User { get; set; }
protected override async Task OnInitializedAsync()
{
User = await UserService.GetUserAsync(Id);
}
}
```
## Component Lifecycle
### Lifecycle Methods
- `OnInitialized`/`OnInitializedAsync`: Initial setup
- `OnParametersSet`/`OnParametersSetAsync`: When parameters change
- `OnAfterRender`/`OnAfterRenderAsync`: After DOM updates
- `Dispose`: Cleanup resources
### Best Practices
- Use `OnInitializedAsync` for data loading
- Check `firstRender` in `OnAfterRenderAsync`
- Dispose subscriptions and timers
- Avoid long-running synchronous code
## Data Binding
### One-Way Binding
```razor
<p>@message</p>
<input value="@inputValue" />
```
### Two-Way Binding
```razor
<input @bind="inputValue" />
<input @bind="inputValue" @bind:event="oninput" />
```
### Event Handling
```razor
<button @onclick="HandleClick">Click</button>
<button @onclick="() => HandleClickWithParam(id)">Click</button>
<button @onclick="HandleClickAsync">Async Click</button>
```
## Render Optimization
### Prevent Unnecessary Renders
- Use `@key` for list items
- Implement `ShouldRender()` when appropriate
- Use `StateHasChanged()` judiciously
- Avoid inline handlers in loops
### Virtualization
```razor
<Virtualize Items="@items" Context="item">
<ItemContent>
<div>@item.Name</div>
</ItemContent>
</Virtualize>
```
## State Management
### Component State
- Use private fields for component state
- Call `StateHasChanged()` when state changes externally
- Use `InvokeAsync` for thread-safe updates
### Cascading Parameters
```razor
<CascadingValue Value="@currentTheme">
<ChildComponent />
</CascadingValue>
<!-- In child component -->
[CascadingParameter]
public Theme CurrentTheme { get; set; }
```
### State Containers
- Create injectable state services
- Use events for state change notifications
- Consider Fluxor for complex state management
## Blazor Server vs WebAssembly
### Blazor Server
- State lives on server
- Real-time connection via SignalR
- Faster initial load
- Requires stable connection
- Better for internal apps
### Blazor WebAssembly
- Runs entirely in browser
- Larger initial download
- Works offline (PWA capable)
- No server resources per user
- Better for public apps
## API Integration
### HTTP Client
```csharp
@inject HttpClient Http
private async Task LoadData()
{
users = await Http.GetFromJsonAsync<List<User>>("api/users");
}
```
### Error Handling
```csharp
try
{
users = await Http.GetFromJsonAsync<List<User>>("api/users");
}
catch (HttpRequestException ex)
{
errorMessage = "Failed to load users";
}
```
## Error Handling
### Error Boundaries
```razor
<ErrorBoundary>
<ChildContent>
<RiskyComponent />
</ChildContent>
<ErrorContent Context="ex">
<p>An error occurred: @ex.Message</p>
</ErrorContent>
</ErrorBoundary>
```
### Global Error Handling
- Implement `IErrorBoundary` for custom handling
- Log errors to server
- Show user-friendly messages
## Testing
### bUnit Testing
```csharp
[Fact]
public void ComponentRendersCorrectly()
{
using var ctx = new TestContext();
var cut = ctx.RenderComponent<Counter>();
cut.Find("p").MarkupMatches("<p>Current count: 0</p>");
cut.Find("button").Click();
cut.Find("p").MarkupMatches("<p>Current count: 1</p>");
}
```
## Authentication
### Setup
- Use `AuthenticationStateProvider`
- Use `AuthorizeView` for conditional UI
- Use `[Authorize]` attribute on pages
- Implement custom auth state provider for JWT
### AuthorizeView
```razor
<AuthorizeView>
<Authorized>
<p>Welcome, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>Please log in.</p>
</NotAuthorized>
</AuthorizeView>
```
## Performance Tips
- Use `@key` for dynamic lists
- Implement virtualization for large lists
- Lazy load components with `@if`
- Minimize JavaScript interop calls
- Use streaming rendering in .NET 8+
© Mindrally · Apache-2.0 · Mindrally/skills