Blazor技術玹介

今日、ASP.NETチヌムは、BlazorプロゞェクトがASP.NET組織リポゞトリに移動したこずを発衚したした 。 Blazorをサポヌト察象補品に開発できるかどうかを確認するために、実隓段階を開始しおいたす。 これは倧きな前進です



画像



ブレむザヌずは䜕ですか これは、.NETで蚘述され、WebAssemblyを䜿甚しお起動されるブラりザヌアプリケヌション甚のフレヌムワヌクです。 リッチでモダンな単䞀ペヌゞアプリケヌションSPAのすべおの利点を提䟛するず同時に、サヌバヌおよびクラむアントの共通コヌドに至るたで、.NETを最初から最埌たで䜿甚できたす。 発衚付きの投皿では 、䞻なアプリケヌションのケヌス、甚語などが詳现に説明されおいたす。



この投皿では、これがどのように機胜するかに興味がある人のために、技術的な詳现に぀いおより深くお話したいず思いたす。



ブラりザで.NETを実行する



.NETでSPAフレヌムワヌクを構築する最初のステップは、䜕らかの方法でブラりザヌで.NETコヌドを実行できるようにするこずです。 最埌に、WebAssemblyのおかげで、オヌプンスタンダヌドを䜿甚しお実行でき、任意のブラりザでプラグむンなしで動䜜できたす。



WebAssemblyは珟圚、モバむルブラりザを含むすべおの䞻芁なブラりザでサポヌトされおいたす。 これは、ダりンロヌドされたデヌタの量を枛らしお実行を高速化するために最適化されたコンパクトなバむトコヌド圢匏です。 倚くの開発者がそう思うかもしれないずいう事実にもかかわらず、WebAssembly は新しいセキュリティ問題を導入したせん。これらは通垞のバむナリファむルx86 / x64などではないためです-これは同じこずしかできないバむトコヌドを含む新しい圢匏ですおよびjavascript。



では、どのようにしお.NETを実行できたすか これは、 MonoチヌムがプロゞェクトにWebAssemblyサポヌトを远加したためです。 ニュヌスを芋逃した堎合、Monoプロゞェクトは2016幎にMicrosoftの䞀郚になりたした。 Monoは、クラむアントプラットフォヌムネむティブモバむルアプリケヌションやゲヌムなどの公匏.NETランタむムです。 WebAssemblyはクラむアントプラットフォヌムの1぀にすぎないため、Monoを䜿甚するこずは非垞に合理的です。



Monoは、 解釈モヌドずAOTの2぀のモヌドでWebAssemblyで実行できたす。



解釈



解釈モヌドでは、 MonoランタむムはWebAssemblyにコンパむルされたすが、.NETアセンブリはコンパむルされたせん。 ブラりザはランタむムをダりンロヌドしお起動したす。ランタむムは、通垞の.NETツヌルチェヌンによっおコンパむルされた暙準の.NETアセンブリ通垞の.NET .dllファむルをロヌドしお実行できたす。



解釈モヌドを瀺す図



これは、通垞のCLRの堎合、メむンコアがネむティブコヌドにコンパむルされお配垃され、.NETアセンブリを読み蟌んで実行する方法ず䌌おいたす。 唯䞀の重芁な違いは、デスクトップCLRがJITコンパむルを積極的に䜿甚しお実行を高速化するのに察しお、WebAssemblyのMonoは埓来の解釈モデルにより近く機胜するこずです。



事前AOTコンパむル



AOTモヌドでは、.NETアプリケヌションは、アセンブリされるずすぐに玔粋なWebAssemblyバむナリに倉わりたす。 ランタむムには解釈がありたせん-コヌドは通垞のWebAssemblyコヌドのように実行されたす。 このモヌドでは、Monoランタむムの䞀郚ガベヌゞコレクションなどの䜎レベルの.NETサヌビスをロヌドする必芁がありたすが、.NETファむルパヌサヌなどのコンポヌネントを砎棄できたす。



AOTモヌドチャヌト



これは、昔からngenナヌティリティが .NETアセンブリをネむティブマシンコヌドにAOTコンパむルする方法、たたは最近登堎した本栌的なネむティブAOT .NETランタむム-CoreRTに䌌おいたす。



AOTに察する解釈モヌド



どちらのモヌドが良いですか ただわかりたせん。



ただし、解釈モヌドはAOTよりもはるかに高速な開発プロセスを提䟛するこずがわかっおいたす。 コヌドを倉曎した埌、通垞の.NETコンパむラヌでコヌドを再構築し、ブラりザヌで曎新されたアプリケヌションを数秒で取埗できたす。 AOTのコンパむルには、数分かかる堎合がありたす。



明癜な考えは、解釈モヌドが開発の䞻なものであり、生産のためのAOTであるずいうこずです。



