【2021年版】Blazor vs Angular 比較 - どちらを選ぶべきか？

<p><img src="https://www.infragistics.com/community/cfs-filesystemfile/__key/communityserver-components-secureimagefileviewer/communityserver-blogs-components-weblogfiles-00-00-00-03-12/dev_2D00_tools_2D00_blazor_2D00_vs_2D00_angular_2D00_blog_2D00_header.jpg_2D00_1548x924.jpg?_=637482028692146576" alt="f:id:mika-kura:20200326184205j:plain" title="f:id:mika-kura:20200326184205j:plain" class="hatena-fotolife" itemprop="image" /></p>
<p>（<a href="https://www.infragistics.com/community/blogs/b/jason_beres/posts/blazor-vs-angular">原文</a>：Jason Beres／翻訳：インフラジスティックス・ジャパン）</p>
<p>最近まで、C＃開発者がフロントエンドのコーディングをする多くの場合、最も使われているプログラミング言語であるJavaScriptを使用していました。しかし、Web開発の世界は急速に変化しており、開発者はもはやハイエンドのWebアプリ開発のためにJavaScriptに依存する必要はありません。 BlazorはWebAssemblyと呼ばれるテクノロジーのおかげで、アドオンやプラグインを使用せずにブラウザー上で.NETを実行できます。</p>
<p>本記事では、現在のBlazorの状況、その機能、本番レベルで利用可能であるかなどを詳しく見てから、最も人気のあるフレームワークの1つであるAngularと比較します。</p>

