{"id":14041,"date":"2022-06-27T07:00:19","date_gmt":"2022-06-27T05:00:19","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=14041"},"modified":"2023-05-30T14:42:55","modified_gmt":"2023-05-30T12:42:55","slug":"tworzenie-frontendu-aplikacji-webowych-w-c-z-wykorzystaniem-blazor","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/tworzenie-frontendu-aplikacji-webowych-w-c-z-wykorzystaniem-blazor\/","title":{"rendered":"Tworzenie frontendu aplikacji webowych w C# z wykorzystaniem Blazor"},"content":{"rendered":"\n<p>W 2018 Microsoft wyda\u0142 pierwsz\u0105 wersje frameworku, kt\u00f3ry mia\u0142 pozwoli\u0107 developerom .NET na pisanie zar\u00f3wno backendu jak i frontendu wy\u0142\u0105cznie w C#.<\/p>\n\n\n\n<p> Na wersje produkcyjna musieli\u015bmy poczeka\u0107 kolejne 2 lata, lecz musz\u0119 przyzna\u0107, \u017ce warto by\u0142o czeka\u0107. Teraz mo\u017cemy bez wi\u0119kszego problemu powiedzie\u0107, \u017ce nic nie stoi na przeszkodzie, aby\u015bmy <strong>rozwijali si\u0119 w kierunku fullstack .NET developera.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Czym jest Blazor?<\/h2>\n\n\n\n<p>U podstaw le\u017cy technologia WebAssembly, kt\u00f3ra pozwala na uruchamianie natywnego kodu C# czy chocia\u017cby Rust w przegl\u0105darce. Po wej\u015bciu na stron\u0119 pobierany jest dotnet runtime oraz dllki z kodem aplikacji.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter wp-image-14042\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.-1.png\"><img decoding=\"async\" width=\"1153\" height=\"411\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.-1.png\" alt=\"Diagram prezentuj\u0105cy pobrane pliki po wej\u015bciu na stron\u0119\" class=\"wp-image-14042\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.-1.png 1153w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.-1-300x107.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.-1-1024x365.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.-1-768x274.png 768w\" sizes=\"(max-width: 1153px) 100vw, 1153px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 1 Pobrane pliki po wej\u015bciu na stron\u0119<\/figcaption><\/figure>\n\n\n\n<p>Nast\u0119pnie jest on wykonywany bezpo\u015brednio przez przegl\u0105dark\u0119. Aplikacje napisane w taki spos\u00f3b mog\u0105 by\u0107 nawet hostowane jako statyczne bez backendu i dzia\u0142a\u0107 w pe\u0142ni offline.<\/p>\n\n\n\n<p>Mieli\u015bmy ju\u017c do czynienia z pr\u00f3bami uruchomienia kodu innego ni\u017c JavaScript poprzez przesy\u0142anie akcji u\u017cytkownika na serwer i renderowanie odpowiedzi (WebForms) czy konwertowania kodu do JavaScriptu (SharpKit), lecz tym razem <strong>mo\u017cemy wykona\u0107 kod C# bezpo\u015brednio w przegl\u0105darce!<\/strong><\/p>\n\n\n\n<p>Obecnie wszystkie przegl\u0105darki poza IE wspieraj\u0105 standard WebAssembly, wi\u0119c nie musimy si\u0119 o to martwi\u0107.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.2-Wsparcie.png\"><img decoding=\"async\" width=\"300\" height=\"125\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.2-Wsparcie-300x125.png\" alt=\"Tabela z przegl\u0105darkami\" class=\"wp-image-14821\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.2-Wsparcie-300x125.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.2-Wsparcie.png 618w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 2 Wsparcie WebAssembly w przegl\u0105darkach<\/figcaption><\/figure>\n\n\n\n<p>Nie zabiera nam to mo\u017cliwo\u015bci wykorzystania JavaScriptu w naszym kodzie. Zosta\u0142 stworzony do tego serwis JSInterop, kt\u00f3ry pozwala na komunikacje w obie strony, dzi\u0119ki czemu biblioteki takie jak Bootstrap czy Materialize mog\u0105 by\u0107 wykorzystywane wraz z Blazorem. Powsta\u0142o nawet wiele wrapper\u00f3w np. MudBlazor czy Blazorise, kt\u00f3re maj\u0105 przygotowan\u0105 komunikacje mi\u0119dzy Blazorem a JavaScriptem wraz z opakowanymi elementami bibliotek w komponenty Blazora.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zalety i wady Blazora<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Kilka s\u0142\u00f3w o zaletach<\/h3>\n\n\n\n<p>Wykorzystanie Blazora w projektach mo\u017ce przynie\u015b\u0107 kilka pozytywnych skutk\u00f3w. Jako developerzy, zwi\u0105zani ze stackiem technologicznym Microsoftu wi\u0119kszo\u015b\u0107 naszego oprogramowania powstaje w j\u0119zyku C#, a co za tym idzie mamy w nich najwi\u0119cej do\u015bwiadczenia, kt\u00f3re mo\u017cemy przy wykorzystaniu Blazora przenie\u015b\u0107 na frontend, zwi\u0119kszaj\u0105c tym samym nasz\u0105 produktywno\u015b\u0107.<\/p>\n\n\n\n<p>Ponadto b\u0119d\u0105c developerami aplikacji desktopowych, mobilnych b\u0105d\u017a backednowych \u0142atwiej b\u0119dzie nam wej\u015b\u0107 w \u015bwiat frontendu wykorzystuj\u0105c ten sam j\u0119zyk i wiele bibliotek, kt\u00f3rych u\u017cywali\u015bmy do tej pory. Natomiast, je\u017celi rozwijamy projekt legacy w technologiach takich jak WebForms to Blazor proponowany jest jako rozwi\u0105zanie, do kt\u00f3rego migracja b\u0119dzie o wiele prostsza i szybsza ni\u017c do alternatywnych rozwi\u0105za\u0144 z wykorzystaniem framework\u00f3w Javascript.<\/p>\n\n\n\n<p>Obok Blazora w wersji na aplikacje webowe prowadzone s\u0105 r\u00f3wnie\u017c prace nad .NET MAUI Blazor. Jest to podej\u015bcie z wykorzystaniem Blazora na aplikacje mobilne i desktopowe, wi\u0119c pisz\u0105c aplikacje w Blazorze, mo\u017cemy przenosi\u0107 mi\u0119dzy r\u00f3\u017cnymi platformami.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kilka s\u0142\u00f3w o wadach<\/h3>\n\n\n\n<p>Aby nie by\u0107 jednostronnym pora na kilka wad Blazora, z kt\u00f3rymi warto si\u0119 zapozna\u0107 przed zdecydowaniem si\u0119 na wykorzystanie go w projektach.<\/p>\n\n\n\n<p>Przede wszystkim Blazor ca\u0142y czas jest wolniejszy, je\u017celi chodzi o za\u0142adowanie aplikacji od alternatywnych rozwi\u0105za\u0144. Dodatkowo, pliki niezb\u0119dne do uruchomienia aplikacji s\u0105 znacznie wi\u0119ksze. Warto o tym pami\u0119ta\u0107 i upewni\u0107 si\u0119, \u017ce nie jest jednym z wa\u017cniejszych wymaga\u0144 w Twoim projekcie.<\/p>\n\n\n\n<p>Oczywi\u015bcie sam Blazor jako nadal stosunkowo nowe rozwi\u0105zanie ma znacznie mniejsz\u0105 rozpoznawalno\u015b\u0107 ni\u017c takie frameworki jak Angular czy React przez co na rynku jest trudniej znale\u017a\u0107 osoby do\u015bwiadczone.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Podsumujmy wady i zalety Blazora<\/h3>\n\n\n\n<p><strong>Zalety:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Przenoszenie do\u015bwiadcze\u0144 w .NET na frontend.<\/li>\n\n\n\n<li>\u0141atwiejszy start we frontendzie dla developer\u00f3w desktopowych, mobilnych i backendowych.<\/li>\n\n\n\n<li>Zwi\u0119kszona produktywno\u015b\u0107.<\/li>\n\n\n\n<li>Wsp\u00f3\u0142dzielenie kodu mi\u0119dzy backendem i frontendem.<\/li>\n\n\n\n<li>\u0141atwiejsza migracja projekt\u00f3w legacy.<\/li>\n\n\n\n<li>Mo\u017cliwo\u015b\u0107 \u0142atwiejszego tworzenia aplikacji multiplatformowych.<\/li>\n<\/ul>\n\n\n\n<p><strong>Wady:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wolniejszy czas za\u0142adowania aplikacji od rozwi\u0105za\u0144 w JavaScripcie takich jak Angular czy React.<\/li>\n\n\n\n<li>Wi\u0119ksze pliki do pobrania na starcie.<\/li>\n\n\n\n<li>Mniej rozpoznawalny przez co jest mniej do\u015bwiadczonych developer\u00f3w.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Gdzie si\u0119 sprawdzi?<\/h2>\n\n\n\n<p>Blazor na pewno zostanie przywitalny z otwartymi r\u0119kami <strong>w startupach i projektach, gdzie developerzy musz\u0105 rozwija\u0107 zar\u00f3wno frontend jak i backend<\/strong>. Sprawdzi si\u0119 tak\u017ce w projektach na potrzeby wewn\u0119trzne firm, takich jak systemy CRM czy obs\u0142uga proces\u00f3w firmowych. Musimy tylko pami\u0119ta\u0107, aby wcze\u015bniej upewni\u0107 si\u0119, \u017ce maszyny, na kt\u00f3rych b\u0119d\u0105 uruchamiane aplikacje, poradz\u0105 sobie pod wzgl\u0119dem wydajno\u015bci.<\/p>\n\n\n\n<p>Jestem te\u017c przekonany, \u017ce na wszelkiego rodzaju warsztatach czy prezentacjach b\u0119dzie to jeden z cz\u0119stszych wybor\u00f3w, ze wzgl\u0119du na jego prostot\u0119 i \u0142atwo\u015b\u0107 w przygotowaniu oraz wdro\u017ceniu rozwi\u0105zania.<\/p>\n\n\n\n<p>W przypadku projekt\u00f3w z bran\u017cy e-commerce, gdzie czas wyrenderowania aplikacji mo\u017ce mie\u0107 znaczenie oraz <strong>w przypadku projekt\u00f3w IoT \/ Embbedded<\/strong> sprawdzi\u0142bym na pocz\u0105tku, jakie s\u0105 parametry urz\u0105dzenia, na kt\u00f3rym b\u0119dzie hostowana aplikacja, aby mie\u0107 pewno\u015b\u0107, \u017ce nie wyst\u0105pi\u0105 problemy wydajno\u015bciowe, kt\u00f3rych nie b\u0119dzie si\u0119 da\u0142o rozwi\u0105za\u0107.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Przyk\u0142adowa aplikacja<\/h2>\n\n\n\n<p>Pora sprawdzi\u0107 jak Blazor radzi sobie w akcji. Przyjrzymy si\u0119 jego mo\u017cliwo\u015bciom, wykorzystuj\u0105c podstawow\u0105 aplikacj\u0119, kt\u00f3r\u0105 dostaniemy po utworzeniu nowego projektu. Mo\u017cemy go utworzy\u0107 wykorzystuj\u0105c Visual Studio poprzez <em>Create a new project<\/em> oraz wybieraj\u0105c <em>Blazor WebAssembly App<\/em>. Alternatywnie mo\u017cemy u\u017cy\u0107 dotnet cli i wpisa\u0107 w wierszu polece\u0144 <em>dotnet new blazorwasm<\/em>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Struktura projektu<\/h3>\n\n\n\n<p>Na pocz\u0105tek zerknijmy na struktur\u0119 projektu.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full wp-image-14044\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.3.png\"><img decoding=\"async\" width=\"238\" height=\"304\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.3.png\" alt=\"Struktura projektu\" class=\"wp-image-14044\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.3.png 238w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.3-235x300.png 235w\" sizes=\"(max-width: 238px) 100vw, 238px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 3 Struktura projektu<\/figcaption><\/figure>\n\n\n\n<p>Aplikacja sk\u0142ada si\u0119 z plik\u00f3w razor, kt\u00f3re pozwalaj\u0105 na jednoczesne wykorzystywanie sk\u0142adni html oraz C#. Tworzenie aplikacji w Blazorze jest podobne do tego znanego z React. Ca\u0142a aplikacja zbudowana jest z mniejszych cz\u0119\u015bci zwanych komponentami.<\/p>\n\n\n\n<p>W pliku <em>Program.cs<\/em> znajduje si\u0119 informacja o g\u0142\u00f3wnym komponencie<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter wp-image-14045\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.-4.png\"><img decoding=\"async\" width=\"1211\" height=\"257\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.-4.png\" alt=\"Program.cs\" class=\"wp-image-14045\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.-4.png 1211w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.-4-300x64.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.-4-1024x217.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.-4-768x163.png 768w\" sizes=\"(max-width: 1211px) 100vw, 1211px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 4 Program.cs<\/figcaption><\/figure>\n\n\n\n<p>Jest to komponent <em>App.razor<\/em>, kt\u00f3ry b\u0119dzie wyrenderowany w miejscu oznaczonym id #app. To nasz komponent rozruchowy aplikacji i zawiera takie elementy jak routing czy obs\u0142uga b\u0142\u0119d\u00f3w.<\/p>\n\n\n\n<p>Nast\u0119pnie mamy jeszcze plik <em>_Imports.razor<\/em>, kt\u00f3ry pozwala na dodanie przestrzeni nazw dla wszystkich komponent\u00f3w. W ramach samych komponent\u00f3w mamy jeszcze rozr\u00f3\u017cnienie na takie, kt\u00f3re zajmuj\u0105 si\u0119 Layoutem, czyli uk\u0142adem komponent\u00f3w wewn\u0105trz aplikacji, aby\u015bmy nie musieli powiela\u0107 tych samych sekcji w wielu miejscach oraz komponentach, kt\u00f3re zajmuj\u0105 si\u0119 ju\u017c bezpo\u015brednio logik\u0105 naszej aplikacji.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Komponent<\/h3>\n\n\n\n<p>Jest to spora dawka wiedzy, a zrozumienie mechanizmu dzia\u0142ania jej mo\u017ce Ci chwil\u0119 zaj\u0105\u0107, dlatego na ten moment spr\u00f3bujmy skupi\u0107 si\u0119 na podstawowym elemencie Blazora czyli komponencie. Wykorzystamy do tego plik <em>Counter.razor<\/em>, kt\u00f3ry wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full wp-image-14046\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.5.png\"><img decoding=\"async\" width=\"730\" height=\"328\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.5.png\" alt=\"Kod Counter.razor\" class=\"wp-image-14046\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.5.png 730w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.5-300x135.png 300w\" sizes=\"(max-width: 730px) 100vw, 730px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 5 Counter.razor<\/figcaption><\/figure>\n\n\n\n<p>Sk\u0142ada si\u0119 on z dw\u00f3ch sekcji. Pierwsza odpowiada za to, co widzimy na ekranie po uruchomieniu aplikacji. Znajduj\u0105 si\u0119 tu tagi html oraz kod C#, kt\u00f3ry musi by\u0107 poprzedzony znacznikiem @, aby kompilator m\u00f3g\u0142 zrozumie\u0107 nasze intencje. Dalej mamy sekcj\u0119 @code z wy\u0142\u0105cznie kodem C#. Ta sekcja odpowiada za code-behind naszego komponentu. W tym miejscu mamy dost\u0119p do metod cyklu \u017cycia naszego komponentu, mo\u017cemy te\u017c tworzy\u0107 pola i metody, kt\u00f3re b\u0119d\u0105 nast\u0119pnie wykonywane i wy\u015bwietlane w aplikacji.<\/p>\n\n\n\n<p>W naszym przypadku komponent Counter odpowiada za zwi\u0119kszenie licznika klikni\u0119\u0107 w przycisk. Wykorzystujemy do tego pole currentCount, kt\u00f3re jest wy\u015bwietlane w aplikacji oraz metod\u0119 IncrementCount, kt\u00f3ra zosta\u0142a podczepiona do akcji klikni\u0119cia poprzez @onclick. Po uruchomieniu aplikacji i przej\u015bciu do zak\u0142adki Counter powinni\u015bmy dosta\u0107 taki w\u0142a\u015bnie widok:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter wp-image-14047\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.6.png\"><img decoding=\"async\" width=\"955\" height=\"350\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.6.png\" alt=\"Widok Counter\" class=\"wp-image-14047\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.6.png 955w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.6-300x110.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Ryc.6-768x281.png 768w\" sizes=\"(max-width: 955px) 100vw, 955px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 6 Widok Counter<\/figcaption><\/figure>\n\n\n\n<p>Klikni\u0119cie w przycisk spowoduje zwi\u0119kszenie licznika Current counter o 1. Jest to jedna z podstawowych interakcji z u\u017cytkownikiem, jakie mo\u017cemy zastosowa\u0107 w naszych komponentach. W przypadku formularzy mamy dodatkowe mo\u017cliwo\u015bci takie jak <strong>bindowanie danych czy walidacja.<\/strong><\/p>\n\n\n\n<p>Nasz komponent by\u0142 dost\u0119pny pod adresem \/counter. By\u0142o to mo\u017cliwe dzi\u0119ki zastosowaniu atrybutu @page. Mogliby\u015bmy pomin\u0105\u0107 ten atrybut w przypadku, gdyby komponent by\u0142 wykorzystywany wy\u0142\u0105cznie wewn\u0105trz innych. Poza nim wyst\u0119puj\u0105 te\u017c inne atrybuty takie jak @implements, @inherits, @using czy @inject, kt\u00f3re pozwalaj\u0105 na budowanie drzewa dziedziczenia czy wstrzykiwanie serwis\u00f3w do komponentu.<\/p>\n\n\n\n<p>Przedstawi\u0142em Ci zaledwie podstawy dzia\u0142ania aplikacji opartych o Blazora. Zach\u0119cam Ci\u0119 do dok\u0142adniejszego przeanalizowania ich samodzielnie. Mo\u017cesz zacz\u0105\u0107 od sprawdzenia komponentu <em>FetchData.razor<\/em>, kt\u00f3ry pobiera i wy\u015bwietla dane pogodowe.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p>Je\u017celi z jakiego\u015b powodu b\u0119d\u0105c developerem .NET jeszcze nie s\u0142ysza\u0142e\u015b o Blazorze, to mam nadziej\u0119, \u017ce przekona\u0142em Ci\u0119, \u017ce warto go wypr\u00f3bowa\u0107. Min\u0119\u0142o ju\u017c kilka lat od wydania pierwszej wersji oraz wersji stabilnej produkcyjnie i wygl\u0105da na to, \u017ce Blazor zostanie z nami na d\u0142u\u017cej, wi\u0119c warto go przetestowa\u0107. Kto wie, mo\u017ce to w\u0142a\u015bnie <strong>Blazor pozwoli Ci dostarczy\u0107 kolejny projekt na czas.<\/strong><\/p>\n\n\n\n<p>Natomiast, je\u017celi ju\u017c s\u0142ysza\u0142e\u015b o Blazorze albo nawet masz z nim pewne do\u015bwiadczenia to mam nadzieje, \u017ce sekcja o wadach i zaletach oraz jego potencjalnym zastosowaniu pozwoli\u0142a Ci na uzupe\u0142nienie wiedzy o nowe spojrzenie.<\/p>\n\n\n\n<p>W mojej opinii jest to framework, kt\u00f3ry idealnie pasuje do tego, czym zajmujemy si\u0119 jako developerzy .NET, buduj\u0105c nasze aplikacje zar\u00f3wno na backendzie jak i frontendzie, mo\u017cemy wykorzysta\u0107 wiedz\u0119, kt\u00f3r\u0105 ju\u017c mamy, dostarczaj\u0105c tym samym nasze produkty jeszcze szybciej i z jeszcze wi\u0119ksz\u0105 jako\u015bci\u0105.<\/p>\n\n\n\n<p>Na koniec zostawiam Ci\u0119 z my\u015bl\u0105, \u017ce Blazor si\u0119 ci\u0105gle rozwija i ca\u0142kiem mo\u017cliwe, \u017ce w momencie, gdy to czytasz niekt\u00f3re jego problemy zosta\u0142y ju\u017c rozwi\u0105zane, a mo\u017ce nawet Blazor po kilku aktualizacjach wraz .NET zyska\u0142 na kolejnych zaletach, za co trzymam kciuki!<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u015bli interesuje Ci\u0119 .NET, zach\u0119camy do lektury artyku\u0142\u00f3w naszych specjalist\u00f3w poruszaj\u0105cych t\u0119 tematyk\u0119 np. <a href=\"https:\/\/sii.pl\/blog\/en\/oauth-2-0-on-behalf-flow-in-azure-active-directory-and-net-core\/?category=hard-development&amp;tag=net-core-en%2Cactive-directory-en%2Casp-net-core-en%2Cazure-en&amp;preview_id=9545&amp;preview_nonce=ef8a27917c&amp;preview=true&amp;_thumbnail_id=9715\" target=\"_blank\" rel=\"noopener\">OAuth 2.0 On Behalf flow in Azure Active Directory and .NET Core<\/a>. Je\u015bli chcesz dowiedzie\u0107 si\u0119 wi\u0119cej nt. zastosowania frontendu, przeczytaj koniecznie artyku\u0142 <a href=\"https:\/\/sii.pl\/blog\/modern-frontend-in-ecommerce\/?category=development-na-miekko&amp;tag=e-commerce%2Cfrontend%2Creact&amp;preview_id=9982&amp;preview_nonce=5a89b36bab&amp;preview=true&amp;_thumbnail_id=10160\" target=\"_blank\" rel=\"noopener\">Nowoczesny frontend w e-commerce.<\/a><\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;14041&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;8&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 8)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Tworzenie frontendu aplikacji webowych w C# z wykorzystaniem Blazor&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 8)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>W 2018 Microsoft wyda\u0142 pierwsz\u0105 wersje frameworku, kt\u00f3ry mia\u0142 pozwoli\u0107 developerom .NET na pisanie zar\u00f3wno backendu jak i frontendu wy\u0142\u0105cznie &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/tworzenie-frontendu-aplikacji-webowych-w-c-z-wykorzystaniem-blazor\/\">Continued<\/a><\/p>\n","protected":false},"author":283,"featured_media":14801,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":5,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1316],"tags":[299,802,129,287],"class_list":["post-14041","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-miekko","tag-aplikacja-webowa","tag-blazor","tag-c","tag-software-development"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Tworzenie-frontendu-aplikacji-webowych-1.png","category_names":["Development na mi\u0119kko"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/14041"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/283"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=14041"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/14041\/revisions"}],"predecessor-version":[{"id":22054,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/14041\/revisions\/22054"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/14801"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=14041"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=14041"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=14041"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}