Blazorプロジェクトのテンプレートについて

Blazorアプリケーションを作り始める時に使えるプロジェクトテンプレートを紹介したいと思います:thumbsup:
![テンプレ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110304/d8359590-b443-e7b2-226c-ad3bb5181da5.png)

# Blazorテンプレート
VisualStudioなどを使用してBlazorのプロジェクトを作成するとき、初めから入っているBlazorテンプレートをベースにプロジェクトが作成されます。

Blazorのデフォルトテンプレートではプロジェクト作成の種類に応じて、いくつかの種類に分けることができます。

<dl>
  <dt>Blazor WebAssembly アプリ</dt>
  <dd>Blazorアプリケーションの実行をWebAssemblyだけで構成します。</dd>
  <dt>Blazor WebAssembly アプリ+ ASP.NET Core Host</dt>
  <dd>Blazorアプリケーションの実行をWEbAssemblyで実行します。データを提供する機能として、ASP.Net Coreコントローラーを含んだプロジェクトが作成されます。プロジェクトの種類に「Blazor WebAssembly アプリ」を選択し、追加情報で「ASP.NET Coreでホストされた」を選択することで作成することができます。</dd>
  <dt>Blazor サーバー</dt>
  <dd>Blazorアプリケーションの実行をサーバーサイドで実行します。データの提供にASP.Net Core コントローラーは必須ではなく、フロントエンドとバックエンドを一つのプロジェクトに実装することができます。</dd>
</dl>

## デフォルトテンプレートに学ぶ

デフォルトテンプレートに含まれるBlazorの機能をいくつか見てみましょう。デフォルトテンプレートにはBlazor開発者に向けてのヒントやアイデアが詰まっており非常に参考になります:sparkles:
![sol.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110304/0da467b9-4acd-9fef-53cf-df21a7297394.png)

### Pages/Index.razor
Pagesフォルダに格納されているページ(Counter/FethData/Index)は、デフォルトテンプレートの主な画面が格納されています。
Index.razorコンポーネントは初めの画面に表示されるページです。

これらの画面では、Blazorにおける`@page`ディレクティブを使用したルーティング定義の実装方法を見ることができます。

**Index.razorのルーティング**

```html:Index.raozr
@page "/"
```

**Counter.razorのルーティング**

```html:Counter.raozr
@page "/counter"
```

### Pages/Counter.razor
このページはボタンをクリックすると画面上のカウンターがインクリメントされるページの実装例です。BlazorがJavascriptレスでWebアプリケーションをコーディングできることを証明した非常に分かりやすい例と言えます。

**JavaScriptレスなコード**

```html:Counter.razor
@page "/counter"

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}
```

### Pages/FetchData.razor
FetchData.razorは、日付と気温、天気を表形式で表示するコンポーネントです。このコンポーネントの実装方法はBlazorプロジェクト種類により大きく違ってきます。

<dl>
  <dt>Blazor WebAssemblyアプリ</dt>
  <dd>Blazor WebAssmeblyアプリでは、表示するデータの取得先として静的に配置されたファイルを読み込みます。読み込むファイルはwwwroot/sample-dataディレクトリに配置されています。Program.csでHttpClientインスタンスを生成しており、ASP.Net CoreのDI(Dependency Injection)の使い方を知ることができます。</dd>
  <dt>Blazor WebAssemblyアプリ + ASP.NET Core Host</dt>
  <dd>このプロジェクトは、クライアント側はBlazor WebAssemblyアプリと同じですが、データを提供するサーバー側(ASP.Net Core)のプロジェクトが生成されます。FetchDataの表示データとして、サーバー側プロジェクトにWeatherForecastControllerが生成されています。単に静的なファイルを読み込ませるのではなく認証などの仕組みを作成するプロジェクトでは参考になるでしょう。また、クライアントとサーバーの共通的なインタフェースとして、BlazorApp.Shared/WeatherForecastプロジェクトが作成されており、共通的な定義を集約できるクラスライブラリの作成方法を知ることができます。</dd>
  <dt>Blazor サーバー</dt>
  <dd>Blazorサーバーは、バックエンド側の処理をフロントエンドと同一インスタンス内で処理できる為、Blazor WebAssembly アプリと大きく異なります。Blazor　サーバーではデータの取得にHttpClientを使用せず、画面側のコードで直接データを提供するクラスを生成することが可能になります。
</dd>
</dl>

### Shared/SurveyPrompt.razor

SurveyPrompt.razorは、Pagesフォルダにあるコンポーネントではなく、画面内で部品のように扱うことができるコンポーネントです。コンポーネントはBlazorを扱う上での基本的な構成要素です。C#でクラスライブラリを作成するように、Blazorではコンポーネントを作ることで部品化することができます。

**使いたいところでSurveyPromptコンポーネントを記述する**

```html:Index.razor
<SurveyPrompt Title="How is Blazor working for you?" />
```
![qiita3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110304/ebe80d0d-a5a7-bf8d-acf5-655175645e21.png)