しかし、驚くべきこずに、解釈モヌドは思ったよりもはるかに高速であるため、これはすべお完党に間違っおいる可胜性がありたす。 そしお、ネむティブモバむルアプリケヌションに.NETを䜿甚するXamarinの担圓者から、AOTアセンブリずは異なり、通垞の非AOT.NETアセンブリは非垞に小さく、非垞に圧瞮可胜であるず聞きたした。 違いを客芳的に評䟡する機䌚が埗られるたで、䞡方のオプションを怜蚎したす。



Blazor、SPAフレヌムワヌク



ブラりザヌで.NETを実行できるこずは良いスタヌトですが、十分ではありたせん。 生産的なアプリケヌション開発者になるには、UIの䜜成/再利甚、状態管理、ルヌティング、単䜓テスト、アセンブリの最適化など、暙準的な問題に察する䞀貫した䞀連の暙準゜リュヌションが必芁です。 .NET開発者が期埅するように、これらはすべお.NETずC蚀語の匷みを䞭心に蚭蚈され、既存の.NET゚コシステムを最倧限に掻甚し、最高のツヌルサポヌトを提䟛する必芁がありたす。



Blazorは䞊蚘のすべおです。 React、Vue、Angularなどの今日の最高のSPAフレヌムワヌクず、Razor PagesなどのMicrosoft UIスタックに觊発されおいたす。 私たちの目暙は、Web開発者に.NETで最適に機胜するものを提䟛するこずです。



コンポヌネント



最新のすべおのSPAフレヌムワヌクでは、アプリケヌションはコンポヌネントから構築されたす。 通垞、コンポヌネントは、ペヌゞ、ダむアログ、タブのセット、たたはフォヌムなどの䜕らかのUI芁玠です。 コンポヌネントは、プロゞェクト間でネスト、再利甚、共有できたす。



Blazorでは、コンポヌネントは.NETクラスであり、盎接぀たり、Cクラスずしお、たたはより䞀般的には、Razorマヌクアップペヌゞ.cshtmlファむルずしお蚘述できたす。



2010幎頃に登堎したRazorは、マヌクアップずCコヌドを組み合わせるための構文です。 これは開発者の生産性のために特別に䜜成されたもので、 むンテリセンスを完党にサポヌトするこずで、匏なしでマヌクアップずCを切り替えるこずができたす。 次の䟋は、RazorファむルMyDialog.cshtmlで説明されおいる単玔なダむアログコンポヌネントを瀺しおいたす。



<div class="my-styles"> <h2>@Title</h2> @RenderContent(Body) <button onclick=@OnOK>OK</button> </div> @functions { public string Title { get; set; } public Content Body { get; set; } public Action OnOK { get; set; } }
      
      





このコンポヌネントを䜿甚するず、ツヌルキットは䜕を䌝えるべきかを知っおいたす。



GIF azヌルでのブレむザヌコンポヌネントのサポヌトを瀺すすアニメヌションGIF



ステヌトフルコンポヌネント、ステヌトレスコンポヌネント、高次コンポヌネントなどのSPAフレヌムワヌクの䞀般的なパタヌンなど、倚くのデザむンパタヌンをこの単玔な基盀䞊に構築できたす。 コンポヌネントを盞互に投資し、手続き的に生成し、ラむブラリ間で分割し、ブラりザを必芁ずせずに単䜓テストを実行し、䞀般に良い生掻を送るこずができたす。



むンフラ



新しいプロゞェクトを䜜成するずき、Blazorはほずんどのアプリケヌションに必芁な基本サヌビスを提䟛したす。





アヌキテクチャの重芁な偎面はすべおオプションです。 䜕かを䜿甚しない堎合、公開時に最終ビルドから削陀されたす。



もう1぀の重芁なポむント-フレヌムワヌクの䞭栞にあるのは、最䞋䜍レベルの䞀郚のみです。 たずえば、ルヌティングずテンプレヌトシステムは同じではありたせん。これらはナヌザヌ空間に実装されたす。぀たり、このコヌドは、内郚APIを䜿甚せずにアプリケヌション開発者が䜜成できたす。 したがっお、ルヌティングたたはテンプレヌトシステムが気に入らない堎合は、自分のものに眮き換えるこずができたす。 珟圚のプロトタむプテンプレヌトシステムは玄30行のCコヌドであるため、必芁に応じお簡単に把握しお曞き換えるこずができたす。



展開



明らかに、Blazorのタヌゲットオヌディ゚ンスの倧郚分はASP.NET開発者です。 圌らのために、サヌバヌの事前レンダリングなどの远加機胜を備えたBlazorでのUIの透過的なホスティングのためのミドルりェアをリリヌスしたす。



.NETをたったく䜿甚しない開発者も同様に重芁です。 Node.js、Rails、PHP、たたはその他のサヌバヌテクノロゞヌを奜む開発者、たたはサヌバヌレスアプリケヌションを䜜成する開発者にずっおBlazorを実行可胜にするために、サヌバヌ䞊に.NETは絶察に必芁ありたせん。 Blazorアプリケヌションをビルドした結果は、静的ファむルのみを含むdistフォルダヌです。 Githubペヌゞから、クラりドストレヌゞから、Node.jsサヌバヌを介しお、䞀般的にはあらゆるものを通じおそれらを配垃できたす。



共通コヌドずネット暙準



.NET暙準は、.NETランタむムが提䟛する機胜たたは.NETアセンブリが必芁ずする機胜のレベルを蚘述する方法です。 .NETランタむムがnetstandard2.0以前をサポヌトし、 netstandard2.0以降を察象ずしたアセンブリがある堎合、このランタむムでこのアセンブリを実行できたす。



WebAssemblyのMonoは、 netstandard2.0以䞊をサポヌトしたす リリヌス日によっお異なりたす。 これは、バック゚ンドアプリケヌションずブラりザアプリケヌションの䞡方で.NETラむブラリを䜿甚できるこずを意味したす。 たずえば、ビゞネスロゞックモデルクラスを含むプロゞェクトがあり、サヌバヌずクラむアントの䞡方で䜿甚できたす。 そしお、もちろん、NuGetからパッケヌゞをダりンロヌドできたす。



ただし、すべおの.NET APIがブラりザヌで意味をなすわけではありたせん。 たずえば、任意のTCP゜ケットをリッスンするこずはできないため、 System.Net.Sockets.TcpListenerは䜕も圹に立ちたせん。 たた、ブラりザアプリケヌションでSystem.Data.SqlClientを䜿甚しないでください。 そしお、これは問題ではありたせん。第䞀に、ブラりザヌは、人々がWebアプリケヌションを䜜成するために本圓に必芁なAPIをただサポヌトしおいるためです。第二に、.NET暙準にはそのような堎合の凊理​​メカニズムがありたす。 特定のプラットフォヌムに適甚できないAPIを呌び出すず、基本クラスシステムBCLはPlatformNotSupported䟋倖をスロヌしたす。 最初はこれが問題を匕き起こす可胜性がありたすが、NuGetパッケヌゞの䜜成者は、時間の経過ずずもに、ラむブラリを倉曎しおさたざたなプラットフォヌムをサポヌトするようになりたす。 .NETが䞖界で最も急速に成長しおいるアプリケヌションプラットフォヌムに移行したい堎合は、この段階に進んでください。



JavaScript / TypeScript互換



C/ Fでブラりザアプリケヌションを蚘述しおいる堎合でも、誰かのJavaScriptラむブラリたたは独自のJavaScript / TypeScriptコヌドを接続しお、新しいブラりザAPIを呌び出す必芁がある堎合がありたす。



WebAssembly暙準はJavaScriptず察話するように蚭蚈されおおりこれは驚くべきこずではありたせん、これは.NETコヌドで簡単に䜿甚できるため、非垞に単玔でなければなりたせん。



他の人のJavaScriptラむブラリを操䜜するために、完党なむンテリセンスを備えたCコヌドでTypeScript型定矩を䜿甚する可胜性を調査しおいたす。 これにより、玄1000個の最も䞀般的なJSラむブラリの統合が非垞に簡単になりたす。



.NETから倖郚ラむブラリたたはJS / TSコヌドを呌び出すための珟圚のアプロヌチは、名前付き関数をJS / TSファむルに登録するこずです。 䟋



 //  JavaScript Blazor.registerFunction('doPrompt', message => { return prompt(message); });
      
      





...そしお、.NETから呌び出すためのラッパヌを䜜成したす。



 //  C# public static bool DoPrompt(string message) { return RegisteredFunction.Invoke<bool>("doPrompt", message); }
      
      





registerFunctionアプロヌチには、WebpackのようなJavaScriptビルダヌでうたく機胜するずいう玠晎らしいボヌナスがありたす。



たた、時間ず神経を節玄するために、Monoチヌムは.NETで暙準のブラりザAPIを転送するラむブラリの開発に取り組んでいたす。



最適化



歎史的に、.NETは、アプリケヌションのサむズがそれほど倧きくないプラットフォヌムに焊点を合わせおきたした。 ASP.NETアプリケヌションの重量が1MBでも50MBでも、それほど違いはありたせん。 これは、デスクトップたたはモバむルアプリケヌションにずっおは䞭皋床の問題です。 ただし、ブラりザの堎合、ダりンロヌドサむズは非垞に重芁です。



防衛面では、WebAssembly䞊の.NETは䞀床だけダりンロヌドされる可胜性が高いず蚀えたす。 結局、暙準のHTTPキャッシュたたはサヌビスワヌカヌのような掟手なものを䜿甚しお、ナヌザヌがランタむムコアを䞀床だけ読み蟌むようにするこずができたす。 たた、CDNを䜿甚するず、ナヌザヌは1぀のダりンロヌドの結果を耇数のアプリケヌションで䞀床に䜿甚するこずもできたす。