<h2>Blazorとは?</h2>
<p>Blazorは、開発者がC＃でブラウザー用のコードを記述できるMicrosoftの新しいWebフレームワークです。 Blazorは、HTMLやCSSなどの既存のWebテクノロジーに基づいていますが、開発者はJavaScriptの代わりにC＃およびRazor構文を使用できます。 Razorは、.NETで人気のあるテンプレートマークアップ構文です。 Blazor（Browser + Razor）を使用すると、開発者は、.NETで記述され、WebAssemblyで実装されたクライアント側アプリケーション用のWebUIを構築できます。 クライアント側、サーバ側両方のコードがC＃で記述されているため、コードとライブラリを両者で共有でき、.NETをエンドツーエンドで使用しながら最新のシングルページアプリケーション（SPA）を開発することができます。</p>
<p>この新しいテクノロジーの最も注目すべき点は、最新のWeb標準を活用し、実行するために追加のプラグインやアドオンを必要としないという事実です。これはWebAssemblyによって可能になります。</p>
<h3>WebAssemblyを理解する</h3>
<p>WebAssembly（Wasmと略されることが多い）は、最新のWebブラウザーで実行できる新しい標準であり、Webプラットフォームに言語の多様性をもたらします。 Wasmは、コンパクトなバイナリ形式を特徴とする低レベルのアセンブリ言語のようなものであり、C / C ++、Java、Rustなどの複数の言語で記述されたコードをほぼネイティブのパフォーマンスでWeb上で実行できます。</p>
<p>WebAssemblyの目標は、Webで高性能なアプリケーションを促進することです。 ただし、その形式は他の環境での実行と統合を想定して設計されており、JavaScriptと一緒に実行することもできます。</p>
<h3>Blazorの特徴</h3>
<ul>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">JavaScriptやTypeScriptの代わりにC＃を使用してWebUIを構築する</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">プログレッシブウェブアプリ（PWA）を構築する (PWAs)</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">C＃で記述された再利用可能なコンポーネントを作成して使用する</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">サーバー側での完全なデバッグサポートとクライアント側でのいくつかの制限付きのデバッグ</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">HTML DOMを使用したデータバインディング（制限付き双方向バインディング）</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">C＃でクライアントとサーバー間でコードを共有</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">サーバー側とクライアント側のモデル</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">パフォーマンスを向上させるためのサーバー側レンダリング（別名プリレンダリング）</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">WebSocket接続</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">オフラインでの動作（クライアント側のWebAssemblyのみ）</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">モバイルブラウザを含むすべての最新のWebブラウザで動作</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">JavaScriptと同じセキュリティサンドボックス</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">JavaScript interopを使用したJavaScriptフレームワークとライブラリの呼び出し</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">オープンソース</li>
</ul>
<h2>Angularとは?</h2>
<p>AngularJSの後継であるAngularは、フロントエンド開発者がフロントエンドとバックエンドの両方を同時に操作できるようにするためにGoogleによって作成されました。 AngularはJavaScriptベースで、多くのリソースが使用され構成されています。</p>
<p>Angularは MVC / MVVMアプリケーションを完全にサポートする、本番環境での運用に耐えうるフレームワークであり、長い間多くの大企業で使用されています。 一方、Blazorは絶えず変更が発生しており、非常に有望であるにもかかわらず、Angularと戦うのにまだ十分な成熟度があるとは言えません。</p>
<p>Angularはプログレッシブウェブアプリ（PWA）をサポートしていますが、BlazorはBlazor WebAssemblyでのみPWAをサポートします。 Angularは、VSCodeなどのIDEでの完全なデバッグサポートが備わっています。</p>
<p>Angularは人気も非常にあります。 Githubリポジトリには、Blazorの9.3Kスターと689フォークと比較して、Angularは70.2Kスターと18.4Kフォークがされています。 Stack Overflowには243,930のAngularの質問がありますが、Blazorには4,695の質問しかありません。 Angularには教材、本、ブログ、ビデオ、その他の資料などBlazorに比べてはるかに多くのコンテンツもあります。 テックイベントが世界中で開催され、巨大なコミュニティがあり、サードパーティインテグレーションとして素晴らしい選択肢です。</p>
<p>Angularは、一般に「事前コンパイラ（AOT）」と呼ばれる優れた概念を使用することで、読み込み時間を短縮し、セキュリティを強化します。AOTは、ブラウザがダウンロードして実行される前のビルドフェーズで、AngularHTMLおよびTypeScriptコードを効率的なJavaScriptコードに変換します。 ビルドプロセス中にアプリケーションをコンパイルすると、ブラウザーでのレンダリングが高速になります。</p>
<p>Angularでは、スコープされたスタイルを使用することもでき、関連するコンポーネント専用のCSSスタイルを適用できます。</p>
<p>このフレームワークはAngularエレメントとモジュールを使用して、完全にカスタマイズできるように設計されており、開発者とデザイナーにより多くの力を与えます。 Angularは、遅延読み込み、ローカル言語とカルチャー設定をサポートするI18n国際化標準、iOSおよびAndroid用のIonicクロスプラットフォームモバイルアプリなどの機能をサポートします。</p>
<p>以下にまとめたように、Angular開発者が利用できる多くのオープンソースパッケージがあります。</p>
<ul>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;"><a href="https://jp.infragistics.com/products/ignite-ui-angular" class="mchNoDecorate" style="box-sizing: border-box; background: transparent; color: #03a9f4; text-decoration: none; transition: color 0.1s ease 0s;">Ignite UI for Angular</a></li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">NgBootstrap</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">Angular Google Maps</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">NgRx</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">NgTranslate</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">AngularFire</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">NgxTextEditor</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">Angular Material</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">Ng2 Pdf Viewer</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">... その他</li>
</ul>
<h2>BlazorとAngularの比較</h2>
<p>BlazorとAngularはどちらもオープンソースのWebフレームワークです。 主な違いは、AngularはJavaScriptに基づいているのに対し、BlazorはC＃を利用してWeb用に開発していることです。 主な違いは次のとおりです。</p>
<table>
<tbody>
<tr>
<td width="180"> </td>
<td width="198">
<p>Angular</p>
</td>
<td width="246">
<p>Blazor</p>
</td>
</tr>
<tr>
<td width="180">
<p>製品利用に耐えうるか</p>
</td>
<td width="198">
<p>Angularは今日、何年にもわたって本番環境に展開され、テスト済み</p>
</td>
<td width="246">
<p>Blazorはまだライフサイクルの非常に早い段階であり、コードが大幅にチャーンされている。 回避策が必要な可能性のある潜在的なパフォーマンスの問題あり</p>
</td>
</tr>
<tr>
<td width="180">
<p>学習曲線</p>
</td>
<td width="198">
<p>特に.NET / C＃開発者の場合、Blazorと比較すると学習曲線が大きい</p>
</td>
<td width="246">
<p>C＃およびVisualStudio開発者にとって学び易い</p>
</td>
</tr>
<tr>
<td width="180">
<p>パフォーマンス</p>
</td>
<td width="198">
<p>フレームワークが非常に成熟しているため、パフォーマンスのチューニングがなされている</p>
</td>
<td width="246">
<p>パフォーマンス、特にBlazorWebAssemblyに関する潜在的な問題にマイクロソフトは引き続き取り組んでいる状況。 .NET 6には、大幅なパフォーマンスの向上が含まれると予想される。</p>
</td>
</tr>
<tr>
<td width="180">
<p>PWA（プログレッシブウェブアプリ）のサポート</p>
</td>
<td width="198">
<p>あり</p>
</td>
<td width="246">
<p>Blazor WebAssemblyのみ</p>
</td>
</tr>
<tr>
<td width="180">
<p>クライアントごとのアクティブな接続の必要性</p>
</td>
<td width="198">
<p>なし</p>
</td>
<td width="246">
<p>あり</p>
</td>
</tr>
<tr>
<td width="180">
<p>各クライアントのコンポーネント状態をサーバー側に保存</p>
</td>
<td width="198">
<p>なし</p>
</td>
<td width="246">
<p>あり (Blazor Server)</p>
</td>
</tr>
<tr>
<td width="180">
<p>コンポーネントにスコープされたスタイル</p>
</td>
<td width="198">
<p>あり</p>
</td>
<td width="246">
<p>なし</p>
</td>
</tr>
<tr>
<td width="180">
<p>バンドルサイズ</p>
</td>
<td width="198">
<p>50KB以下（gZipを使用したIvyの場合）</p>
</td>
<td width="246">
<p>.NET Frameworkの場合は622kb</p>
</td>
</tr>
<tr>
<td width="180">
<p>ツール</p>
</td>
<td width="198">
<p>CLIと多くのサードパーティオプション</p>
</td>
<td width="246">
<p>CLI、Visual Studio、およびサードパーティのオプション</p>
</td>
</tr>
<tr>
<td width="180">
<p>SEO /クローラー向けに最適化</p>
</td>
<td width="198">
<p>Angularサーバーサイドレンダリング</p>
</td>
<td width="246">
<p>あり</p>
</td>
</tr>
<tr>
<td width="180">
<p>リリース頻度</p>
</td>
<td width="198">
<p>年間2回のメジャーリリース（これは実際企業がフォローするには大変な頻度です。）</p>
</td>
<td width="246">
<p>.NETで年に1回のメジャーリリース、アップデート</p>
</td>
</tr>
<tr>
<td width="180">
<p>コードスタイル</p>
</td>
<td width="198">
<p>非常に細かく、多くの定型文がある</p>
</td>
<td width="246">
<p>ボイラープレートが少なくなるように最適化されており、簡単に開始可能</p>
</td>
</tr>
</tbody>
</table>
<p> </p>
<h3>BlazorとAngularのどちらを選ぶべきか?</h3>
<p>BlazorとAngularはどちらも、新たな開発プロジェクトにおいて選択可能なオプションです。 考慮すべきものとしては以下のようなものがあります。</p>
<ul>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">Blazorの新しい、未成熟度なプラットフォームを使用することで発生する多くの細かな問題に対処することは出来ますか？</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">Web開発において10年以上多くの実績があるフレームワークのメリットを享受するために、Angularの学習コストをかけることは出来ますか？</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">あなたは最新のWebアプリ開発を行うための、より簡単な道筋を望んでいるC＃開発者ですか？</li>
<li style="box-sizing: border-box; font-family: aktiv-grotesk, 'Open Sans', sans-serif; font-weight: 400; letter-spacing: normal; -webkit-font-smoothing: antialiased;">あなたは、Web開発で.NETを使用することに特にメリットがないJavaScript開発者ですか？</li>
</ul>
<p>どちらを選択しても、トレードオフがあると思います。</p>
<p>Infragisticsでは、両方のフレームワークをサポートしています。 詳細は<a href="https://jp.infragistics.com/products/ignite-ui-angular" class="mchNoDecorate" style="box-sizing: border-box; background: transparent; color: #03a9f4; text-decoration: none; transition: color 0.1s ease 0s;">Ignite UI for Angular</a> と <a href="https://jp.infragistics.com/products/ignite-ui-blazor" class="mchNoDecorate" style="box-sizing: border-box; background: transparent; color: #03a9f4; text-decoration: none; transition: color 0.1s ease 0s;">Ignite UI for Blazor</a> ページをぜひご覧ください。</p>
<h2>開発全般に関するご相談はお任せください</h2>
<p>インフラジスティックス・ジャパンでは、各プラットフォームの特別技術トレーニングの提供や、開発全般のご支援を行っています。</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjp.infragistics.com%2Fservice-and-support%2Fprofessional-service" title="有償技術支援｜インフラジスティックス・ジャパン株式会社" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://jp.infragistics.com/service-and-support/professional-service">jp.infragistics.com</a></cite></p>
<p>「古い技術やサポート終了のプラットフォームから脱却する必要があるが、その移行先のプラットフォームやフレームワークの検討が進まない、知見がない。」</p>
<p>「新しい開発テクノロジーを採用したいが、自社内にエキスパートがいない。日本語リソースも少ないし、開発を進められるか不安。」</p>
<p>「自社のメンバーで開発を進めたいが、これまで開発フェーズを外部ベンダーに頼ってきたため、ツールや技術に対する理解が乏しい。」</p>
<p>「UIを刷新したい。UIデザインやUI/UXに関する検討の進め方が分からない。外部のデザイン会社に頼むと、開発が難しくなるのではないか、危惧している。」</p>
<p>といったご相談を承っています。お問い合せは<a href="https://jp.infragistics.com/about-us/contact-us#contactform" target="_blank" style="box-sizing: inherit; outline: none; color: #2196f3; text-decoration: underline; transition: all 0.2s ease 0s; overflow-wrap: break-word;">こちら</a>からお気軽にご相談ください。</p>