このコンポーネントでは、`Title` というコンポーネントパラメータを使用する側で指定し、描写時に渡されたパラメータを表示する、という処理をしています。コンポーネントパラメーターの使い方がわかる実装例です。

# テンプレートを使う上での注意点
テンプレートやライブラリは.Net のバージョンに大きく依存します。Blazorのデフォルトテンプレートも以前から見た目こそ同じですが、.Net のバージョンアップと共に少しずつ変化してきました。テンプレートやライブラリを使う際は、バージョンによる非互換に注意が必要です。

**互換性に影響を与える変更点**

https://docs.microsoft.com/ja-jp/dotnet/core/compatibility/


# サードパーティーのBlazorテンプレート

[nugetパッケージ](https://www.nuget.org/packages?q=blazor+template)として、テンプレートが公開されているもののうち、UIフレームワークのBlazorテンプレートをいくつか紹介します。

## MudBlazor.Templates 

https://www.nuget.org/packages/MudBlazor.Templates/

![qiita4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110304/c46fdc58-3026-04a0-2f70-da012a398e08.png)

BlazorのUIフレームワークとして人気の高い [MudBlazor](https://github.com/MudBlazor/MudBlazor)のテンプレートです。
プロジェクト作成時のオプションに **Default** を選択すると、デフォルトテンプレートと同じ機能を見ることができます。機能はシンプルですが、初めからライブラリを使用する環境が組み込まれているため、その手間を省けるだけでも大いに活用する意義があります。

![qiita6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110304/aa852bfe-6cc7-9bc0-b621-503d97788c95.png)

プロジェクト作成時のオプションに **AdminDashboard**を選択すると、多彩なコンポーネントを使用したダッシュボードの作成例を見ることができます。だいたいモックアップではありますが、いくつか動きのある機能もあり、実装の参考になります。

## AntDesign.Templates 

https://www.nuget.org/packages/AntDesign.Templates/

![qiita9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110304/2eebbab0-08c9-fdb0-db61-d74086ab7774.png)

こちらも人気である[Ant Design Blazor](https://github.com/ant-design-blazor/ant-design-blazor)を使用したテンプレート。プロジェクトの作成でオプションの **full**にチェックを入れないとシンプルなプロジェクトが作成されます。

![qiita11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110304/2f29a672-8df6-a376-2342-376a9ac793a3.png)

プロジェクト作成のオプションで**full**にチェックを入れると、ダッシュボードアプリケーションが表示されます。Chart部分は実際に動作するので機能が非常に豊富ですね:muscle:

## Bootstrap.Blazor.Templates

https://www.nuget.org/packages/Bootstrap.Blazor.Templates/

![qiita7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110304/b692df28-89d5-90ae-b0ff-72c2d8a0647d.png)

[BootstrapBlazor](https://github.com/dotnetcore/BootstrapBlazor)を使ったテンプレート。シンプルですが、BootstrapBlazorも多くのコンポーネントが揃っています:thumbsup:

## BlazorWithIdentity.Template

https://www.nuget.org/packages/BlazorWithIdentity.Template/

![qiita12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110304/ec3339db-6ba2-c27c-baa6-1433316fdda1.png)

このテンプレートはログイン認証の実装について知ることができます。プロジェクトはWebAssemblyアプリ + ASP.Net Core コントローラーで構成されていて、画面の「Create account」で作成したアカウントで認証する仕組みが実装されています。認証・認可を行うアプリケーションのベースとして、非常に参考になるテンプレートです:thumbsup:

他にもテンプレートはいくつかありますが、、、メンテナンスされなかったりして、実用性のあるものはそれほど多くはないですね:sweat_smile:


# その他のComponentライブラリ

[Awesome Blazor](https://github.com/AdrienTorris/awesome-blazor)は、Blazor開発者が初めに見るべきサイトです。
Blazorに関するありとあらゆる情報が掲載されていて日々進化し続けています。

その中でも、[Libraries & Extensions](https://github.com/AdrienTorris/awesome-blazor#libraries--extensions)にはUIフレームワークをはじめとした様々なライブラリについて知ることができます。
ライブラリによってはテンプレートを提供していませんが、GitHubページからプロジェクトファイルをダウンロードして使うのも良いですね:sunny:

**Awesome Blazor**

https://github.com/AdrienTorris/awesome-blazor

# 終わりに

Blazorのデフォルトテンプレートには、BlazorでC#を使ってこんなことできるよ！というのが詰まっていることがわかりました:raising_hand_tone1:
Blazorアプリケーションを作成する時、サードパーティーのテンプレートをベースにすることで初めから豊富なコンポーネントを使用することができます:thumbsup:
また、[Awesome Blazor](https://github.com/AdrienTorris/awesome-blazor)を見ると世界中で様々な人がBlazorに注目しており素晴らしいコミュニティを作っています:relaxed:
以上、これからBlazorで開発をする人や、Blazorの知見を深めたい人の参考になれば幸いです:zap::zap::zap::rocket: