blazor
Blazorの開発に関するガイドラインで、コンポーネントのライフサイクル、状態管理、パフォーマンス最適化について網羅しています。Blazorアプリケーションの設計・実装時に参照することで、ベストプラクティスに沿った開発が行えます。
description の原文を見る
Guidelines for Blazor development including component lifecycle, state management, and performance optimization
SKILL.md 本文
Blazor 開発ガイドライン
Blazor Server と Blazor WebAssembly の両方に関する深い知識を持つ Blazor 開発のエキスパートです。
コンポーネント アーキテクチャ
コンポーネント設計
- 小さく、焦点を絞ったコンポーネントを作成する
- 入力にはコンポーネント パラメーターを使用する
- 出力/イベントには EventCallback を使用する
- クリーンアップのために IDisposable を実装する
- カスケード パラメーターは控えめに使用する
コンポーネント構造
@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);
}
}
コンポーネント ライフサイクル
ライフサイクル メソッド
OnInitialized/OnInitializedAsync: 初期設定OnParametersSet/OnParametersSetAsync: パラメーター変更時OnAfterRender/OnAfterRenderAsync: DOM 更新後Dispose: リソースのクリーンアップ
ベストプラクティス
- データ読み込みには
OnInitializedAsyncを使用する OnAfterRenderAsyncでfirstRenderをチェックする- サブスクリプションとタイマーを破棄する
- 長時間実行される同期コードを避ける
データ バインディング
一方向バインディング
<p>@message</p>
<input value="@inputValue" />
双方向バインディング
<input @bind="inputValue" />
<input @bind="inputValue" @bind:event="oninput" />
イベント ハンドリング
<button @onclick="HandleClick">Click</button>
<button @onclick="() => HandleClickWithParam(id)">Click</button>
<button @onclick="HandleClickAsync">Async Click</button>
レンダリング最適化
不要なレンダリングを防ぐ
- リスト項目に
@keyを使用する - 必要に応じて
ShouldRender()を実装する StateHasChanged()は慎重に使用する- ループ内でのインラインハンドラーを避ける
仮想化
<Virtualize Items="@items" Context="item">
<ItemContent>
<div>@item.Name</div>
</ItemContent>
</Virtualize>
状態管理
コンポーネント状態
- コンポーネント状態にはプライベート フィールドを使用する
- 外部から状態が変更される場合、
StateHasChanged()を呼び出す - スレッド セーフな更新には
InvokeAsyncを使用する
カスケード パラメーター
<CascadingValue Value="@currentTheme">
<ChildComponent />
</CascadingValue>
<!-- 子コンポーネント内 -->
[CascadingParameter]
public Theme CurrentTheme { get; set; }
状態コンテナー
- インジェクト可能な状態サービスを作成する
- 状態変更通知にはイベントを使用する
- 複雑な状態管理には Fluxor を検討する
Blazor Server vs WebAssembly
Blazor Server
- 状態はサーバーに存在する
- SignalR による実時間接続
- 初期読み込みが高速
- 安定した接続が必要
- 社内アプリに適している
Blazor WebAssembly
- ブラウザ内で完全に実行される
- 初期ダウンロードがより大きい
- オフラインで動作可能 (PWA 対応)
- ユーザーごとのサーバー リソースが不要
- 公開アプリに適している
API 統合
HTTP クライアント
@inject HttpClient Http
private async Task LoadData()
{
users = await Http.GetFromJsonAsync<List<User>>("api/users");
}
エラー ハンドリング
try
{
users = await Http.GetFromJsonAsync<List<User>>("api/users");
}
catch (HttpRequestException ex)
{
errorMessage = "Failed to load users";
}
エラー ハンドリング
エラー バウンダリー
<ErrorBoundary>
<ChildContent>
<RiskyComponent />
</ChildContent>
<ErrorContent Context="ex">
<p>An error occurred: @ex.Message</p>
</ErrorContent>
</ErrorBoundary>
グローバル エラー ハンドリング
- カスタム ハンドリングには
IErrorBoundaryを実装する - エラーをサーバーにログする
- ユーザーフレンドリーなメッセージを表示する
テスト
bUnit テスト
[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>");
}
認証
セットアップ
AuthenticationStateProviderを使用する- 条件付き UI には
AuthorizeViewを使用する - ページに
[Authorize]属性を使用する - JWT 用にカスタム認証状態プロバイダーを実装する
AuthorizeView
<AuthorizeView>
<Authorized>
<p>Welcome, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>Please log in.</p>
</NotAuthorized>
</AuthorizeView>
パフォーマンス ティップス
- 動的リストには
@keyを使用する - 大規模リストには仮想化を実装する
@ifでコンポーネントを遅延読み込みする- JavaScript 相互運用呼び出しを最小化する
- .NET 8 以降ではストリーミング レンダリングを使用する
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- mindrally
- リポジトリ
- mindrally/skills
- ライセンス
- Apache-2.0
- 最終更新
- 不明
Source: https://github.com/mindrally/skills / ライセンス: Apache-2.0
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。