{"id":14855,"date":"2023-02-28T10:21:48","date_gmt":"2023-02-28T09:21:48","guid":{"rendered":"https:\/\/vived.io\/?p=14855"},"modified":"2023-02-28T10:21:51","modified_gmt":"2023-02-28T09:21:51","slug":"apple-obiera-kurs-na-pwa-frontend-weekly-vol-126","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/","title":{"rendered":"Apple obiera kurs na PWA? | Frontend Weekly vol. 126"},"content":{"rendered":"\n<h2 id=\"1-paczka-nowosci-w-safari\" data-num=1>1. Paczka nowo\u015bci w Safari<\/h2>\n\n\n\n<p><strong>TLDR:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Do Safari 16.4 zmierza wsparcie Web Push Notifications<\/li>\n\n\n\n<li>Web Push Notifications b\u0119d\u0105 dzia\u0142a\u0107 tylko dla aplikacji dodanych do ekranu g\u0142\u00f3wnego.<\/li>\n\n\n\n<li>Dodawanie aplikacji do ekranu g\u0142\u00f3wnego nadal pozostaje ukryte w ci\u0119\u017ckodost\u0119pnym miejscu.<\/li>\n\n\n\n<li>Ustawieniami aplikacji PWA b\u0119dziemy zarz\u0105dza\u0107 w taki sam spos\u00f3b, jak tych pobranych z AppStore.<\/li>\n\n\n\n<li>Do najnowszego Safari trafia te\u017c sporo wa\u017cnych z punktu widzenia API. Mi\u0119dzy innymi Badge API, WakeLock API, UserActivation API czy ScreenOrientation API.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>W kontek\u015bcie Safari i aplikacji webowych w Apple zasz\u0142a ostatnio gigantyczna zmiana. Przez lata przegl\u0105darka na urz\u0105dzenia z jab\u0142uszkiem uznawana by\u0142a za Internet Explorer naszych czas\u00f3w, a programi\u015bci nieustannie narzekali na brakuj\u0105ce funkcjonalno\u015bci i drobne glitche. Interop 2022, to wypracowany przez Google, Mozill\u0119 i Apple zestaw test\u00f3w maj\u0105cych na celu ujednolicenie API przegl\u0105darek. W rankingu tym Safari zako\u0144czy\u0142o rok ze spor\u0105 przewag\u0105 nad Chrome i Firefox i zapowiedzia\u0142o dalsz\u0105 prac\u0119 nad jak najlepszym wynikiem w ramach Interop 2023. Wszystko wskazuje na to, \u017ce nie by\u0142y to puste s\u0142owa. W minionym tygodniu ukaza\u0142a si\u0119 beta iOS 16.4. i iPadOS 16.4, a wraz z ni\u0105 beta nowego Safari. Lista zmian i nowo\u015bci jest naprawd\u0119 d\u0142uga &#8211; najd\u0142u\u017cszha od lat. <\/p>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-rich is-provider-twitter wp-block-embed-twitter\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"twitter-tweet\" data-width=\"500\" data-dnt=\"true\"><p lang=\"en\" dir=\"ltr\">Probably nothing <a href=\"https:\/\/t.co\/n0OUWQAwdo\">pic.twitter.com\/n0OUWQAwdo<\/a><\/p>&mdash; Guillermo Rauch (@rauchg) <a href=\"https:\/\/twitter.com\/rauchg\/status\/1627108483412938752?ref_src=twsrc%5Etfw\">February 19, 2023<\/a><\/blockquote><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script>\n<\/div><\/figure>\n\n\n\n<p>Najwi\u0119ksza nowo\u015b\u0107 w iOS 16.4, to zapowiedziane ju\u017c w czerwcu minionego roku wsparcie dla Web Push Notifications. Dlaczego Apple tak d\u0142ugo zwleka\u0142o z implementacj\u0105 tej fundamentalnej dla PWA funkcjonalno\u015bci? Oficjalnie chodzi\u0142o o dobro u\u017cytkownik\u00f3w (Kto nigdy przez przypadek nie w\u0142\u0105czy\u0142 nachalnych notyfikacji niech pierwszy rzuci kamieniem) W kuluarach kr\u0105\u017cy jednak alternatywna teoria. Apple od ka\u017cdej tranzakcji w swoim sklepie pobiera spor\u0105 prowizj\u0119, a w pe\u0142ni rozwini\u0119te aplikacje PWA by\u0142yby sposobem na unikni\u0119cie tak zwanego Apple Tax. Apple mo\u017ce usun\u0105\u0107 niechc\u0105cego podporz\u0105dkowa\u0107 si\u0119 regu\u0142om Fortnite z App Store, ale nie ma w\u0142adzy usun\u0105\u0107 go z internetu.<\/p>\n\n\n\n<p>Co wi\u0119c zmieni\u0142o si\u0119 w strategii Apple? Z jednej strony firma w ostatnich latach coraz mocniej rozwija ga\u0142\u0105\u017a serwis\u00f3w-us\u0142ug jak Apple Music czy Apple TV i powoli odchodzi od prowizyjnego modelu zarabiania. Z drugiej strony na horyzoncie majaczy  wprowadzona przez Uni\u0119 Europejsk\u0105 ustawa Digital Markets Act, kt\u00f3ra ma na celu zwi\u0119kszenie konkurencji na europejskich rynkach cyfrowych, poprzez uniemo\u017cliwienie du\u017cym firmom nadu\u017cywania ich si\u0142y rynkowej. Spekuluje si\u0119, \u017ce ustawa ta zmusi Apple do dodania portu USB-C do iPhone i do dopuszczenia alternatywnych sklep\u00f3w z aplikacjami na iOS. Je\u015bli spekulacje te oka\u017c\u0105 si\u0119 prawdziwe, automatycznie znikn\u0105 argumenty Apple przeciwko PWA.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Wi\u0119cej o zmieniaj\u0105cej si\u0119 strategii Apple dowiecie si\u0119 z:<\/strong><br><a href=\"https:\/\/vived.io\/safari-with-support-for-web-push-notifications-frontend-weekly-vol-105\/\" target=\"_blank\" rel=\"noreferrer noopener\">\ud83d\udcdd Safari with support for Web Push Notifications | Frontend Weekly vol. 105<\/a><br><a href=\"https:\/\/vived.io\/the-end-of-the-webkit-monopoly-on-ios-frontend-weekly-vol-124\/\" target=\"_blank\" rel=\"noreferrer noopener\">\ud83d\udcdd The end of the WebKit monopoly on iOS? | Frontend Weekly vol. 124<\/a><br><a href=\"https:\/\/www.macrumors.com\/2022\/11\/01\/dma-eu-law-could-force-major-changes-apple\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd New EU Law Could Force Apple to Allow Other App Stores, Sideloading, and iMessage Interoperability<\/a><br><a href=\"https:\/\/webkit.org\/blog\/13878\/web-push-for-web-apps-on-ios-and-ipados\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd Web Push for Web Apps on iOS and iPadOS<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Czy czeka nas renesans aplikacji PWA? Niestety musz\u0119 ostudzi\u0107 optymistyczne nastroje. Wsparcie Web Push Notifications opatrzone jest gwiazdk\u0105 &#8211; funcjonalno\u015b\u0107 ta b\u0119dzie dzia\u0142a\u0107 tylko je\u015bli aplikacja zosta\u0142a dodana do ekranu g\u0142\u00f3wnego. Na pierwszy rzut oka nie brzmi to niepokoj\u0105co, ale dodawanie aplikacji do ekranu g\u0142\u00f3wnego nadal schowane jest w najmniej intuicyjnym miejscu jakie mo\u017cecie sobie wyobrazi\u0107 &#8211; w menu pojawiaj\u0105cym po klikni\u0119ciu przycisku Share. Jasne, w Waszej aplikacji mo\u017cecie umie\u015bci\u0107 odpowiedni tutorial, ale obawiam si\u0119 \u017ce wszystko powy\u017cej &#8222;One-Click Install&#8221; zniech\u0119ci wi\u0119kszo\u015b\u0107 u\u017cytkownik\u00f3w. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"618\" height=\"500\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/download-9.jpeg\" alt=\"\" class=\"wp-image-14869\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/download-9.jpeg 618w, https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/download-9-300x243.jpeg 300w\" sizes=\"auto, (max-width: 618px) 100vw, 618px\" \/><\/figure><\/div>\n\n\n<p>Jedno trzeba Apple przyzna\u0107 &#8211; przy okazji implementacji Web Push Notifications naprawd\u0119 zadbali oni o swoich u\u017cytkownik\u00f3w. Ustawieniami aplikacji dodanych do ekranu g\u0142ownego b\u0119dziemy sterowa\u0107 tak samo jak w przypadku natywnych aplikacji z poziomu ustawie\u0144. R\u00f3wnie\u017c zakres ustawie\u0144 b\u0119dzie taki sam jak dla aplikacji pobranych ze sklepu. Dzi\u0119ki temu, r\u00f3\u017cnica mi\u0119dzy PWA i natywn\u0105 aplikacj\u0105 powinna by\u0107 niezauwa\u017calna dla u\u017cytkownik\u00f3w.<\/p>\n\n\n\n<p>Wsparciu Web Push Notifications towarzyszy te\u017c szereg mniejszych funkjonalno\u015bci wspieraj\u0105cych. Od iOS 16.4 mo\u017cliwe b\u0119dzie sterowanie badgem wy\u015bwietlanym przy aplikacji. Zmieni si\u0119 te\u017c spos\u00f3b generownia ikony aplikacji. Do tej pory je\u015bli programi\u015bci nie dostarczyli specjalnych <code>apple-touch-icons<\/code>, to za ikon\u0119 aplikacji s\u0142u\u017cy\u0142 screenshot strony. Od teraz w przypadku braku <code>apple-touch-icons<\/code> wykorzystywane b\u0119d\u0105 dane z <code>manifest.json<\/code>. Kiedy zabraknie r\u00f3wnie\u017c ich, za ikon\u0119 aplikacji pos\u0142u\u017c\u0105 inicja\u0142y aplikacji. <\/p>\n\n\n\n<p>To jeszcze nie koniec nowo\u015bci Do iOS 16.4 trafi\u0107 ma <strong><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Screen_Wake_Lock_API\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Wake Lock API<\/a><\/strong>, kt\u00f3re pozwala op\u00f3\u017ani\u0107 zablokowanie ekranu je\u015bli aktualnie wykonywana jest d\u0142uga operacjia nie wymagaj\u0105ca interakcji u\u017cytkownika, <strong><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Screen_Orientation_API\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Screen Orientation API<\/a><\/strong>, kt\u00f3re pozwala nam si\u0119 dowiedzie\u0107 w jakiej orientacji znajduje si\u0119 aktualnie telefon i <strong><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/UserActivation\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">User Activation API<\/a><\/strong>, kt\u00f3re pozwala si\u0119 dowiedzie\u0107, czy u\u017cytkownik aktualnie korzysta z aplikacji. Jak na wersj\u0119 minor przegl\u0105darki nowo\u015bci jest nawprawd\u0119 du\u017co.<\/p>\n\n\n\n<h2 id=\"2-to-juz-koniec-rxjs-angular-pracuje-nad-nowym-modelem-reaktywnosci\" data-num=2>2. To ju\u017c koniec RxJS? Angular pracuje nad nowym modelem reaktywno\u015bci <\/h2>\n\n\n\n<p><strong>TLDR<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Zesp\u00f3\u0142 rozwijaj\u0105cy Angulara pracowa\u0142 przez ostatni rok nad opcjonalnym wyci\u0119ciem <code>zone.js<\/code>. Pierwszym krokiem w tym kierunku ma by\u0107 nowy reaktywny prymityw Signals.<\/li>\n\n\n\n<li>Pierwsze Developer Preivew Signals zobaczymy pocz\u0105tkiem maja w Angular 16. Pierwszych rozbudowanych RFC nale\u017cy si\u0119 spodziewa\u0107 w najbli\u017cszych tygodniach.<\/li>\n\n\n\n<li>Prymity Signals kojarzy\u0107 mo\u017cecie z innych framework\u00f3w takich jak SolidJS czy Vue.<\/li>\n\n\n\n<li>Singals s\u0105 znacznie prostsze od RxJS i przypominaj\u0105 hooki znane z React.<\/li>\n\n\n\n<li>RxJS najlepiej sprawdza si\u0119 do obs\u0142ugi wydarze\u0144 roz\u0142o\u017conych w czasie. Signals maj\u0105 najlepiej spradza\u0107 si\u0119 do zarz\u0105dzania stanem komponent\u00f3w.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Od dawna wiadomo by\u0142o, \u017ce zesp\u00f3\u0142 Angulara pracuje nad pozbyciem si\u0119 biblioteki stoj\u0105cej u podstaw frameworku &#8211; <code>zone.js<\/code>. Biblioteka ta odpiwiedzialna jest za monkey-patching natywnych metod przegl\u0105darki (np. <code>click<\/code>, <code>fetch<\/code>), tak aby Angular m\u00f3g\u0142 zareagowa\u0107 na interakcje u\u017cytkownika i asynchroniczne zdarzenia. To w\u0142a\u015bnie dzi\u0119ki <code>zone.js<\/code> mo\u017cemy imperatywnie zmieni\u0107 warto\u015b\u0107 zmiennej i automatycznie od\u015bwie\u017cy si\u0119 ona w interfejscie u\u017cytkownika. Niestety, to r\u00f3wnie\u017c <code>zone.js<\/code> jest sprawc\u0105 wielu problem\u00f3w z wydajno\u015bci\u0105 i cz\u0119st\u0105 przyczyn\u0105 bug\u00f3w. Nic wi\u0119c dziwnego, \u017ce zesp\u00f3\u0142 Angulara aktywnie eksploruje jego alternatywy.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"599\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/download-7.jpeg\" alt=\"\" class=\"wp-image-14865\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/download-7.jpeg 500w, https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/download-7-250x300.jpeg 250w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure><\/div>\n\n\n<p>Pierwszym krokiem w kierunku usuni\u0119cia <code>zone.js<\/code> ma by\u0107 wprowadzenie nowe prymitywu: Signals. Prymityw ten mo\u017cecie kojarzy\u0107 mi\u0119dzy innymi z Vue (Reactivity API z Vue 3 mo\u017ce by\u0107 uznane za implementacj\u0119 Signals), SolidJS (domy\u015blnie do zarz\u0105dzania stanem u\u017cywamy <code>useSignal<\/code>()), czy z licznych bibliotek dla React (najpopularniejsz\u0105 jest chyba ta stworzona przez tw\u00f3rc\u0119 Preact).  <\/p>\n\n\n\n<p>Signal to takie &#8222;pude\u0142ko&#8221; na warto\u015b\u0107. Do pude\u0142ka mo\u017cemy dowolnie wk\u0142\u0105da\u0107 now\u0105 zawarto\u015b\u0107, ale samo pude\u0142ko pozostaje takie samo. Z pude\u0142ek mo\u017cemy te\u017c tworzy\u0107 &#8222;matrioszki&#8221; &#8211; za ka\u017cdym razem kiedy w jakim\u015b pude\u0142ku zmieni si\u0119 warto\u015b\u0107, automatycznie od\u015biwe\u017cy si\u0119 ona r\u00f3wnie\u017c w pozosta\u0142ych pude\u0142kach. Mo\u017cemy te\u017c nas\u0142uchiwa\u0107 na zmiany zawarto\u015bci pude\u0142ka, czy po prostu sprawdzi\u0107 co aktualnie znajduje si\u0119 w pude\u0142ku.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">const counterA = signal(2);\nconst counterB = signal(5);\nconst sumOfCounterAandB = computed(() =&gt; counterA() + counterB());\n\nconst sideEffect = effect(() =&gt; \n    console.log(`Sum is: ${sumOfCounterAandB()}`\n);                                \/\/ Console output: Sum is: 7\ncounterA.set(3);                  \/\/ Console output: Sum is: 8\nconsole.log(sumOfCounterAandB()); \/\/ Console output: Sum is: 8\ncounterB.set(10);                 \/\/ Console output: Sum is: 13<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Wi\u0119cej o koncepcji Signals dowiecie si\u0119 z:<\/strong><br><a href=\"https:\/\/vived.io\/signal-a-new-way-to-manage-application-state-frontend-weekly-vol-104\/\" target=\"_blank\" rel=\"noreferrer noopener\">\ud83d\udcdd Signal \u2013 a new way to manage application state | Frontend Weekly vol. 104<\/a><br><a href=\"https:\/\/preactjs.com\/blog\/introducing-signals\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd Preact &#8211; Introducing Signals<\/a><br><a href=\"https:\/\/www.solidjs.com\/tutorial\/introduction_signals\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd SolidJS &#8211; Introducing Signals<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Dzi\u0119ki temu, \u017ce referencja do naszego pude\u0142ka nigdy si\u0119 nie zmienia, mo\u017cliwa jest agresywna optymalizacja renderowania. Szablon obesrwuje zmiany w interesuj\u0105cych go pude\u0142kach i odpowiednio od\u015bwie\u017ca HTML. Komponenty na dowolnym poziomie mog\u0105 obserwowa\u0107 zawarto\u015b\u0107 pude\u0142ek, dzi\u0119ki czemu unikamy sytuacji w kt\u00f3rej zmiana stanu przy korzeniu drzewa od\u015bwie\u017ca ca\u0142e drzewo. Mamy te\u017c wbudowany mechanizm subskrybcji na zmiany, wi\u0119c <code>zone.js<\/code> nie jest nam ju\u017c d\u0142u\u017cej potrzebny.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"620\" height=\"470\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/download-8.jpeg\" alt=\"\" class=\"wp-image-14867\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/download-8.jpeg 620w, https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/download-8-300x227.jpeg 300w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/figure><\/div>\n\n\n<p>Je\u015bli nacodzie\u0144 korzystacie z Angulara, to pewnie ju\u017c przysz\u0142o Wam do g\u0142owy pytanie, czym w\u0142a\u015bciwie r\u00f3\u017cni si\u0119 to wszystko od RxJS? Powy\u017cszy snippet mo\u017cna w ko\u0144cu przepisa\u0107 w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">const counterA$ = new BehaviourSubject(2);\nconst counterB$ = new BegaviourSubject(5);\ncost sumOfCounterAandB$ = combineLatest([counterA$, counterB$]).pipe(shareReplay(1));\n\nconst getSum = async () =&gt; `Sum is: ${await firstValueFrom(sumOfCounterAandB$)}`;\n\nsumOfCounterAandB.subscribe(value =&gt; \n    console.log(`Sum is: ${value}`)\n);                                    \/\/ Console output: Sum is: 7\ncounterA$.next(3);                    \/\/ Console output: Sum is: 8\nconsole.log(getSum());                \/\/ Console output: Sum is: 8\ncounterB$.next(10);                   \/\/ Console output: Sum is: 13<\/code><\/pre>\n\n\n\n<p>Je\u015bli macie ju\u017c spore do\u015bwiadczenie z RxJS, to prawdopodobnie oba przedstawione snippety s\u0105 dla Was r\u00f3wnie czytelne. Gwarantuj\u0119 Wam jednak, \u017ce dla os\u00f3b niezaznajomionych z RxJS wydarzy\u0142o si\u0119 w\u0142a\u015bnie sporo czarnej magii. Czym jest <code>BehaviourSubject<\/code> i czym r\u00f3\u017cni si\u0119 od <code>Subject<\/code>? Jak dzia\u0142a <code>combineLatest<\/code> i co w\u0142a\u015bciwie robi <code>shareReplay(1)<\/code>? Kiedy w\u0142a\u015bciwie wywo\u0142ywana jest funkcja sumuj\u0105ca? Na RxJS sk\u0142ada si\u0119 ponad 50 operator\u00f3w, nierzadko r\u00f3\u017cni\u0105cych si\u0119 tylko drobnymi detalami. Aby p\u0142ynnie operowa\u0107 RxJS musimy zrozumie\u0107 r\u00f3\u017cnice mi\u0119dzy hot i cold observables, a tak\u017ce dog\u0142\u0119bnie pozna\u0107 mechanizmy asynchroniczno\u015bci w JavaScript. Ca\u0142kiem tego sporo jak na proste sumowanie dw\u00f3ch zmiennych.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Wi\u0119cej o RxJS dowiecie si\u0119 z:<\/strong><br><a href=\"https:\/\/benlesh.medium.com\/hot-vs-cold-observables-f8094ed53339\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd Hot vs Cold Observables<\/a><br><a href=\"https:\/\/stackblogger.com\/real-world-examples-of-some-common-observable-operators\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd Real World Examples of 5 Common Observable Operators<\/a><br><a href=\"https:\/\/medium.com\/volosoft\/whats-new-in-rxjs-7-a11cc564c6c0\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd What&#8217;s new in RxJS 7<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Jak przyznaj\u0105 tw\u00f3rcy Angulara (i ja zgadzam si\u0119 z nimi w 100%), RxJS \u015bwietnie sprawdza si\u0119 wsz\u0119dzie tam, gdzie musimy modelowa\u0107 wydarzenia w czasie. Je\u015bli chodzi o modelowanie stanu aplikacji, to istnieje sporo lepszych rozwi\u0105za\u0144 i Signals s\u0105 jednym z nich. Nie nale\u017cy spodziewa\u0107 si\u0119, \u017ce RxJS ca\u0142kowicie zniknie z naszych aplikacji. W nasze r\u0119ce oddane zostan\u0105 po prostu narz\u0119dzia, kt\u00f3re pozwoli nam wbija\u0107 gwo\u017adzie m\u0142otkiem i wkr\u0119ca\u0107 wkr\u0119ty \u015brubokr\u0119tem.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Wi\u0119cej o Signals w Angularze dowiecie si\u0119 z:<\/strong><br><a href=\"https:\/\/www.youtube.com\/watch?v=4FkFmn0LmLI\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcfa Angular is about to get its most IMPORTANT change in a long time&#8230;<\/a><br><a href=\"https:\/\/www.youtube.com\/watch?v=HstDoVQeP9g\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcfa SolidJS interviews Angular creators about Signals (5h!)<\/a><br><a href=\"https:\/\/medium.com\/herodevs\/angular-proposes-fine-gained-reactivity-with-signals-152a2d26fe2f\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd Angular Proposes Fine-Grained Reactivity With Signals<\/a><br><a href=\"https:\/\/dev.to\/this-is-angular\/i-changed-my-mind-angular-needs-a-reactive-primitive-n2g\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd I changed my mind. Angular needs a reactive primitive<\/a><br><a href=\"https:\/\/github.com\/angular\/angular\/discussions\/49090\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd [Watch This Space] Angular Reactivity with Signals<\/a><br><a href=\"https:\/\/angular-signals.netlify.app\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83c\udfae Angular Signals Demo<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","protected":false},"excerpt":{"rendered":"<p>Temat Apple i Safari wraca do nas jak bumerang. Tym razem na tapet bierzemy temat aplikacji PWA, bo wygl\u0105da na to, \u017ce firma z Cupertino postanowi\u0142 na powa\u017cnie zainteresowa\u0107 si\u0119 tematem. Poza tym, w dzisiejszym raporcie przeczytacie te\u017c o alternatywie* dla RxJS od zespo\u0142u Angulara.<\/p>\n","protected":false},"author":12,"featured_media":14877,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[273,1],"tags":[],"class_list":["post-14855","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-frontend-pl","category-no-category"],"acf":{"feature_image_visible":false,"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/Frontend-Weekly-1200x628_V2-4.png","feature_image_blog":{"ID":14872,"id":14872,"title":"tborowicz_vl_a_teenager_receiving_mobile_push_notification_in_p_f9ac5b28-c094-4442-9443-e3503131e02e","filename":"tborowicz_vl_a_teenager_receiving_mobile_push_notification_in_p_f9ac5b28-c094-4442-9443-e3503131e02e.png","filesize":1036246,"url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/tborowicz_vl_a_teenager_receiving_mobile_push_notification_in_p_f9ac5b28-c094-4442-9443-e3503131e02e.png","link":"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/tborowicz_vl_a_teenager_receiving_mobile_push_notification_in_p_f9ac5b28-c094-4442-9443-e3503131e02e\/","alt":"","author":"12","description":"","caption":"","name":"tborowicz_vl_a_teenager_receiving_mobile_push_notification_in_p_f9ac5b28-c094-4442-9443-e3503131e02e","status":"inherit","uploaded_to":14855,"date":"2023-02-27 16:54:13","modified":"2023-02-27 16:54:13","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/vived.io\/wp-includes\/images\/media\/default.png","width":1536,"height":1024,"sizes":{"thumbnail":"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/tborowicz_vl_a_teenager_receiving_mobile_push_notification_in_p_f9ac5b28-c094-4442-9443-e3503131e02e-150x150.png","thumbnail-width":150,"thumbnail-height":150,"medium":"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/tborowicz_vl_a_teenager_receiving_mobile_push_notification_in_p_f9ac5b28-c094-4442-9443-e3503131e02e-300x200.png","medium-width":300,"medium-height":200,"medium_large":"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/tborowicz_vl_a_teenager_receiving_mobile_push_notification_in_p_f9ac5b28-c094-4442-9443-e3503131e02e-768x512.png","medium_large-width":768,"medium_large-height":512,"large":"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/tborowicz_vl_a_teenager_receiving_mobile_push_notification_in_p_f9ac5b28-c094-4442-9443-e3503131e02e-1024x683.png","large-width":1024,"large-height":683,"1536x1536":"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/tborowicz_vl_a_teenager_receiving_mobile_push_notification_in_p_f9ac5b28-c094-4442-9443-e3503131e02e.png","1536x1536-width":1536,"1536x1536-height":1024,"2048x2048":"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/tborowicz_vl_a_teenager_receiving_mobile_push_notification_in_p_f9ac5b28-c094-4442-9443-e3503131e02e.png","2048x2048-width":1536,"2048x2048-height":1024,"gform-image-choice-sm":"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/tborowicz_vl_a_teenager_receiving_mobile_push_notification_in_p_f9ac5b28-c094-4442-9443-e3503131e02e.png","gform-image-choice-sm-width":300,"gform-image-choice-sm-height":200,"gform-image-choice-md":"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/tborowicz_vl_a_teenager_receiving_mobile_push_notification_in_p_f9ac5b28-c094-4442-9443-e3503131e02e.png","gform-image-choice-md-width":400,"gform-image-choice-md-height":267,"gform-image-choice-lg":"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/tborowicz_vl_a_teenager_receiving_mobile_push_notification_in_p_f9ac5b28-c094-4442-9443-e3503131e02e.png","gform-image-choice-lg-width":600,"gform-image-choice-lg-height":400}},"estimated_reading_time":"8"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Apple obiera kurs na PWA? | Frontend Weekly vol. 126 - Vived<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Apple obiera kurs na PWA? | Frontend Weekly vol. 126 - Vived\" \/>\n<meta property=\"og:description\" content=\"Temat Apple i Safari wraca do nas jak bumerang. Tym razem na tapet bierzemy temat aplikacji PWA, bo wygl\u0105da na to, \u017ce firma z Cupertino postanowi\u0142 na powa\u017cnie zainteresowa\u0107 si\u0119 tematem. Poza tym, w dzisiejszym raporcie przeczytacie te\u017c o alternatywie* dla RxJS od zespo\u0142u Angulara.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2023-02-28T09:21:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-02-28T09:21:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/Frontend-Weekly-1200x628_V2-4.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Tomasz Borowicz\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/\"},\"author\":{\"name\":\"Tomasz Borowicz\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb\"},\"headline\":\"Apple obiera kurs na PWA? | Frontend Weekly vol. 126\",\"datePublished\":\"2023-02-28T09:21:48+00:00\",\"dateModified\":\"2023-02-28T09:21:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/\"},\"wordCount\":1600,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/Frontend-Weekly-1200x628_V2-4.png\",\"articleSection\":[\"Frontend\",\"No category\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/\",\"url\":\"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/\",\"name\":\"Apple obiera kurs na PWA? | Frontend Weekly vol. 126 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/Frontend-Weekly-1200x628_V2-4.png\",\"datePublished\":\"2023-02-28T09:21:48+00:00\",\"dateModified\":\"2023-02-28T09:21:51+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/Frontend-Weekly-1200x628_V2-4.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/Frontend-Weekly-1200x628_V2-4.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Apple obiera kurs na PWA? | Frontend Weekly vol. 126\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/vived.io\/pl\/#website\",\"url\":\"https:\/\/vived.io\/pl\/\",\"name\":\"Vived\",\"description\":\"platform empowering IT people and technology companies to synergic growth\",\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/vived.io\/pl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/vived.io\/pl\/#organization\",\"name\":\"Vived\",\"url\":\"https:\/\/vived.io\/pl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"width\":136,\"height\":45,\"caption\":\"Vived\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb\",\"name\":\"Tomasz Borowicz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/804536d2672538508d43f60ad2108e5aaea76c192653eaf95d4c3934b7d1dbb6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/804536d2672538508d43f60ad2108e5aaea76c192653eaf95d4c3934b7d1dbb6?s=96&d=mm&r=g\",\"caption\":\"Tomasz Borowicz\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Apple obiera kurs na PWA? | Frontend Weekly vol. 126 - Vived","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/","og_locale":"pl_PL","og_type":"article","og_title":"Apple obiera kurs na PWA? | Frontend Weekly vol. 126 - Vived","og_description":"Temat Apple i Safari wraca do nas jak bumerang. Tym razem na tapet bierzemy temat aplikacji PWA, bo wygl\u0105da na to, \u017ce firma z Cupertino postanowi\u0142 na powa\u017cnie zainteresowa\u0107 si\u0119 tematem. Poza tym, w dzisiejszym raporcie przeczytacie te\u017c o alternatywie* dla RxJS od zespo\u0142u Angulara.","og_url":"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/","og_site_name":"Vived","article_published_time":"2023-02-28T09:21:48+00:00","article_modified_time":"2023-02-28T09:21:51+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/Frontend-Weekly-1200x628_V2-4.png","type":"image\/png"}],"author":"Tomasz Borowicz","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/"},"author":{"name":"Tomasz Borowicz","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb"},"headline":"Apple obiera kurs na PWA? | Frontend Weekly vol. 126","datePublished":"2023-02-28T09:21:48+00:00","dateModified":"2023-02-28T09:21:51+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/"},"wordCount":1600,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/Frontend-Weekly-1200x628_V2-4.png","articleSection":["Frontend","No category"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/","url":"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/","name":"Apple obiera kurs na PWA? | Frontend Weekly vol. 126 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/Frontend-Weekly-1200x628_V2-4.png","datePublished":"2023-02-28T09:21:48+00:00","dateModified":"2023-02-28T09:21:51+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/Frontend-Weekly-1200x628_V2-4.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/Frontend-Weekly-1200x628_V2-4.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/apple-obiera-kurs-na-pwa-frontend-weekly-vol-126\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Apple obiera kurs na PWA? | Frontend Weekly vol. 126"}]},{"@type":"WebSite","@id":"https:\/\/vived.io\/pl\/#website","url":"https:\/\/vived.io\/pl\/","name":"Vived","description":"platform empowering IT people and technology companies to synergic growth","publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vived.io\/pl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/vived.io\/pl\/#organization","name":"Vived","url":"https:\/\/vived.io\/pl\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/","url":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","width":136,"height":45,"caption":"Vived"},"image":{"@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb","name":"Tomasz Borowicz","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/804536d2672538508d43f60ad2108e5aaea76c192653eaf95d4c3934b7d1dbb6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/804536d2672538508d43f60ad2108e5aaea76c192653eaf95d4c3934b7d1dbb6?s=96&d=mm&r=g","caption":"Tomasz Borowicz"}}]}},"blocks_vived":[{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>1. Paczka nowo\u015bci w Safari<\/h2>\n","innerContent":["\n<h2>1. Paczka nowo\u015bci w Safari<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>TLDR:<\/strong><\/p>\n","innerContent":["\n<p><strong>TLDR:<\/strong><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>Do Safari 16.4 zmierza wsparcie Web Push Notifications<\/li>\n","innerContent":["\n<li>Do Safari 16.4 zmierza wsparcie Web Push Notifications<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>Web Push Notifications b\u0119d\u0105 dzia\u0142a\u0107 tylko dla aplikacji dodanych do ekranu g\u0142\u00f3wnego.<\/li>\n","innerContent":["\n<li>Web Push Notifications b\u0119d\u0105 dzia\u0142a\u0107 tylko dla aplikacji dodanych do ekranu g\u0142\u00f3wnego.<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>Dodawanie aplikacji do ekranu g\u0142\u00f3wnego nadal pozostaje ukryte w ci\u0119\u017ckodost\u0119pnym miejscu.<\/li>\n","innerContent":["\n<li>Dodawanie aplikacji do ekranu g\u0142\u00f3wnego nadal pozostaje ukryte w ci\u0119\u017ckodost\u0119pnym miejscu.<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>Ustawieniami aplikacji PWA b\u0119dziemy zarz\u0105dza\u0107 w taki sam spos\u00f3b, jak tych pobranych z AppStore.<\/li>\n","innerContent":["\n<li>Ustawieniami aplikacji PWA b\u0119dziemy zarz\u0105dza\u0107 w taki sam spos\u00f3b, jak tych pobranych z AppStore.<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>Do najnowszego Safari trafia te\u017c sporo wa\u017cnych z punktu widzenia API. Mi\u0119dzy innymi Badge API, WakeLock API, UserActivation API czy ScreenOrientation API.<\/li>\n","innerContent":["\n<li>Do najnowszego Safari trafia te\u017c sporo wa\u017cnych z punktu widzenia API. Mi\u0119dzy innymi Badge API, WakeLock API, UserActivation API czy ScreenOrientation API.<\/li>\n"]}],"innerHTML":"\n<ul>\n\n\n\n\n\n\n\n<\/ul>\n","innerContent":["\n<ul>",null,"\n\n",null,"\n\n",null,"\n\n",null,"\n\n",null,"<\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>W kontek\u015bcie Safari i aplikacji webowych w Apple zasz\u0142a ostatnio gigantyczna zmiana. Przez lata przegl\u0105darka na urz\u0105dzenia z jab\u0142uszkiem uznawana by\u0142a za Internet Explorer naszych czas\u00f3w, a programi\u015bci nieustannie narzekali na brakuj\u0105ce funkcjonalno\u015bci i drobne glitche. Interop 2022, to wypracowany przez Google, Mozill\u0119 i Apple zestaw test\u00f3w maj\u0105cych na celu ujednolicenie API przegl\u0105darek. W rankingu tym Safari zako\u0144czy\u0142o rok ze spor\u0105 przewag\u0105 nad Chrome i Firefox i zapowiedzia\u0142o dalsz\u0105 prac\u0119 nad jak najlepszym wynikiem w ramach Interop 2023. Wszystko wskazuje na to, \u017ce nie by\u0142y to puste s\u0142owa. W minionym tygodniu ukaza\u0142a si\u0119 beta iOS 16.4. i iPadOS 16.4, a wraz z ni\u0105 beta nowego Safari. Lista zmian i nowo\u015bci jest naprawd\u0119 d\u0142uga - najd\u0142u\u017cszha od lat. <\/p>\n","innerContent":["\n<p>W kontek\u015bcie Safari i aplikacji webowych w Apple zasz\u0142a ostatnio gigantyczna zmiana. Przez lata przegl\u0105darka na urz\u0105dzenia z jab\u0142uszkiem uznawana by\u0142a za Internet Explorer naszych czas\u00f3w, a programi\u015bci nieustannie narzekali na brakuj\u0105ce funkcjonalno\u015bci i drobne glitche. Interop 2022, to wypracowany przez Google, Mozill\u0119 i Apple zestaw test\u00f3w maj\u0105cych na celu ujednolicenie API przegl\u0105darek. W rankingu tym Safari zako\u0144czy\u0142o rok ze spor\u0105 przewag\u0105 nad Chrome i Firefox i zapowiedzia\u0142o dalsz\u0105 prac\u0119 nad jak najlepszym wynikiem w ramach Interop 2023. Wszystko wskazuje na to, \u017ce nie by\u0142y to puste s\u0142owa. W minionym tygodniu ukaza\u0142a si\u0119 beta iOS 16.4. i iPadOS 16.4, a wraz z ni\u0105 beta nowego Safari. Lista zmian i nowo\u015bci jest naprawd\u0119 d\u0142uga - najd\u0142u\u017cszha od lat. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/embed","attrs":{"url":"https:\/\/twitter.com\/rauchg\/status\/1627108483412938752","type":"rich","providerNameSlug":"twitter","responsive":true,"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-embed aligncenter is-type-rich is-provider-twitter wp-block-embed-twitter\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/twitter.com\/rauchg\/status\/1627108483412938752\n<\/div><\/figure>\n","innerContent":["\n<figure class=\"wp-block-embed aligncenter is-type-rich is-provider-twitter wp-block-embed-twitter\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/twitter.com\/rauchg\/status\/1627108483412938752\n<\/div><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Najwi\u0119ksza nowo\u015b\u0107 w iOS 16.4, to zapowiedziane ju\u017c w czerwcu minionego roku wsparcie dla Web Push Notifications. Dlaczego Apple tak d\u0142ugo zwleka\u0142o z implementacj\u0105 tej fundamentalnej dla PWA funkcjonalno\u015bci? Oficjalnie chodzi\u0142o o dobro u\u017cytkownik\u00f3w (Kto nigdy przez przypadek nie w\u0142\u0105czy\u0142 nachalnych notyfikacji niech pierwszy rzuci kamieniem) W kuluarach kr\u0105\u017cy jednak alternatywna teoria. Apple od ka\u017cdej tranzakcji w swoim sklepie pobiera spor\u0105 prowizj\u0119, a w pe\u0142ni rozwini\u0119te aplikacje PWA by\u0142yby sposobem na unikni\u0119cie tak zwanego Apple Tax. Apple mo\u017ce usun\u0105\u0107 niechc\u0105cego podporz\u0105dkowa\u0107 si\u0119 regu\u0142om Fortnite z App Store, ale nie ma w\u0142adzy usun\u0105\u0107 go z internetu.<\/p>\n","innerContent":["\n<p>Najwi\u0119ksza nowo\u015b\u0107 w iOS 16.4, to zapowiedziane ju\u017c w czerwcu minionego roku wsparcie dla Web Push Notifications. Dlaczego Apple tak d\u0142ugo zwleka\u0142o z implementacj\u0105 tej fundamentalnej dla PWA funkcjonalno\u015bci? Oficjalnie chodzi\u0142o o dobro u\u017cytkownik\u00f3w (Kto nigdy przez przypadek nie w\u0142\u0105czy\u0142 nachalnych notyfikacji niech pierwszy rzuci kamieniem) W kuluarach kr\u0105\u017cy jednak alternatywna teoria. Apple od ka\u017cdej tranzakcji w swoim sklepie pobiera spor\u0105 prowizj\u0119, a w pe\u0142ni rozwini\u0119te aplikacje PWA by\u0142yby sposobem na unikni\u0119cie tak zwanego Apple Tax. Apple mo\u017ce usun\u0105\u0107 niechc\u0105cego podporz\u0105dkowa\u0107 si\u0119 regu\u0142om Fortnite z App Store, ale nie ma w\u0142adzy usun\u0105\u0107 go z internetu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Co wi\u0119c zmieni\u0142o si\u0119 w strategii Apple? Z jednej strony firma w ostatnich latach coraz mocniej rozwija ga\u0142\u0105\u017a serwis\u00f3w-us\u0142ug jak Apple Music czy Apple TV i powoli odchodzi od prowizyjnego modelu zarabiania. Z drugiej strony na horyzoncie majaczy  wprowadzona przez Uni\u0119 Europejsk\u0105 ustawa Digital Markets Act, kt\u00f3ra ma na celu zwi\u0119kszenie konkurencji na europejskich rynkach cyfrowych, poprzez uniemo\u017cliwienie du\u017cym firmom nadu\u017cywania ich si\u0142y rynkowej. Spekuluje si\u0119, \u017ce ustawa ta zmusi Apple do dodania portu USB-C do iPhone i do dopuszczenia alternatywnych sklep\u00f3w z aplikacjami na iOS. Je\u015bli spekulacje te oka\u017c\u0105 si\u0119 prawdziwe, automatycznie znikn\u0105 argumenty Apple przeciwko PWA.<\/p>\n","innerContent":["\n<p>Co wi\u0119c zmieni\u0142o si\u0119 w strategii Apple? Z jednej strony firma w ostatnich latach coraz mocniej rozwija ga\u0142\u0105\u017a serwis\u00f3w-us\u0142ug jak Apple Music czy Apple TV i powoli odchodzi od prowizyjnego modelu zarabiania. Z drugiej strony na horyzoncie majaczy  wprowadzona przez Uni\u0119 Europejsk\u0105 ustawa Digital Markets Act, kt\u00f3ra ma na celu zwi\u0119kszenie konkurencji na europejskich rynkach cyfrowych, poprzez uniemo\u017cliwienie du\u017cym firmom nadu\u017cywania ich si\u0142y rynkowej. Spekuluje si\u0119, \u017ce ustawa ta zmusi Apple do dodania portu USB-C do iPhone i do dopuszczenia alternatywnych sklep\u00f3w z aplikacjami na iOS. Je\u015bli spekulacje te oka\u017c\u0105 si\u0119 prawdziwe, automatycznie znikn\u0105 argumenty Apple przeciwko PWA.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Wi\u0119cej o zmieniaj\u0105cej si\u0119 strategii Apple dowiecie si\u0119 z:<\/strong><br><a href=\"https:\/\/vived.io\/safari-with-support-for-web-push-notifications-frontend-weekly-vol-105\/\" target=\"_blank\" rel=\"noreferrer noopener\">\ud83d\udcdd Safari with support for Web Push Notifications | Frontend Weekly vol. 105<\/a><br><a href=\"https:\/\/vived.io\/the-end-of-the-webkit-monopoly-on-ios-frontend-weekly-vol-124\/\" target=\"_blank\" rel=\"noreferrer noopener\">\ud83d\udcdd The end of the WebKit monopoly on iOS? | Frontend Weekly vol. 124<\/a><br><a href=\"https:\/\/www.macrumors.com\/2022\/11\/01\/dma-eu-law-could-force-major-changes-apple\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd New EU Law Could Force Apple to Allow Other App Stores, Sideloading, and iMessage Interoperability<\/a><br><a href=\"https:\/\/webkit.org\/blog\/13878\/web-push-for-web-apps-on-ios-and-ipados\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd Web Push for Web Apps on iOS and iPadOS<\/a><\/p>\n","innerContent":["\n<p><strong>Wi\u0119cej o zmieniaj\u0105cej si\u0119 strategii Apple dowiecie si\u0119 z:<\/strong><br><a href=\"https:\/\/vived.io\/safari-with-support-for-web-push-notifications-frontend-weekly-vol-105\/\" target=\"_blank\" rel=\"noreferrer noopener\">\ud83d\udcdd Safari with support for Web Push Notifications | Frontend Weekly vol. 105<\/a><br><a href=\"https:\/\/vived.io\/the-end-of-the-webkit-monopoly-on-ios-frontend-weekly-vol-124\/\" target=\"_blank\" rel=\"noreferrer noopener\">\ud83d\udcdd The end of the WebKit monopoly on iOS? | Frontend Weekly vol. 124<\/a><br><a href=\"https:\/\/www.macrumors.com\/2022\/11\/01\/dma-eu-law-could-force-major-changes-apple\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd New EU Law Could Force Apple to Allow Other App Stores, Sideloading, and iMessage Interoperability<\/a><br><a href=\"https:\/\/webkit.org\/blog\/13878\/web-push-for-web-apps-on-ios-and-ipados\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd Web Push for Web Apps on iOS and iPadOS<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Czy czeka nas renesans aplikacji PWA? Niestety musz\u0119 ostudzi\u0107 optymistyczne nastroje. Wsparcie Web Push Notifications opatrzone jest gwiazdk\u0105 - funcjonalno\u015b\u0107 ta b\u0119dzie dzia\u0142a\u0107 tylko je\u015bli aplikacja zosta\u0142a dodana do ekranu g\u0142\u00f3wnego. Na pierwszy rzut oka nie brzmi to niepokoj\u0105co, ale dodawanie aplikacji do ekranu g\u0142\u00f3wnego nadal schowane jest w najmniej intuicyjnym miejscu jakie mo\u017cecie sobie wyobrazi\u0107 - w menu pojawiaj\u0105cym po klikni\u0119ciu przycisku Share. Jasne, w Waszej aplikacji mo\u017cecie umie\u015bci\u0107 odpowiedni tutorial, ale obawiam si\u0119 \u017ce wszystko powy\u017cej \"One-Click Install\" zniech\u0119ci wi\u0119kszo\u015b\u0107 u\u017cytkownik\u00f3w. <\/p>\n","innerContent":["\n<p>Czy czeka nas renesans aplikacji PWA? Niestety musz\u0119 ostudzi\u0107 optymistyczne nastroje. Wsparcie Web Push Notifications opatrzone jest gwiazdk\u0105 - funcjonalno\u015b\u0107 ta b\u0119dzie dzia\u0142a\u0107 tylko je\u015bli aplikacja zosta\u0142a dodana do ekranu g\u0142\u00f3wnego. Na pierwszy rzut oka nie brzmi to niepokoj\u0105co, ale dodawanie aplikacji do ekranu g\u0142\u00f3wnego nadal schowane jest w najmniej intuicyjnym miejscu jakie mo\u017cecie sobie wyobrazi\u0107 - w menu pojawiaj\u0105cym po klikni\u0119ciu przycisku Share. Jasne, w Waszej aplikacji mo\u017cecie umie\u015bci\u0107 odpowiedni tutorial, ale obawiam si\u0119 \u017ce wszystko powy\u017cej \"One-Click Install\" zniech\u0119ci wi\u0119kszo\u015b\u0107 u\u017cytkownik\u00f3w. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":14869,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/download-9.jpeg\" alt=\"\" class=\"wp-image-14869\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/download-9.jpeg\" alt=\"\" class=\"wp-image-14869\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jedno trzeba Apple przyzna\u0107 - przy okazji implementacji Web Push Notifications naprawd\u0119 zadbali oni o swoich u\u017cytkownik\u00f3w. Ustawieniami aplikacji dodanych do ekranu g\u0142ownego b\u0119dziemy sterowa\u0107 tak samo jak w przypadku natywnych aplikacji z poziomu ustawie\u0144. R\u00f3wnie\u017c zakres ustawie\u0144 b\u0119dzie taki sam jak dla aplikacji pobranych ze sklepu. Dzi\u0119ki temu, r\u00f3\u017cnica mi\u0119dzy PWA i natywn\u0105 aplikacj\u0105 powinna by\u0107 niezauwa\u017calna dla u\u017cytkownik\u00f3w.<\/p>\n","innerContent":["\n<p>Jedno trzeba Apple przyzna\u0107 - przy okazji implementacji Web Push Notifications naprawd\u0119 zadbali oni o swoich u\u017cytkownik\u00f3w. Ustawieniami aplikacji dodanych do ekranu g\u0142ownego b\u0119dziemy sterowa\u0107 tak samo jak w przypadku natywnych aplikacji z poziomu ustawie\u0144. R\u00f3wnie\u017c zakres ustawie\u0144 b\u0119dzie taki sam jak dla aplikacji pobranych ze sklepu. Dzi\u0119ki temu, r\u00f3\u017cnica mi\u0119dzy PWA i natywn\u0105 aplikacj\u0105 powinna by\u0107 niezauwa\u017calna dla u\u017cytkownik\u00f3w.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wsparciu Web Push Notifications towarzyszy te\u017c szereg mniejszych funkjonalno\u015bci wspieraj\u0105cych. Od iOS 16.4 mo\u017cliwe b\u0119dzie sterowanie badgem wy\u015bwietlanym przy aplikacji. Zmieni si\u0119 te\u017c spos\u00f3b generownia ikony aplikacji. Do tej pory je\u015bli programi\u015bci nie dostarczyli specjalnych <code>apple-touch-icons<\/code>, to za ikon\u0119 aplikacji s\u0142u\u017cy\u0142 screenshot strony. Od teraz w przypadku braku <code>apple-touch-icons<\/code> wykorzystywane b\u0119d\u0105 dane z <code>manifest.json<\/code>. Kiedy zabraknie r\u00f3wnie\u017c ich, za ikon\u0119 aplikacji pos\u0142u\u017c\u0105 inicja\u0142y aplikacji. <\/p>\n","innerContent":["\n<p>Wsparciu Web Push Notifications towarzyszy te\u017c szereg mniejszych funkjonalno\u015bci wspieraj\u0105cych. Od iOS 16.4 mo\u017cliwe b\u0119dzie sterowanie badgem wy\u015bwietlanym przy aplikacji. Zmieni si\u0119 te\u017c spos\u00f3b generownia ikony aplikacji. Do tej pory je\u015bli programi\u015bci nie dostarczyli specjalnych <code>apple-touch-icons<\/code>, to za ikon\u0119 aplikacji s\u0142u\u017cy\u0142 screenshot strony. Od teraz w przypadku braku <code>apple-touch-icons<\/code> wykorzystywane b\u0119d\u0105 dane z <code>manifest.json<\/code>. Kiedy zabraknie r\u00f3wnie\u017c ich, za ikon\u0119 aplikacji pos\u0142u\u017c\u0105 inicja\u0142y aplikacji. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>To jeszcze nie koniec nowo\u015bci Do iOS 16.4 trafi\u0107 ma <strong><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Screen_Wake_Lock_API\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Wake Lock API<\/a><\/strong>, kt\u00f3re pozwala op\u00f3\u017ani\u0107 zablokowanie ekranu je\u015bli aktualnie wykonywana jest d\u0142uga operacjia nie wymagaj\u0105ca interakcji u\u017cytkownika, <strong><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Screen_Orientation_API\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Screen Orientation API<\/a><\/strong>, kt\u00f3re pozwala nam si\u0119 dowiedzie\u0107 w jakiej orientacji znajduje si\u0119 aktualnie telefon i <strong><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/UserActivation\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">User Activation API<\/a><\/strong>, kt\u00f3re pozwala si\u0119 dowiedzie\u0107, czy u\u017cytkownik aktualnie korzysta z aplikacji. Jak na wersj\u0119 minor przegl\u0105darki nowo\u015bci jest nawprawd\u0119 du\u017co.<\/p>\n","innerContent":["\n<p>To jeszcze nie koniec nowo\u015bci Do iOS 16.4 trafi\u0107 ma <strong><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Screen_Wake_Lock_API\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Wake Lock API<\/a><\/strong>, kt\u00f3re pozwala op\u00f3\u017ani\u0107 zablokowanie ekranu je\u015bli aktualnie wykonywana jest d\u0142uga operacjia nie wymagaj\u0105ca interakcji u\u017cytkownika, <strong><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Screen_Orientation_API\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Screen Orientation API<\/a><\/strong>, kt\u00f3re pozwala nam si\u0119 dowiedzie\u0107 w jakiej orientacji znajduje si\u0119 aktualnie telefon i <strong><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/UserActivation\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">User Activation API<\/a><\/strong>, kt\u00f3re pozwala si\u0119 dowiedzie\u0107, czy u\u017cytkownik aktualnie korzysta z aplikacji. Jak na wersj\u0119 minor przegl\u0105darki nowo\u015bci jest nawprawd\u0119 du\u017co.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>2. To ju\u017c koniec RxJS? Angular pracuje nad nowym modelem reaktywno\u015bci <\/h2>\n","innerContent":["\n<h2>2. To ju\u017c koniec RxJS? Angular pracuje nad nowym modelem reaktywno\u015bci <\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>TLDR<\/strong>:<\/p>\n","innerContent":["\n<p><strong>TLDR<\/strong>:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>Zesp\u00f3\u0142 rozwijaj\u0105cy Angulara pracowa\u0142 przez ostatni rok nad opcjonalnym wyci\u0119ciem <code>zone.js<\/code>. Pierwszym krokiem w tym kierunku ma by\u0107 nowy reaktywny prymityw Signals.<\/li>\n","innerContent":["\n<li>Zesp\u00f3\u0142 rozwijaj\u0105cy Angulara pracowa\u0142 przez ostatni rok nad opcjonalnym wyci\u0119ciem <code>zone.js<\/code>. Pierwszym krokiem w tym kierunku ma by\u0107 nowy reaktywny prymityw Signals.<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>Pierwsze Developer Preivew Signals zobaczymy pocz\u0105tkiem maja w Angular 16. Pierwszych rozbudowanych RFC nale\u017cy si\u0119 spodziewa\u0107 w najbli\u017cszych tygodniach.<\/li>\n","innerContent":["\n<li>Pierwsze Developer Preivew Signals zobaczymy pocz\u0105tkiem maja w Angular 16. Pierwszych rozbudowanych RFC nale\u017cy si\u0119 spodziewa\u0107 w najbli\u017cszych tygodniach.<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>Prymity Signals kojarzy\u0107 mo\u017cecie z innych framework\u00f3w takich jak SolidJS czy Vue.<\/li>\n","innerContent":["\n<li>Prymity Signals kojarzy\u0107 mo\u017cecie z innych framework\u00f3w takich jak SolidJS czy Vue.<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>Singals s\u0105 znacznie prostsze od RxJS i przypominaj\u0105 hooki znane z React.<\/li>\n","innerContent":["\n<li>Singals s\u0105 znacznie prostsze od RxJS i przypominaj\u0105 hooki znane z React.<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>RxJS najlepiej sprawdza si\u0119 do obs\u0142ugi wydarze\u0144 roz\u0142o\u017conych w czasie. Signals maj\u0105 najlepiej spradza\u0107 si\u0119 do zarz\u0105dzania stanem komponent\u00f3w.<\/li>\n","innerContent":["\n<li>RxJS najlepiej sprawdza si\u0119 do obs\u0142ugi wydarze\u0144 roz\u0142o\u017conych w czasie. Signals maj\u0105 najlepiej spradza\u0107 si\u0119 do zarz\u0105dzania stanem komponent\u00f3w.<\/li>\n"]}],"innerHTML":"\n<ul>\n\n\n\n\n\n\n\n<\/ul>\n","innerContent":["\n<ul>",null,"\n\n",null,"\n\n",null,"\n\n",null,"\n\n",null,"<\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Od dawna wiadomo by\u0142o, \u017ce zesp\u00f3\u0142 Angulara pracuje nad pozbyciem si\u0119 biblioteki stoj\u0105cej u podstaw frameworku - <code>zone.js<\/code>. Biblioteka ta odpiwiedzialna jest za monkey-patching natywnych metod przegl\u0105darki (np. <code>click<\/code>, <code>fetch<\/code>), tak aby Angular m\u00f3g\u0142 zareagowa\u0107 na interakcje u\u017cytkownika i asynchroniczne zdarzenia. To w\u0142a\u015bnie dzi\u0119ki <code>zone.js<\/code> mo\u017cemy imperatywnie zmieni\u0107 warto\u015b\u0107 zmiennej i automatycznie od\u015bwie\u017cy si\u0119 ona w interfejscie u\u017cytkownika. Niestety, to r\u00f3wnie\u017c <code>zone.js<\/code> jest sprawc\u0105 wielu problem\u00f3w z wydajno\u015bci\u0105 i cz\u0119st\u0105 przyczyn\u0105 bug\u00f3w. Nic wi\u0119c dziwnego, \u017ce zesp\u00f3\u0142 Angulara aktywnie eksploruje jego alternatywy.<\/p>\n","innerContent":["\n<p>Od dawna wiadomo by\u0142o, \u017ce zesp\u00f3\u0142 Angulara pracuje nad pozbyciem si\u0119 biblioteki stoj\u0105cej u podstaw frameworku - <code>zone.js<\/code>. Biblioteka ta odpiwiedzialna jest za monkey-patching natywnych metod przegl\u0105darki (np. <code>click<\/code>, <code>fetch<\/code>), tak aby Angular m\u00f3g\u0142 zareagowa\u0107 na interakcje u\u017cytkownika i asynchroniczne zdarzenia. To w\u0142a\u015bnie dzi\u0119ki <code>zone.js<\/code> mo\u017cemy imperatywnie zmieni\u0107 warto\u015b\u0107 zmiennej i automatycznie od\u015bwie\u017cy si\u0119 ona w interfejscie u\u017cytkownika. Niestety, to r\u00f3wnie\u017c <code>zone.js<\/code> jest sprawc\u0105 wielu problem\u00f3w z wydajno\u015bci\u0105 i cz\u0119st\u0105 przyczyn\u0105 bug\u00f3w. Nic wi\u0119c dziwnego, \u017ce zesp\u00f3\u0142 Angulara aktywnie eksploruje jego alternatywy.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":14865,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/download-7.jpeg\" alt=\"\" class=\"wp-image-14865\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/download-7.jpeg\" alt=\"\" class=\"wp-image-14865\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Pierwszym krokiem w kierunku usuni\u0119cia <code>zone.js<\/code> ma by\u0107 wprowadzenie nowe prymitywu: Signals. Prymityw ten mo\u017cecie kojarzy\u0107 mi\u0119dzy innymi z Vue (Reactivity API z Vue 3 mo\u017ce by\u0107 uznane za implementacj\u0119 Signals), SolidJS (domy\u015blnie do zarz\u0105dzania stanem u\u017cywamy <code>useSignal<\/code>()), czy z licznych bibliotek dla React (najpopularniejsz\u0105 jest chyba ta stworzona przez tw\u00f3rc\u0119 Preact).  <\/p>\n","innerContent":["\n<p>Pierwszym krokiem w kierunku usuni\u0119cia <code>zone.js<\/code> ma by\u0107 wprowadzenie nowe prymitywu: Signals. Prymityw ten mo\u017cecie kojarzy\u0107 mi\u0119dzy innymi z Vue (Reactivity API z Vue 3 mo\u017ce by\u0107 uznane za implementacj\u0119 Signals), SolidJS (domy\u015blnie do zarz\u0105dzania stanem u\u017cywamy <code>useSignal<\/code>()), czy z licznych bibliotek dla React (najpopularniejsz\u0105 jest chyba ta stworzona przez tw\u00f3rc\u0119 Preact).  <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Signal to takie \"pude\u0142ko\" na warto\u015b\u0107. Do pude\u0142ka mo\u017cemy dowolnie wk\u0142\u0105da\u0107 now\u0105 zawarto\u015b\u0107, ale samo pude\u0142ko pozostaje takie samo. Z pude\u0142ek mo\u017cemy te\u017c tworzy\u0107 \"matrioszki\" - za ka\u017cdym razem kiedy w jakim\u015b pude\u0142ku zmieni si\u0119 warto\u015b\u0107, automatycznie od\u015biwe\u017cy si\u0119 ona r\u00f3wnie\u017c w pozosta\u0142ych pude\u0142kach. Mo\u017cemy te\u017c nas\u0142uchiwa\u0107 na zmiany zawarto\u015bci pude\u0142ka, czy po prostu sprawdzi\u0107 co aktualnie znajduje si\u0119 w pude\u0142ku.<\/p>\n","innerContent":["\n<p>Signal to takie \"pude\u0142ko\" na warto\u015b\u0107. Do pude\u0142ka mo\u017cemy dowolnie wk\u0142\u0105da\u0107 now\u0105 zawarto\u015b\u0107, ale samo pude\u0142ko pozostaje takie samo. Z pude\u0142ek mo\u017cemy te\u017c tworzy\u0107 \"matrioszki\" - za ka\u017cdym razem kiedy w jakim\u015b pude\u0142ku zmieni si\u0119 warto\u015b\u0107, automatycznie od\u015biwe\u017cy si\u0119 ona r\u00f3wnie\u017c w pozosta\u0142ych pude\u0142kach. Mo\u017cemy te\u017c nas\u0142uchiwa\u0107 na zmiany zawarto\u015bci pude\u0142ka, czy po prostu sprawdzi\u0107 co aktualnie znajduje si\u0119 w pude\u0142ku.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"prismatic\/blocks","attrs":{"language":"javascript"},"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">const counterA = signal(2);\nconst counterB = signal(5);\nconst sumOfCounterAandB = computed(() => counterA() + counterB());\n\nconst sideEffect = effect(() => \n    console.log(`Sum is: ${sumOfCounterAandB()}`\n);                                \/\/ Console output: Sum is: 7\ncounterA.set(3);                  \/\/ Console output: Sum is: 8\nconsole.log(sumOfCounterAandB()); \/\/ Console output: Sum is: 8\ncounterB.set(10);                 \/\/ Console output: Sum is: 13<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">const counterA = signal(2);\nconst counterB = signal(5);\nconst sumOfCounterAandB = computed(() => counterA() + counterB());\n\nconst sideEffect = effect(() => \n    console.log(`Sum is: ${sumOfCounterAandB()}`\n);                                \/\/ Console output: Sum is: 7\ncounterA.set(3);                  \/\/ Console output: Sum is: 8\nconsole.log(sumOfCounterAandB()); \/\/ Console output: Sum is: 8\ncounterB.set(10);                 \/\/ Console output: Sum is: 13<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Wi\u0119cej o koncepcji Signals dowiecie si\u0119 z:<\/strong><br><a href=\"https:\/\/vived.io\/signal-a-new-way-to-manage-application-state-frontend-weekly-vol-104\/\" target=\"_blank\" rel=\"noreferrer noopener\">\ud83d\udcdd Signal \u2013 a new way to manage application state | Frontend Weekly vol. 104<\/a><br><a href=\"https:\/\/preactjs.com\/blog\/introducing-signals\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd Preact - Introducing Signals<\/a><br><a href=\"https:\/\/www.solidjs.com\/tutorial\/introduction_signals\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd SolidJS - Introducing Signals<\/a><\/p>\n","innerContent":["\n<p><strong>Wi\u0119cej o koncepcji Signals dowiecie si\u0119 z:<\/strong><br><a href=\"https:\/\/vived.io\/signal-a-new-way-to-manage-application-state-frontend-weekly-vol-104\/\" target=\"_blank\" rel=\"noreferrer noopener\">\ud83d\udcdd Signal \u2013 a new way to manage application state | Frontend Weekly vol. 104<\/a><br><a href=\"https:\/\/preactjs.com\/blog\/introducing-signals\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd Preact - Introducing Signals<\/a><br><a href=\"https:\/\/www.solidjs.com\/tutorial\/introduction_signals\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd SolidJS - Introducing Signals<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dzi\u0119ki temu, \u017ce referencja do naszego pude\u0142ka nigdy si\u0119 nie zmienia, mo\u017cliwa jest agresywna optymalizacja renderowania. Szablon obesrwuje zmiany w interesuj\u0105cych go pude\u0142kach i odpowiednio od\u015bwie\u017ca HTML. Komponenty na dowolnym poziomie mog\u0105 obserwowa\u0107 zawarto\u015b\u0107 pude\u0142ek, dzi\u0119ki czemu unikamy sytuacji w kt\u00f3rej zmiana stanu przy korzeniu drzewa od\u015bwie\u017ca ca\u0142e drzewo. Mamy te\u017c wbudowany mechanizm subskrybcji na zmiany, wi\u0119c <code>zone.js<\/code> nie jest nam ju\u017c d\u0142u\u017cej potrzebny.<\/p>\n","innerContent":["\n<p>Dzi\u0119ki temu, \u017ce referencja do naszego pude\u0142ka nigdy si\u0119 nie zmienia, mo\u017cliwa jest agresywna optymalizacja renderowania. Szablon obesrwuje zmiany w interesuj\u0105cych go pude\u0142kach i odpowiednio od\u015bwie\u017ca HTML. Komponenty na dowolnym poziomie mog\u0105 obserwowa\u0107 zawarto\u015b\u0107 pude\u0142ek, dzi\u0119ki czemu unikamy sytuacji w kt\u00f3rej zmiana stanu przy korzeniu drzewa od\u015bwie\u017ca ca\u0142e drzewo. Mamy te\u017c wbudowany mechanizm subskrybcji na zmiany, wi\u0119c <code>zone.js<\/code> nie jest nam ju\u017c d\u0142u\u017cej potrzebny.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":14867,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/download-8.jpeg\" alt=\"\" class=\"wp-image-14867\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/02\/download-8.jpeg\" alt=\"\" class=\"wp-image-14867\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli nacodzie\u0144 korzystacie z Angulara, to pewnie ju\u017c przysz\u0142o Wam do g\u0142owy pytanie, czym w\u0142a\u015bciwie r\u00f3\u017cni si\u0119 to wszystko od RxJS? Powy\u017cszy snippet mo\u017cna w ko\u0144cu przepisa\u0107 w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n","innerContent":["\n<p>Je\u015bli nacodzie\u0144 korzystacie z Angulara, to pewnie ju\u017c przysz\u0142o Wam do g\u0142owy pytanie, czym w\u0142a\u015bciwie r\u00f3\u017cni si\u0119 to wszystko od RxJS? Powy\u017cszy snippet mo\u017cna w ko\u0144cu przepisa\u0107 w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"prismatic\/blocks","attrs":{"language":"javascript"},"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">const counterA$ = new BehaviourSubject(2);\nconst counterB$ = new BegaviourSubject(5);\ncost sumOfCounterAandB$ = combineLatest([counterA$, counterB$]).pipe(shareReplay(1));\n\nconst getSum = async () => `Sum is: ${await firstValueFrom(sumOfCounterAandB$)}`;\n\nsumOfCounterAandB.subscribe(value => \n    console.log(`Sum is: ${value}`)\n);                                    \/\/ Console output: Sum is: 7\ncounterA$.next(3);                    \/\/ Console output: Sum is: 8\nconsole.log(getSum());                \/\/ Console output: Sum is: 8\ncounterB$.next(10);                   \/\/ Console output: Sum is: 13<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">const counterA$ = new BehaviourSubject(2);\nconst counterB$ = new BegaviourSubject(5);\ncost sumOfCounterAandB$ = combineLatest([counterA$, counterB$]).pipe(shareReplay(1));\n\nconst getSum = async () => `Sum is: ${await firstValueFrom(sumOfCounterAandB$)}`;\n\nsumOfCounterAandB.subscribe(value => \n    console.log(`Sum is: ${value}`)\n);                                    \/\/ Console output: Sum is: 7\ncounterA$.next(3);                    \/\/ Console output: Sum is: 8\nconsole.log(getSum());                \/\/ Console output: Sum is: 8\ncounterB$.next(10);                   \/\/ Console output: Sum is: 13<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli macie ju\u017c spore do\u015bwiadczenie z RxJS, to prawdopodobnie oba przedstawione snippety s\u0105 dla Was r\u00f3wnie czytelne. Gwarantuj\u0119 Wam jednak, \u017ce dla os\u00f3b niezaznajomionych z RxJS wydarzy\u0142o si\u0119 w\u0142a\u015bnie sporo czarnej magii. Czym jest <code>BehaviourSubject<\/code> i czym r\u00f3\u017cni si\u0119 od <code>Subject<\/code>? Jak dzia\u0142a <code>combineLatest<\/code> i co w\u0142a\u015bciwie robi <code>shareReplay(1)<\/code>? Kiedy w\u0142a\u015bciwie wywo\u0142ywana jest funkcja sumuj\u0105ca? Na RxJS sk\u0142ada si\u0119 ponad 50 operator\u00f3w, nierzadko r\u00f3\u017cni\u0105cych si\u0119 tylko drobnymi detalami. Aby p\u0142ynnie operowa\u0107 RxJS musimy zrozumie\u0107 r\u00f3\u017cnice mi\u0119dzy hot i cold observables, a tak\u017ce dog\u0142\u0119bnie pozna\u0107 mechanizmy asynchroniczno\u015bci w JavaScript. Ca\u0142kiem tego sporo jak na proste sumowanie dw\u00f3ch zmiennych.<\/p>\n","innerContent":["\n<p>Je\u015bli macie ju\u017c spore do\u015bwiadczenie z RxJS, to prawdopodobnie oba przedstawione snippety s\u0105 dla Was r\u00f3wnie czytelne. Gwarantuj\u0119 Wam jednak, \u017ce dla os\u00f3b niezaznajomionych z RxJS wydarzy\u0142o si\u0119 w\u0142a\u015bnie sporo czarnej magii. Czym jest <code>BehaviourSubject<\/code> i czym r\u00f3\u017cni si\u0119 od <code>Subject<\/code>? Jak dzia\u0142a <code>combineLatest<\/code> i co w\u0142a\u015bciwie robi <code>shareReplay(1)<\/code>? Kiedy w\u0142a\u015bciwie wywo\u0142ywana jest funkcja sumuj\u0105ca? Na RxJS sk\u0142ada si\u0119 ponad 50 operator\u00f3w, nierzadko r\u00f3\u017cni\u0105cych si\u0119 tylko drobnymi detalami. Aby p\u0142ynnie operowa\u0107 RxJS musimy zrozumie\u0107 r\u00f3\u017cnice mi\u0119dzy hot i cold observables, a tak\u017ce dog\u0142\u0119bnie pozna\u0107 mechanizmy asynchroniczno\u015bci w JavaScript. Ca\u0142kiem tego sporo jak na proste sumowanie dw\u00f3ch zmiennych.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Wi\u0119cej o RxJS dowiecie si\u0119 z:<\/strong><br><a href=\"https:\/\/benlesh.medium.com\/hot-vs-cold-observables-f8094ed53339\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd Hot vs Cold Observables<\/a><br><a href=\"https:\/\/stackblogger.com\/real-world-examples-of-some-common-observable-operators\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd Real World Examples of 5 Common Observable Operators<\/a><br><a href=\"https:\/\/medium.com\/volosoft\/whats-new-in-rxjs-7-a11cc564c6c0\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd What's new in RxJS 7<\/a><\/p>\n","innerContent":["\n<p><strong>Wi\u0119cej o RxJS dowiecie si\u0119 z:<\/strong><br><a href=\"https:\/\/benlesh.medium.com\/hot-vs-cold-observables-f8094ed53339\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd Hot vs Cold Observables<\/a><br><a href=\"https:\/\/stackblogger.com\/real-world-examples-of-some-common-observable-operators\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd Real World Examples of 5 Common Observable Operators<\/a><br><a href=\"https:\/\/medium.com\/volosoft\/whats-new-in-rxjs-7-a11cc564c6c0\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd What's new in RxJS 7<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jak przyznaj\u0105 tw\u00f3rcy Angulara (i ja zgadzam si\u0119 z nimi w 100%), RxJS \u015bwietnie sprawdza si\u0119 wsz\u0119dzie tam, gdzie musimy modelowa\u0107 wydarzenia w czasie. Je\u015bli chodzi o modelowanie stanu aplikacji, to istnieje sporo lepszych rozwi\u0105za\u0144 i Signals s\u0105 jednym z nich. Nie nale\u017cy spodziewa\u0107 si\u0119, \u017ce RxJS ca\u0142kowicie zniknie z naszych aplikacji. W nasze r\u0119ce oddane zostan\u0105 po prostu narz\u0119dzia, kt\u00f3re pozwoli nam wbija\u0107 gwo\u017adzie m\u0142otkiem i wkr\u0119ca\u0107 wkr\u0119ty \u015brubokr\u0119tem.<\/p>\n","innerContent":["\n<p>Jak przyznaj\u0105 tw\u00f3rcy Angulara (i ja zgadzam si\u0119 z nimi w 100%), RxJS \u015bwietnie sprawdza si\u0119 wsz\u0119dzie tam, gdzie musimy modelowa\u0107 wydarzenia w czasie. Je\u015bli chodzi o modelowanie stanu aplikacji, to istnieje sporo lepszych rozwi\u0105za\u0144 i Signals s\u0105 jednym z nich. Nie nale\u017cy spodziewa\u0107 si\u0119, \u017ce RxJS ca\u0142kowicie zniknie z naszych aplikacji. W nasze r\u0119ce oddane zostan\u0105 po prostu narz\u0119dzia, kt\u00f3re pozwoli nam wbija\u0107 gwo\u017adzie m\u0142otkiem i wkr\u0119ca\u0107 wkr\u0119ty \u015brubokr\u0119tem.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Wi\u0119cej o Signals w Angularze dowiecie si\u0119 z:<\/strong><br><a href=\"https:\/\/www.youtube.com\/watch?v=4FkFmn0LmLI\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcfa Angular is about to get its most IMPORTANT change in a long time...<\/a><br><a href=\"https:\/\/www.youtube.com\/watch?v=HstDoVQeP9g\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcfa SolidJS interviews Angular creators about Signals (5h!)<\/a><br><a href=\"https:\/\/medium.com\/herodevs\/angular-proposes-fine-gained-reactivity-with-signals-152a2d26fe2f\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd Angular Proposes Fine-Grained Reactivity With Signals<\/a><br><a href=\"https:\/\/dev.to\/this-is-angular\/i-changed-my-mind-angular-needs-a-reactive-primitive-n2g\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd I changed my mind. Angular needs a reactive primitive<\/a><br><a href=\"https:\/\/github.com\/angular\/angular\/discussions\/49090\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd [Watch This Space] Angular Reactivity with Signals<\/a><br><a href=\"https:\/\/angular-signals.netlify.app\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83c\udfae Angular Signals Demo<\/a><\/p>\n","innerContent":["\n<p><strong>Wi\u0119cej o Signals w Angularze dowiecie si\u0119 z:<\/strong><br><a href=\"https:\/\/www.youtube.com\/watch?v=4FkFmn0LmLI\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcfa Angular is about to get its most IMPORTANT change in a long time...<\/a><br><a href=\"https:\/\/www.youtube.com\/watch?v=HstDoVQeP9g\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcfa SolidJS interviews Angular creators about Signals (5h!)<\/a><br><a href=\"https:\/\/medium.com\/herodevs\/angular-proposes-fine-gained-reactivity-with-signals-152a2d26fe2f\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd Angular Proposes Fine-Grained Reactivity With Signals<\/a><br><a href=\"https:\/\/dev.to\/this-is-angular\/i-changed-my-mind-angular-needs-a-reactive-primitive-n2g\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd I changed my mind. Angular needs a reactive primitive<\/a><br><a href=\"https:\/\/github.com\/angular\/angular\/discussions\/49090\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83d\udcdd [Watch This Space] Angular Reactivity with Signals<\/a><br><a href=\"https:\/\/angular-signals.netlify.app\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\ud83c\udfae Angular Signals Demo<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/14855","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/comments?post=14855"}],"version-history":[{"count":21,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/14855\/revisions"}],"predecessor-version":[{"id":14886,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/14855\/revisions\/14886"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/14877"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=14855"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=14855"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=14855"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}