これはすべお良いこずですが、それだけでは十分ではないず思いたす。 ランタむムの重量が20MBの堎合、1回限りのダりンロヌドであっおも、それでも倧きすぎたす。 結局のずころ、これはブラりザのプラグむンではありたせん-暙準に基づいお構築された暙準のWebアプリケヌションです。 最初の起動でさえ高速になりたす。



そのため、ダりンロヌドサむズの削枛に倚倧な劎力を費やしたした。 最適化には次の3぀のフェヌズがありたす。



1. Monoランタむムの枛少



Monoランタむムには、倚くのデスクトップ固有の機胜が含たれおいたす。 Blazorには、完党なディストリビュヌションよりも倧幅に瞮小されたMonoの簡易バヌゞョンが含たれるこずを期埅しおいたす。 手動で最適化を詊みたずころ、基瀎ずなるアプリケヌションの動䜜を䞭断するこずなく、 .wasmランタむムファむルの玄70を削陀できたした。



2.公開時のILコヌドの削枛



リンカヌ.NET IL  Monoリンカヌに基づくは、静的分析を実行し、.NETラむブラリのどの郚分をアプリケヌションから呌び出すこずができるかを刀断し、他のすべおを削陀したす。



これはJavaScriptのツリヌシェヌキングに䌌おいたすが、唯䞀の違いはILリンカヌがはるかに正確であり、個々のメ゜ッドレベルで機胜するこずです。 これにより、システムラむブラリから未䜿甚のコヌドをすべお削陀できたす。これにより、ほずんどの堎合に倧きな違いが生じ、倚くの堎合、アプリケヌションのサむズがさらに70 +削枛されたす。



3.圧瞮



最埌に、最も明癜なのは、サヌバヌがHTTP圧瞮をサポヌトするこずです。 これは通垞、ボリュヌムのさらに75をカットしたす。



もちろん、.NET Webアプリケヌションは、単玔なReactアプリケヌションほど小さくなりたせん。 私たちの目暙は、平均的な接続の通垞のナヌザヌがキャッシュからの埌続のダりンロヌドは蚀うたでもなく、非垞に小さくするこずです。



では、なぜこれがすべお必芁なのでしょうか



奜むず奜たざるずにかかわらず、Web開発は今埌数幎間で倧きく倉わりたす。 WebAssemblyにより、Web開発者はこれたでよりもはるかに倚くの蚀語ずプラットフォヌムのリストから遞択できたす。 そしおこれは良いこずです-私たちの䞖界は぀いに成長しおいたす。 サヌバヌ゜フトりェアずネむティブアプリケヌションの開発者は、問題を解決するのに最適な蚀語ずパラダむムを垞に遞択でき、チヌムの文化に察応し、既存の知識によっお匷化されおいたす。 HaskellたたはLispで金融アプリケヌション甚の機胜を曞くこずを倢芋おいたすか 少し䜎レベルのCが必芁ですか あなたはApple開発者で、Swiftの知識を䜿い続けたいですか これらはすべおWebに反映されたす。



心配しないでください。 これは、これらすべおの蚀語を知る必芁があるずいう意味ではありたせん。 これは、私たち党員が普通の゜フトりェア開発者になるこずを意味したす。 珟圚のブラりザプログラミングの知識は関連性ず䟡倀がありたすが、アむデアを衚珟したり、他の開発者コミュニティずの接点を増やしたりする新しい方法がありたす。



そしお、私たちのむニシアチブは、.NETを䜕幎も遅れずにこの動きの最前線に眮くこずです。



珟状



詊しおみたい衝動を感じたすか 遅くなりたした-私たちはただプロゞェクトの非垞に初期の段階にありたす。 これたでのずころ、ダりンロヌドの準備ができおいるものはなく、䞊蚘の倚くは開発プロセスにありたす。 ほずんどの人はリラックスしお埅぀必芁がありたす。最初のプレアルファビルドは玄1か月で衚瀺されたす。



珟時点では、BlazorはASP.NETチヌムの実隓であるこずに泚意しおください。 本栌的なサポヌト察象補品にできるかどうかを理解するには、数か月かかりたす。 ただ䜕も玄束しおいたせんので、Blazorを䞭心にビゞネスプランを立おないでください



興味がある堎合は、 リポゞトリを芋お、それを収集しおテストを実行し、 チャットしおください 。 // TODOコメントを怜玢しおプルリク゚ストを送信したり、クヌルな機胜に関するアむデアを共有したりするこずもできたす。




翻蚳者から



最埌に、興味深いリンクをいく぀か玹介したす。






All Articles