インフラジスティックス・ジャパン株式会社Blog

インフラジスティックス・ジャパン株式会社のチームメンバーが技術トレンド、製品Tips、サポート情報からライセンス、日々の業務から感じることなど、さまざまなトピックについてお伝えするBlogです。

Blazor プロジェクトの構成を、Blazor WebAssembly と Blazor Server を比較しながら確認する - ASP.NET Core Blazor で始めるフロントエンド 開発(入門編)- ①

f:id:cleverdog:20201022143631j:plain

本記事ではこれから ASP.NET Core Blazor (以下 Blazor) を使った開発を始めようとしている方を対象に、Blazor プロジェクトの構成について、ひとつずつ確認していこうと思います。

また、Blazor には 2つのホスティングモデル (Blazor WebAssembly と Blazor Server) が存在しますので、それぞれのホスティングモデルで作成したプロジェクト構成の違いについても見ていきます。

今回、Blazor WebAssembly と Blazor Server それぞれのホスティングモデルで新規作成したプロジェクトを持つソリューションを用意しました。それぞれ、含まれるファイルおよびフォルダ構成は以下のようになります。

Image from Gyazo

また、インストールおよびプロジェクトの開始方法について こちらの記事 で説明していますのでご参照ください。

Program.cs

Image from Gyazo

エントリーポイントの Main メソッドが含まれるファイルです。

Blazor server では CreateHostBuilder メソッドで .NET 汎用ホストの設定 が行われていることが分かります。

Blazor WebAssembly では Main メソッドの中で、大元のコンポーネントであるルートコンポーネントに App コンポーネント (App.razor) を指定しています。コンポーネントは、Blazor アプリケーションを構成する要素です。 Blazor のコンポーネント は、正式には Razor コンポーネントと呼ばれ、Razor コンポーネントファイル (.razor) で実装します。

App.razor

Image from Gyazo

Blazor WebAssembly と Blazor Server で同じ記述であることが分かります。このコンポーネントは ルーティング の役割を持ち、ブラウザのナビゲーションで要求されたアドレスに一致するコンポーネントをレンダリングします。一致するものが見つからない場合は、NotFound プロパティを使用して Page Not Found のようなメッセージを表示しています。また、RouteView コンポーネントに DefaultLayout で MainLayout.razor コンポーネントを指定しています。特に指定がない場合にコンポーネントはこの MainLayout.razor をレイアウトとして使用します。

wwwroot フォルダ

画像や CSS などの静的なファイルを置くフォルダです。
また、Blazor WebAssembly ではページを表示する際の基本となる index.html が配置されています。ブラウザからリクエストが行われると、まずこの index.html が返され、読み込まれた WebAssembly JavaScript ファイル(_framework/blazor.webassembly.js) によって .NET ランタイム、アプリ、およびアプリの依存関係のダウンロードと、アプリを実行するランタイムの初期化が行われます。また、ルートコンポーネントである App コンポーネントは <app> 内にレンダリングされます。

Pages フォルダ

ルーティングの設定が記載されたいくつかの Razor コンポーネントファイルが格納されています。
Blazor server ではホストページである _Host.cshtml ファイルが存在しますが、その中で以下のようにルートコンポーネントとして App コンポーネントを指定していることが分かります。Blazor WebAssembly と同じく、App コンポーネントは <app> 内にレンダリングされます。

<app>
    <component type="typeof(App)" render-mode="ServerPrerendered" />
</app>

Shared フォルダ

共通で利用するコンポーネントを置くフォルダです。デフォルトのレイアウトを定義した MainLayout.razor ファイルと、トップページ (index.razor) で読み込んでいるアンケート用のメッセージコンポーネント (SurveyPrompt.razor) 、ナビゲーションメニューを定義した NavMenu.razor ファイルがあります。 NavMenu.razor コンポーネントに含まれている NavLink コンポーネントは、HTML の <a> タグのようにナビゲーションリンクを作成する際に利用できますが、href の値が現在の URL と一致している場合に自動的に active クラスを付与するという点でより優れています。

_Imports.razor

@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.WebAssembly.Http
@using Microsoft.JSInterop
@using BlazorApp_WebAssembly
@using BlazorApp_WebAssembly.Shared

共通の名前空間に関して、このコンポーネントで定義することで、このプロジェクトで定義されるすべての Razor コンポーネントにおいて、@using ディレクティブの指定が不要になります。

Startup.cs

Blazor Server の場合にのみ存在し、アプリの起動ロジックを担当します。依存関係の注入(DI)サービスを構成する ConfigureServices メソッドと、HTTP リクエストのパイプラインを構成する Configure メソッドが含まれています。Blazor Server ではサンプルアプリケーション用のデータサービスを ConfigureServices メソッドで追加していることが分かります。

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddServerSideBlazor();
    services.AddSingleton<WeatherForecastService>();
}

Properties フォルダ

開発環境の設定ファイルである launchSettings.json が置かれています。
launchSettings.json に関しては こちらのページ をご参照ください。

Data フォルダ

Blazor Server 用のサンプルデータを提供する WeatherForecast クラスとWeatherForecastService の実装が含まれています。

まとめ

2つのホスティングモデルを比較した時に、コンポーネントレベルでは違いを意識する必要がほとんどないという点が素晴らしいと思いました。 実際にサンプルページのコンポーネントを比較しても、データをサーバから取得する場合と、HttpClient で JSON ファイルから取得する場合で方法が異なる FetchData コンポーネント以外はほとんど同じ記述です。
ですので、とりあえず Blazor に触れてみようという理由でプロジェクトを作成される場合には、どちらのホスティングモデルを選んでいただいても問題ないと思います。

2つのホスティングモデルそれぞれの利点、欠点に関しては以下の記事もぜひご覧ください。

blogs.jp.infragistics.com

Ignite UI for Blazor トライアル版を利用するには

インフラジスティックスでは充実した UI コンポーネントライブラリーを収録し、データリッチでレスポンシブなWebアプリケーションをより迅速に構築することを可能にする Ignite UI を開発しており、Blazor 対応の Ignite UI for Blazor もリリースしています。
Ignite UI for Blazor はトライアル版での試用が可能です。
トライアル版を利用するためには以下のページよりアカウントの作成を行ってください。登録より30日間、弊社のテクニカルサポートをご利用いただくことが出来ますのでお気軽にお問い合わせください。
https://iam.infragistics.com/Account/Register

また、製品をご購入をご検討のお客様は以下のページよりお気軽にお問い合わせください。
https://jp.infragistics.com/about-us/contact-us