{"id":10358,"date":"2022-09-16T14:03:22","date_gmt":"2022-09-16T12:03:22","guid":{"rendered":"https:\/\/vived.io\/?p=10358"},"modified":"2022-09-19T13:16:22","modified_gmt":"2022-09-19T11:16:22","slug":"safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/","title":{"rendered":"Safari z wsparciem dla Web Push Notifications &#8211; Frontend Weekly vol. 105"},"content":{"rendered":"\n<h2 id=\"1-safari-16-0\" data-num=1>1. Safari 16.0<\/h2>\n\n\n\n<p>Poci\u0105gi releas\u00f3w (nie przekonacie mnie do zaprzestania nieudolnego t\u0142umaczenia angielskich zwrot\u00f3w) maj\u0105 w\u0142a\u015bciwie same zalety. Nowe funkcjonalno\u015bci dostarczane s\u0105 regularnie, a zmiany s\u0105 niewielkie i \u0142atwo si\u0119 do nich dostosowa\u0107. Niestety wraz z powolnym i stabilnym wzrostem znika ekscytacja dotycz\u0105ca nowo\u015bci. Wi\u0119kszo\u015b\u0107 zmian nabiera znaczenia dopiero kiedy spojrzymy na nie z perspektywy kilku releas\u00f3w. Mamy tu do czynienia z ewolucj\u0105, a nie rewolucj\u0105. <\/p>\n\n\n\n<p>Jednym z dobrych przyk\u0142ad\u00f3w tego, jak rzadkie du\u017ce releasy wzbudzaj\u0105 zainteresowanie, jest polityka releas\u00f3w Apple. W sieci bardzo rzadko czyta si\u0119 o nowo\u015bciach w kolejnych wersjach Windows czy Chrome, a artyku\u0142y o nowym iOS, macOS i Safari rozchodz\u0105 si\u0119 wr\u0119cz viralowo. R\u00f3\u017cnica polega na tym, \u017ce te pierwsze stosuj\u0105 poci\u0105g releas\u00f3w, a te drugie publikuj\u0105 du\u017ce zmiany raz do roku.<\/p>\n\n\n\n<p>Ko\u0144cz\u0105c m\u00f3j przyd\u0142ugawy wyw\u00f3d na temat releasowania aplikacji, w minionym tygodniu w r\u0119ce u\u017cytkownik\u00f3w trafi\u0142o wreszcie Safari 16. Mo\u017ce i nie znajdziecie tutaj zbyt wielu rewolucyjnych funkcjonalno\u015bci, ale za to do Internet Explorera naszych czas\u00f3w trafi\u0142o sporo funkcjonalno\u015bci, kt\u00f3re w innych przegl\u0105darkach znajdziecie ju\u017c od dawna. Zapnijcie pasy, bo wyruszamy na kr\u00f3tk\u0105 wycieczk\u0119 po zmianach w Safari 16.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"697\" height=\"500\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem1.jpg\" alt=\"\" class=\"wp-image-10329\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem1.jpg 697w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem1-300x215.jpg 300w\" sizes=\"auto, (max-width: 697px) 100vw, 697px\" \/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Web Push Notifications (na razie na macOS, ale wkr\u00f3tce r\u00f3wnie\u017c na iOS)<\/h3>\n\n\n\n<p>Wiecie, \u017ce to Apple wymy\u015bli\u0142o koncepcj\u0119 instalowanych aplikacji PWA? Niestety, gdzie\u015b po drodze firma zorientowa\u0142a si\u0119, \u017ce nad aplikacjami tego typu nie da si\u0119 sprawowa\u0107 kontroli (np. wymusza\u0107 p\u0142atno\u015bci przez Apple Pay) ani pobiera\u0107 od nich nale\u017cnego c\u0142a. Nigdy nie zosta\u0142o to potwierdzone oficjalnie, ale to prawdopodobnie w\u0142a\u015bnie z tego powodu przycisk instalacji PWA na iOS jest tak skrz\u0119tnie ukryty. R\u00f3wnie\u017c z tego powodu do Safari nigdy nie trafi\u0142y Web Push Notifications, czyli jeden z najwa\u017cniejszych wyr\u00f3\u017cnik\u00f3w aplikacji mobilnych. Apple jak to Apple, oficjalnie t\u0142umaczy\u0142o si\u0119 dobrem swoich u\u017cytkownik\u00f3w. W ko\u0144cu aplikacje w AppStore przechodz\u0105 skomplikowany proces akceptacji, a w internecie ka\u017cdy mo\u017ce opublikowa\u0107 s\u0142ab\u0105, albo co gorsza z\u0142o\u015bliw\u0105 aplikacj\u0119.<\/p>\n\n\n\n<p>Jak mo\u017cna domy\u015bli\u0107 si\u0119 z nag\u0142\u00f3wka, do Safari 16 trafi\u0142y w\u0142a\u015bnie Web Push Notifications. Co sk\u0142oni\u0142o firm\u0119 do zaimplementowania tej funkcjonalno\u015bci po prawie 7 latach od czasu kiedy po raz pierwszy pojawi\u0142y si\u0119 one u konkurencji? No c\u00f3\u017c, Apple ponownie milczy w tej sprawie, ale internet jak zwykle internet ma swoje zdanie na ten temat. Apple w ostatnich latach coraz wi\u0119kszy nacisk stawia na oferty us\u0142ugi, jak na przyk\u0142ad Apple Music, Apple TV, czy Apple Fitness. Je\u015bli zyski firmy maj\u0105 by\u0107 nastawione na us\u0142ugi, to nic nie stoi na przeszkodzie, aby troch\u0119 poluzowa\u0107 polityk\u0119 w ramach sklepu.<\/p>\n\n\n\n<p>Innym powodem mo\u017ce by\u0107 wdra\u017cany przez Uni\u0119 Europejsk\u0105 Digital Marketing Act, kt\u00f3rego celem jest wprowadzenie kontroli nad technologicznymi monopolistami. W jego ramach Apple mo\u017ce by\u0107 zmuszone na przyk\u0142ad do dodania portu USB C do swoich telefon\u00f3w, u\u0142atwienie u\u017cytkownikom dost\u0119pu do nie-domy\u015blnych aplikacji czy do wdro\u017cenia brakuj\u0105cych standard\u00f3w w ich oprogramowaniu. Co prawda ustawodawstwo to nie wesz\u0142o jeszcze oficjalnie w \u017cycie, ale by\u0107 mo\u017ce Apple postanowi\u0142 w tej kwestii zadzia\u0142a\u0107 troch\u0119 reaktywnie.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"676\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/image10-1.jpg\" alt=\"\" class=\"wp-image-10331\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/image10-1.jpg 500w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/image10-1-222x300.jpg 222w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Container Queries<\/h3>\n\n\n\n<p>O Container Queries w internecie napisane zosta\u0142o ju\u017c chyba wszystko. Od kiedy kilka lat temu do sieci trafi\u0142y pierwsze szkice API, wszyscy frontend deweloperzy zakochali si\u0119 po uszy i z niecierpliwo\u015bci\u0105 czekali, a\u017c trafi\u0105 one w ich r\u0119ce. Ten moment w\u0142a\u015bnie nadszed\u0142 bo zar\u00f3wno Chrome 105 jak i Safari 16 obs\u0142uguj\u0105 t\u0105 technologi\u0119. Niestety w Firefox wci\u0105\u017c nie wida\u0107 jej na horyzoncie (i kto tu teraz jest IE naszych czas\u00f3w), ale na szcz\u0119\u015bcie od jakiego\u015b czasu dost\u0119pny jest dzia\u0142aj\u0105cy przyzwoicie polyfill.<\/p>\n\n\n\n<p><span style=\"font-weight: 400;\">Czym s\u0105 Container Queries? Na pewno w swojej karierza chocia\u017c raz korzystali\u015bcie z Media Queries, kt\u00f3re pozwalaj\u0105 nam przygotowa\u0107 r\u00f3\u017cny zbi\u00f3r CSS\u00f3w w zale\u017cno\u015bci od wysoko\u015bci czy szeroko\u015bci ekranu. Container Queries to takie Media Queries, tylko, \u017ce umo\u017cliwiaj\u0105 one obserwowanie parametr\u00f3w dowolnego elementu HTML. Je\u015bli szukacie dobrego \u017ar\u00f3d\u0142a wprowadzaj\u0105cego w tajniki Container Queries, to ja gor\u0105co polecam <\/span><a href=\"https:\/\/ishadeed.com\/article\/say-hello-to-css-container-queries\/\"><span style=\"font-weight: 400;\">ten artyku\u0142<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"582\" height=\"429\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem3.jpg\" alt=\"\" class=\"wp-image-10333\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem3.jpg 582w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem3-300x221.jpg 300w\" sizes=\"auto, (max-width: 582px) 100vw, 582px\" \/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Web Inspector Extensions<\/h3>\n\n\n\n<p>Nie znam nikogo, kto na co dzie\u0144 do developmentu korzysta\u0142by z Safari. Pewnie to dlatego, jest to przegl\u0105darka na kt\u00f3rej najcz\u0119\u015bciej do\u015bwiadczy\u0107 mo\u017cna drobnych bug\u00f3w i glitchy. Safari 16 wprowadza szereg usprawnie\u0144, je\u015bli chodzi narz\u0119dzia do debugowania aplikacji, takich jak chocia\u017cby Flexbox inspector czy Screenshots timeline.<\/p>\n\n\n\n<p>Absolutna funkcjonalno\u015b\u0107 zab\u00f3jca (jak ju\u017c m\u00f3wi\u0142em, nie przekonacie mnie do rezygnacji z spolszcze\u0144), to natomiast wsparcie dla Web Inspector Extensions &#8211; API niezb\u0119dnego do dzia\u0142ania wtyczek od tw\u00f3rc\u00f3w framework\u00f3w i bibliotek. Oznacza to, \u017ce prawdopodobnie doczekamy si\u0119 w ko\u0144cu Angular DevTools czy React Developer Tools dla Safari.<\/p>\n\n\n\n<p>Osobi\u015bcie raczej nie zamierzam przerzuci\u0107 si\u0119 na co dzie\u0144 do Safari, a inspektor oferowany przez Chrome pozostaje dla mnie niezast\u0105piony. Natomiast dzi\u0119ki ma\u0142ym usprawnieniom w Safari 16, kr\u00f3tkie wycieczki do przegl\u0105darki od Apple na potrzeby test\u00f3w i naprawy b\u0142\u0119d\u00f3w, b\u0119d\u0105 troch\u0119 przyjemniejsze.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"508\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem4.jpg\" alt=\"\" class=\"wp-image-10335\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem4.jpg 500w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem4-295x300.jpg 295w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Passkeys<\/h3>\n\n\n\n<p>Passkeys to technologia, kt\u00f3ra mo\u017ce s\u0142u\u017cy\u0107 jako alternatywa dla hase\u0142, kt\u00f3ra pozwala logowa\u0107 si\u0119 na podstawie potwierdzenia to\u017csamo\u015bci dostarczonego przez nasze urz\u0105dzenie. Pod spodem ca\u0142o\u015b\u0107 przy rejestracji tworzy klucz kryptograficzny zapisywany na urz\u0105dzeniu, kt\u00f3ry potem wykorzystywany jest do autentykacji. Ca\u0142o\u015b\u0107 jest bardziej funkcjonalno\u015bci\u0105 macOS 16 i iOS 16, ale Safari 16 dosta\u0142o wszystkie niezb\u0119dne do obs\u0142ugi nowego mechanizmy API. Nie wiem, czy zamierzacie doda\u0107 nowy spos\u00f3b logowania do Waszych aplikacji, ale z perspektywy u\u017cytkownika wygl\u0105da to naprawd\u0119 ciekawie (dow\u00f3d poni\u017cej)<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"252\" height=\"424\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem5.gif\" alt=\"\" class=\"wp-image-10337\"\/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a:<\/h3>\n\n\n\n<p><a href=\"https:\/\/webkit.org\/blog\/13152\/webkit-features-in-safari-16-0\/\">https:\/\/webkit.org\/blog\/13152\/webkit-features-in-safari-16-0\/<\/a><\/p>\n\n\n\n<h2 id=\"2-memlab-wycieki-pamieci-nigdy-wiecej\" data-num=2>2. MemLab: Wycieki pami\u0119ci? &#8211; nigdy wi\u0119cej!<\/h2>\n\n\n\n<p>Zanim przejdziemy do sedna, chcia\u0142bym podzieli\u0107 si\u0119 z Wami ma\u0142\u0105 \u0142amig\u0142\u00f3wk\u0105. Czy poni\u017cszy kod zawiera wyciek pami\u0119ci?<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">var obj = {};\nconsole.log(obj);\nobj = null;<\/code><\/pre>\n\n\n\n<p>Jak to cz\u0119sto w programowaniu bywa, poprawna odpowied\u017a brzmi &#8211; to zale\u017cy. Okazuje si\u0119, \u017ce niekt\u00f3re \u015brodowiska (np. Chrome), nigdy nie zwolni\u0105 z pami\u0119ci obiekt\u00f3w, kt\u00f3re zosta\u0142y wy\u015bwietlone w konsoli. Na pierwszy rzut oka mo\u017ce wydawa\u0107 si\u0119 to podejrzane, ale z drugiej strony niesamowicie u\u0142atwia debugowanie. Gdyby obiekt wy\u015bwietlony w konsoli by\u0142 czyszczony z pami\u0119ci nie mogliby\u015bmy \u0142atwo si\u0119 do niego dobra\u0107 i manipulowa\u0107 nim wed\u0142ug w\u0142asnego widzimisi\u0119.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"611\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem6.jpg\" alt=\"\" class=\"wp-image-10339\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem6.jpg 500w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem6-245x300.jpg 245w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure><\/div>\n\n\n<p>MemLab to narz\u0119dzie kt\u00f3rego Facebook u\u017cywa do wykrywania i monitorowania wyciek\u00f3w pami\u0119ci w aplikacjach. Ich monitorowanie jest o tyle wa\u017cne, \u017ce zazwyczaj drobne wycieki nie maj\u0105 wp\u0142ywu na wydajno\u015b\u0107 aplikacji i pozostaj\u0105 niezauwa\u017cone. Kiedy jednak korzystamy z aplikacji d\u0142u\u017cej, drobne wycieki kumuluj\u0105 si\u0119, doprowadzaj\u0105c do powolnego obni\u017cenia wydajno\u015bci i ostecznie do OutOfMemoryException. Problem polega na tym, \u017ce podczas rozwijania aplikacji bardzo rzadko symulujemy tak d\u0142ugie sesje. Nawet je\u015bli takie sesje przytrafi\u0105 nam si\u0119 od czasu do czasu, to zazwyczaj maj\u0105 one miejsce na wydajnym komputerze i bardzo \u0142atwo jest nam ignorowa\u0107 drobne spowolnienia.<\/p>\n\n\n\n<p>MemLab dzia\u0142a w stosunkowo prosty spos\u00f3b. Przy pomocy Puppeteera uruchamia on przegl\u0105dark\u0119, nawiguje na stron\u0119 g\u0142\u00f3wn\u0105 aplikacji oraz wykonuje snapshot stosu JavaScript. Nast\u0119pnie wykonywana jest nawigacja na testowan\u0105 podstron\u0119 i po raz kolejny zapisywany jest snapshot stosu JavaScript. Ostatni krok to powr\u00f3t na stron\u0119 g\u0142\u00f3wn\u0105 oraz wykonanie jeszcze jednego snapshotu. Na podstawie por\u00f3wnania trzech snapshot\u00f3w stosu JavaScript, MemLab jest w stanie wykry\u0107 potencjalne wycieki pami\u0119ci.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"592\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem7.gif\" alt=\"\" class=\"wp-image-10341\"\/><\/figure><\/div>\n\n\n<p>Poza wykrywaniem wyciek\u00f3w pami\u0119ci, MemLab oferuje te\u017c swego rodzaju debugger stosu JavaScript. Pozwala on przekszta\u0142ci\u0107 stos obiekt\u00f3w do postaci grafu zale\u017cno\u015bci. Dzi\u0119ki temu znalezienie obiektu, kt\u00f3ry przechowuje nadmiarowe referencje staje si\u0119 du\u017co \u0142atwiejsze.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"602\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem8-1024x602.jpg\" alt=\"\" class=\"wp-image-10343\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem8-1024x602.jpg 1024w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem8-300x176.jpg 300w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem8-768x452.jpg 768w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem8-1536x903.jpg 1536w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem8.jpg 1724w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n<p>W minionym tygodniu Facebook upubliczni\u0142 MemLab jako narz\u0119dzie OpenSource. Nie wiem jak Wy, ale ja ju\u017c nie mog\u0119 doczeka\u0107 si\u0119, a\u017c znajd\u0119 chwil\u0119, \u017ceby pobawi\u0107 si\u0119 nim osobi\u015bcie. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a:<\/h3>\n\n\n\n<p><a href=\"https:\/\/engineering.fb.com\/2022\/09\/12\/open-source\/memlab\/\">https:\/\/engineering.fb.com\/2022\/09\/12\/open-source\/memlab\/<\/a><\/p>\n\n\n\n<h2 id=\"3-react-router-6-4\" data-num=3>3. React Router 6.4<\/h2>\n\n\n\n<p>React Router jest de facto standardow\u0105 bibliotek\u0105 do routingu w React. Prawie rok temu doczeka\u0142 si\u0119 on 6 wersji i tradycyjnie dla ju\u017c tej biblioteki, pe\u0142ny by\u0142 breaking changes. Trzeba jednak przyzna\u0107, \u017ce wprowadzi\u0142 te\u017c kilka interesuj\u0105cych nowo\u015bci, na zawsze zako\u0144czy\u0142 \u017cywot alternatywnego `reach-router` i postawi\u0142 podwaliny pod budow\u0119 Remixa (w sporym uproszczeniu alternatywy dla Next.js).\n<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"717\" height=\"348\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem9.jpg\" alt=\"\" class=\"wp-image-10345\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem9.jpg 717w, https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem9-300x146.jpg 300w\" sizes=\"auto, (max-width: 717px) 100vw, 717px\" \/><\/figure><\/div>\n\n\n<p>React Router 6.4 to pierwsze od tego czasu werska biblioteki, kt\u00f3re wprowadza interesuj\u0105ce nowo\u015bci. Zacznijmy od zgrabnego API, do obs\u0142ugi asynchronicznego \u0142adowania danych. Sk\u0142ada si\u0119 ono z propsa `loader` dodanego do komponentu `<route><\/route>` oraz hooka `useLoaderData()`.  Dane potrzebne do za\u0142adowania wszystkich dopasowanych \u015bcie\u017cek pobierane s\u0105 r\u00f3wnolegle, a biblioteka dba o to, \u017ceby dane nie by\u0142y pobierane kilkukrotnie. Ponadto react-router pozwala teraz na  wykorzystanie Suspense z React 18, aby zoptymalizowa\u0107 proces renderowania.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-\">&lt;Route\n  path=&quot;\/&quot;\n  loader={async ({ request }) =&gt; {\n    const res = await fetch(&quot;\/api\/user.json&quot;, {\n      signal: request.signal,\n    });\n    const user = await res.json();\n    return user;\n  }}\n  element={&lt;Root \/&gt;}\n&gt;\n  &lt;Route\n    path=&quot;:teamId&quot;\n    loader={({ params }) =&gt; {\n      return fetch(`\/api\/teams\/${params.teamId}`);\n    }}\n    element={&lt;Team \/&gt;}\n  &gt;\n&lt;\/Route&gt;\n\nfunction Root() {\n  const user = useLoaderData();\n  \/\/ data from &lt;Route path=&quot;\/&quot;&gt;\n}\n\nfunction Team() {\n  const team = useLoaderData();\n  \/\/ data from &lt;Route path=&quot;:teamId&quot;&gt;\n}<\/code><\/pre>\n\n\n\n<p>Nieodzown\u0105 cz\u0119\u015bci\u0105 asynchronicznego \u0142adowania danych jest obs\u0142uga b\u0142\u0119d\u00f3w. Tej te\u017c nie zabrak\u0142o w nowym react-router.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-\">&lt;Route\n  path=&quot;\/&quot;\n  loader={() =&gt; {\n    somethingThatThrowsAnError();\n  }}\n  \/\/ this will not be rendered\n  element={&lt;HappyPath \/&gt;}\n  \/\/ but this will instead\n  errorElement={&lt;ErrorBoundary \/&gt;}\n\/&gt;<\/code><\/pre>\n\n\n\n<p>Ostatnia spora nowo\u015b\u0107 to obs\u0142uga formularzy. Jak twierdz\u0105 tw\u00f3rcy biblioteki, mutacja danych przez formularze HTML powinna by\u0107 wydarzeniem routingu. Ci\u0119\u017cko si\u0119 z nimi nie zgodzi\u0107 &#8211; natywne formularze zbudowane zosta\u0142y zbudowane tak, aby wraz z ich zaakceptowaniem wysy\u0142a\u0107 zapytanie do serwera, kt\u00f3re przenosi u\u017cytkownika na now\u0105 stron\u0119. Standardowe obecnie rozwi\u0105zania z wywo\u0142ywaniem `event.preventDefault()`, s\u0105 wi\u0119c sporym hakiem, a nawigacj\u0105 na now\u0105 stron\u0119 by\u0142oby rozwi\u0105zaniem zdecydowanie bli\u017cszym oryginalnej architektury.<\/p>\n\n\n\n<p>Od teraz react-router b\u0119dzie w stanie dopasowa\u0107 zapytania typu POST, PUT i PATCH, do zdefiniowanych \u015bcie\u017cek. Nast\u0119pnie wywo\u0142ana zostanie funkcja przekazana do \u015bcie\u017cki jako props action.\n<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-\">\u200b\u200b&lt;Route\n  path=&quot;\/song\/:songId\/edit&quot;\n  element={&lt;EditSong \/&gt;}\n  action={async ({ params, request }) =&gt; {\n    let formData = await request.formData();\n    return fakeUpdateSong(params.songId, formData);\n  }}\n\/&gt;\n\nfunction EditSong() {\n  return (&lt;Form method=&quot;post&quot; action=&quot;\/songs\/123\/edit&quot; \/&gt;)\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a:<\/h3>\n\n\n\n<p><a href=\"https:\/\/remix.run\/blog\/react-router-v6.4\">https:\/\/remix.run\/blog\/react-router-v6.4<\/a><\/p>\n\n\n\n<h2 id=\"bonus-1-adobe-kupuje-figme\" data-num=4>Bonus #1: Adobe kupuje Figm\u0119!<\/h2>\n\n\n\n<p>Na pewno kojarzycie Figm\u0119, czyli narz\u0119dzie do tworzenia designu aplikacji. Na przestrzeni ostatnich kilku lat sta\u0142o si\u0119 ono w\u0142a\u015bciwie rynkowym standardem. By\u0142o to troch\u0119 nie na r\u0119k\u0119 Adobe, kt\u00f3re do tej pory w\u0142a\u015bciwie posiada\u0142o monopol w tej kategorii. Z tego wzgl\u0119du postanowili oni zakupi\u0107 m\u0142odego potentata.<\/p>\n\n\n\n<p>Z notatki informuj\u0105cej o przej\u0119ciu dowiadujemy si\u0119, \u017ce tak naprawd\u0119 z perspektywy klient\u00f3w niewiele si\u0119 zmieni. Z perspektywy firmy pojawia si\u0119 natomiast szansa na przyspieszenie rozwoju i skorzystanie z wiedzy Adobe na temat video, 3d czy sztucznej inteligencji, <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a:<\/h3>\n\n\n\n<p><a href=\"https:\/\/www.figma.com\/blog\/a-new-collaboration-with-adobe\/\">https:\/\/www.figma.com\/blog\/a-new-collaboration-with-adobe\/<\/a><\/p>\n\n\n\n<h2 id=\"bonus-2-ng-cong-2022-angular-team-keynote\" data-num=5>Bonus #2: ng-cong 2022 Angular Team Keynote<\/h2>\n\n\n\n<p>Pocz\u0105tkiem wrze\u015bnia w Salt Lake City mia\u0142a miejsce najwi\u0119ksza i najwa\u017cniejsza Angularowa konferencja &#8211; ng-conf 2022. Niestety, nie wszystkie prezentacje s\u0105 ju\u017c dost\u0119pne na YouTube. Dost\u0119pny jest ju\u017c natomiast Angular Team Keynote, kt\u00f3ry jest \u015bwietnym miejscem je\u015bli chcecie przypomnie\u0107 sobie co w ostatnich miesi\u0105cach zmieni\u0142o si\u0119 w Angularze i jakich zmian mo\u017cemy oczekiwa\u0107 w kilku kolejnych.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"embed-responsive embed-responsive-16by9\"><iframe loading=\"lazy\" title=\"Angular Team Keynote | Minko Gechev, Sarah Drasner, Madleina Scheidegger | ng-conf 2022\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/CABHcf1gCbg?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Zapowiedziane pocz\u0105tkiem lata nowo\u015bci w Safari wreszcie trafiaj\u0105 w r\u0119ce pierwszych u\u017cytkownik\u00f3w. W\u015br\u00f3d nich takie pere\u0142ki jak wsparcie dla Web Push Notifications, Container Queries czy Passkeys.<\/p>\n","protected":false},"author":12,"featured_media":10353,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[273],"tags":[],"class_list":["post-10358","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-frontend-pl"],"acf":{"estimated_reading_time":"7","feature_image_blog":{"ID":10351,"id":10351,"title":"frontend-105-blank","filename":"frontend-105-blank.jpg","filesize":317250,"url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-blank.jpg","link":"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/frontend-105-blank-2\/","alt":"","author":"15","description":"","caption":"","name":"frontend-105-blank-2","status":"inherit","uploaded_to":10358,"date":"2022-09-15 16:00:39","modified":"2022-09-15 16:06:16","menu_order":0,"mime_type":"image\/jpeg","type":"image","subtype":"jpeg","icon":"https:\/\/vived.io\/wp-includes\/images\/media\/default.png","width":1999,"height":1113,"sizes":{"thumbnail":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-blank-150x150.jpg","thumbnail-width":150,"thumbnail-height":150,"medium":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-blank-300x167.jpg","medium-width":300,"medium-height":167,"medium_large":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-blank-768x428.jpg","medium_large-width":768,"medium_large-height":428,"large":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-blank-1024x570.jpg","large-width":1024,"large-height":570,"1536x1536":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-blank-1536x855.jpg","1536x1536-width":1536,"1536x1536-height":855,"2048x2048":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-blank.jpg","2048x2048-width":1999,"2048x2048-height":1113,"gform-image-choice-sm":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-blank.jpg","gform-image-choice-sm-width":300,"gform-image-choice-sm-height":167,"gform-image-choice-md":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-blank.jpg","gform-image-choice-md-width":400,"gform-image-choice-md-height":223,"gform-image-choice-lg":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-blank.jpg","gform-image-choice-lg-width":600,"gform-image-choice-lg-height":334}},"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-pl.png","feature_image_visible":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Safari z wsparciem dla Web Push Notifications - Frontend Weekly vol. 105 - 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\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Safari z wsparciem dla Web Push Notifications - Frontend Weekly vol. 105 - Vived\" \/>\n<meta property=\"og:description\" content=\"Zapowiedziane pocz\u0105tkiem lata nowo\u015bci w Safari wreszcie trafiaj\u0105 w r\u0119ce pierwszych u\u017cytkownik\u00f3w. W\u015br\u00f3d nich takie pere\u0142ki jak wsparcie dla Web Push Notifications, Container Queries czy Passkeys.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2022-09-16T12:03:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-09-19T11:16:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-pl.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\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/\"},\"author\":{\"name\":\"Tomasz Borowicz\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb\"},\"headline\":\"Safari z wsparciem dla Web Push Notifications &#8211; Frontend Weekly vol. 105\",\"datePublished\":\"2022-09-16T12:03:22+00:00\",\"dateModified\":\"2022-09-19T11:16:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/\"},\"wordCount\":1867,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-pl.png\",\"articleSection\":[\"Frontend\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/\",\"url\":\"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/\",\"name\":\"Safari z wsparciem dla Web Push Notifications - Frontend Weekly vol. 105 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-pl.png\",\"datePublished\":\"2022-09-16T12:03:22+00:00\",\"dateModified\":\"2022-09-19T11:16:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-pl.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-pl.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Safari z wsparciem dla Web Push Notifications &#8211; Frontend Weekly vol. 105\"}]},{\"@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":"Safari z wsparciem dla Web Push Notifications - Frontend Weekly vol. 105 - 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\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/","og_locale":"pl_PL","og_type":"article","og_title":"Safari z wsparciem dla Web Push Notifications - Frontend Weekly vol. 105 - Vived","og_description":"Zapowiedziane pocz\u0105tkiem lata nowo\u015bci w Safari wreszcie trafiaj\u0105 w r\u0119ce pierwszych u\u017cytkownik\u00f3w. W\u015br\u00f3d nich takie pere\u0142ki jak wsparcie dla Web Push Notifications, Container Queries czy Passkeys.","og_url":"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/","og_site_name":"Vived","article_published_time":"2022-09-16T12:03:22+00:00","article_modified_time":"2022-09-19T11:16:22+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-pl.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\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/"},"author":{"name":"Tomasz Borowicz","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb"},"headline":"Safari z wsparciem dla Web Push Notifications &#8211; Frontend Weekly vol. 105","datePublished":"2022-09-16T12:03:22+00:00","dateModified":"2022-09-19T11:16:22+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/"},"wordCount":1867,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-pl.png","articleSection":["Frontend"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/","url":"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/","name":"Safari z wsparciem dla Web Push Notifications - Frontend Weekly vol. 105 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-pl.png","datePublished":"2022-09-16T12:03:22+00:00","dateModified":"2022-09-19T11:16:22+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-pl.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend-105-pl.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/safari-z-wsparciem-dla-web-push-notifications-frontend-weekly-vol-105\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Safari z wsparciem dla Web Push Notifications &#8211; Frontend Weekly vol. 105"}]},{"@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. Safari 16.0<\/h2>\n","innerContent":["\n<h2>1. Safari 16.0<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Poci\u0105gi releas\u00f3w (nie przekonacie mnie do zaprzestania nieudolnego t\u0142umaczenia angielskich zwrot\u00f3w) maj\u0105 w\u0142a\u015bciwie same zalety. Nowe funkcjonalno\u015bci dostarczane s\u0105 regularnie, a zmiany s\u0105 niewielkie i \u0142atwo si\u0119 do nich dostosowa\u0107. Niestety wraz z powolnym i stabilnym wzrostem znika ekscytacja dotycz\u0105ca nowo\u015bci. Wi\u0119kszo\u015b\u0107 zmian nabiera znaczenia dopiero kiedy spojrzymy na nie z perspektywy kilku releas\u00f3w. Mamy tu do czynienia z ewolucj\u0105, a nie rewolucj\u0105. <\/p>\n","innerContent":["\n<p>Poci\u0105gi releas\u00f3w (nie przekonacie mnie do zaprzestania nieudolnego t\u0142umaczenia angielskich zwrot\u00f3w) maj\u0105 w\u0142a\u015bciwie same zalety. Nowe funkcjonalno\u015bci dostarczane s\u0105 regularnie, a zmiany s\u0105 niewielkie i \u0142atwo si\u0119 do nich dostosowa\u0107. Niestety wraz z powolnym i stabilnym wzrostem znika ekscytacja dotycz\u0105ca nowo\u015bci. Wi\u0119kszo\u015b\u0107 zmian nabiera znaczenia dopiero kiedy spojrzymy na nie z perspektywy kilku releas\u00f3w. Mamy tu do czynienia z ewolucj\u0105, a nie rewolucj\u0105. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jednym z dobrych przyk\u0142ad\u00f3w tego, jak rzadkie du\u017ce releasy wzbudzaj\u0105 zainteresowanie, jest polityka releas\u00f3w Apple. W sieci bardzo rzadko czyta si\u0119 o nowo\u015bciach w kolejnych wersjach Windows czy Chrome, a artyku\u0142y o nowym iOS, macOS i Safari rozchodz\u0105 si\u0119 wr\u0119cz viralowo. R\u00f3\u017cnica polega na tym, \u017ce te pierwsze stosuj\u0105 poci\u0105g releas\u00f3w, a te drugie publikuj\u0105 du\u017ce zmiany raz do roku.<\/p>\n","innerContent":["\n<p>Jednym z dobrych przyk\u0142ad\u00f3w tego, jak rzadkie du\u017ce releasy wzbudzaj\u0105 zainteresowanie, jest polityka releas\u00f3w Apple. W sieci bardzo rzadko czyta si\u0119 o nowo\u015bciach w kolejnych wersjach Windows czy Chrome, a artyku\u0142y o nowym iOS, macOS i Safari rozchodz\u0105 si\u0119 wr\u0119cz viralowo. R\u00f3\u017cnica polega na tym, \u017ce te pierwsze stosuj\u0105 poci\u0105g releas\u00f3w, a te drugie publikuj\u0105 du\u017ce zmiany raz do roku.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ko\u0144cz\u0105c m\u00f3j przyd\u0142ugawy wyw\u00f3d na temat releasowania aplikacji, w minionym tygodniu w r\u0119ce u\u017cytkownik\u00f3w trafi\u0142o wreszcie Safari 16. Mo\u017ce i nie znajdziecie tutaj zbyt wielu rewolucyjnych funkcjonalno\u015bci, ale za to do Internet Explorera naszych czas\u00f3w trafi\u0142o sporo funkcjonalno\u015bci, kt\u00f3re w innych przegl\u0105darkach znajdziecie ju\u017c od dawna. Zapnijcie pasy, bo wyruszamy na kr\u00f3tk\u0105 wycieczk\u0119 po zmianach w Safari 16.<\/p>\n","innerContent":["\n<p>Ko\u0144cz\u0105c m\u00f3j przyd\u0142ugawy wyw\u00f3d na temat releasowania aplikacji, w minionym tygodniu w r\u0119ce u\u017cytkownik\u00f3w trafi\u0142o wreszcie Safari 16. Mo\u017ce i nie znajdziecie tutaj zbyt wielu rewolucyjnych funkcjonalno\u015bci, ale za to do Internet Explorera naszych czas\u00f3w trafi\u0142o sporo funkcjonalno\u015bci, kt\u00f3re w innych przegl\u0105darkach znajdziecie ju\u017c od dawna. Zapnijcie pasy, bo wyruszamy na kr\u00f3tk\u0105 wycieczk\u0119 po zmianach w Safari 16.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":10329,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem1.jpg\" alt=\"\" class=\"wp-image-10329\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem1.jpg\" alt=\"\" class=\"wp-image-10329\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Web Push Notifications (na razie na macOS, ale wkr\u00f3tce r\u00f3wnie\u017c na iOS)<\/h3>\n","innerContent":["\n<h3>Web Push Notifications (na razie na macOS, ale wkr\u00f3tce r\u00f3wnie\u017c na iOS)<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wiecie, \u017ce to Apple wymy\u015bli\u0142o koncepcj\u0119 instalowanych aplikacji PWA? Niestety, gdzie\u015b po drodze firma zorientowa\u0142a si\u0119, \u017ce nad aplikacjami tego typu nie da si\u0119 sprawowa\u0107 kontroli (np. wymusza\u0107 p\u0142atno\u015bci przez Apple Pay) ani pobiera\u0107 od nich nale\u017cnego c\u0142a. Nigdy nie zosta\u0142o to potwierdzone oficjalnie, ale to prawdopodobnie w\u0142a\u015bnie z tego powodu przycisk instalacji PWA na iOS jest tak skrz\u0119tnie ukryty. R\u00f3wnie\u017c z tego powodu do Safari nigdy nie trafi\u0142y Web Push Notifications, czyli jeden z najwa\u017cniejszych wyr\u00f3\u017cnik\u00f3w aplikacji mobilnych. Apple jak to Apple, oficjalnie t\u0142umaczy\u0142o si\u0119 dobrem swoich u\u017cytkownik\u00f3w. W ko\u0144cu aplikacje w AppStore przechodz\u0105 skomplikowany proces akceptacji, a w internecie ka\u017cdy mo\u017ce opublikowa\u0107 s\u0142ab\u0105, albo co gorsza z\u0142o\u015bliw\u0105 aplikacj\u0119.<\/p>\n","innerContent":["\n<p>Wiecie, \u017ce to Apple wymy\u015bli\u0142o koncepcj\u0119 instalowanych aplikacji PWA? Niestety, gdzie\u015b po drodze firma zorientowa\u0142a si\u0119, \u017ce nad aplikacjami tego typu nie da si\u0119 sprawowa\u0107 kontroli (np. wymusza\u0107 p\u0142atno\u015bci przez Apple Pay) ani pobiera\u0107 od nich nale\u017cnego c\u0142a. Nigdy nie zosta\u0142o to potwierdzone oficjalnie, ale to prawdopodobnie w\u0142a\u015bnie z tego powodu przycisk instalacji PWA na iOS jest tak skrz\u0119tnie ukryty. R\u00f3wnie\u017c z tego powodu do Safari nigdy nie trafi\u0142y Web Push Notifications, czyli jeden z najwa\u017cniejszych wyr\u00f3\u017cnik\u00f3w aplikacji mobilnych. Apple jak to Apple, oficjalnie t\u0142umaczy\u0142o si\u0119 dobrem swoich u\u017cytkownik\u00f3w. W ko\u0144cu aplikacje w AppStore przechodz\u0105 skomplikowany proces akceptacji, a w internecie ka\u017cdy mo\u017ce opublikowa\u0107 s\u0142ab\u0105, albo co gorsza z\u0142o\u015bliw\u0105 aplikacj\u0119.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jak mo\u017cna domy\u015bli\u0107 si\u0119 z nag\u0142\u00f3wka, do Safari 16 trafi\u0142y w\u0142a\u015bnie Web Push Notifications. Co sk\u0142oni\u0142o firm\u0119 do zaimplementowania tej funkcjonalno\u015bci po prawie 7 latach od czasu kiedy po raz pierwszy pojawi\u0142y si\u0119 one u konkurencji? No c\u00f3\u017c, Apple ponownie milczy w tej sprawie, ale internet jak zwykle internet ma swoje zdanie na ten temat. Apple w ostatnich latach coraz wi\u0119kszy nacisk stawia na oferty us\u0142ugi, jak na przyk\u0142ad Apple Music, Apple TV, czy Apple Fitness. Je\u015bli zyski firmy maj\u0105 by\u0107 nastawione na us\u0142ugi, to nic nie stoi na przeszkodzie, aby troch\u0119 poluzowa\u0107 polityk\u0119 w ramach sklepu.<\/p>\n","innerContent":["\n<p>Jak mo\u017cna domy\u015bli\u0107 si\u0119 z nag\u0142\u00f3wka, do Safari 16 trafi\u0142y w\u0142a\u015bnie Web Push Notifications. Co sk\u0142oni\u0142o firm\u0119 do zaimplementowania tej funkcjonalno\u015bci po prawie 7 latach od czasu kiedy po raz pierwszy pojawi\u0142y si\u0119 one u konkurencji? No c\u00f3\u017c, Apple ponownie milczy w tej sprawie, ale internet jak zwykle internet ma swoje zdanie na ten temat. Apple w ostatnich latach coraz wi\u0119kszy nacisk stawia na oferty us\u0142ugi, jak na przyk\u0142ad Apple Music, Apple TV, czy Apple Fitness. Je\u015bli zyski firmy maj\u0105 by\u0107 nastawione na us\u0142ugi, to nic nie stoi na przeszkodzie, aby troch\u0119 poluzowa\u0107 polityk\u0119 w ramach sklepu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Innym powodem mo\u017ce by\u0107 wdra\u017cany przez Uni\u0119 Europejsk\u0105 Digital Marketing Act, kt\u00f3rego celem jest wprowadzenie kontroli nad technologicznymi monopolistami. W jego ramach Apple mo\u017ce by\u0107 zmuszone na przyk\u0142ad do dodania portu USB C do swoich telefon\u00f3w, u\u0142atwienie u\u017cytkownikom dost\u0119pu do nie-domy\u015blnych aplikacji czy do wdro\u017cenia brakuj\u0105cych standard\u00f3w w ich oprogramowaniu. Co prawda ustawodawstwo to nie wesz\u0142o jeszcze oficjalnie w \u017cycie, ale by\u0107 mo\u017ce Apple postanowi\u0142 w tej kwestii zadzia\u0142a\u0107 troch\u0119 reaktywnie.<\/p>\n","innerContent":["\n<p>Innym powodem mo\u017ce by\u0107 wdra\u017cany przez Uni\u0119 Europejsk\u0105 Digital Marketing Act, kt\u00f3rego celem jest wprowadzenie kontroli nad technologicznymi monopolistami. W jego ramach Apple mo\u017ce by\u0107 zmuszone na przyk\u0142ad do dodania portu USB C do swoich telefon\u00f3w, u\u0142atwienie u\u017cytkownikom dost\u0119pu do nie-domy\u015blnych aplikacji czy do wdro\u017cenia brakuj\u0105cych standard\u00f3w w ich oprogramowaniu. Co prawda ustawodawstwo to nie wesz\u0142o jeszcze oficjalnie w \u017cycie, ale by\u0107 mo\u017ce Apple postanowi\u0142 w tej kwestii zadzia\u0142a\u0107 troch\u0119 reaktywnie.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":10331,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/image10-1.jpg\" alt=\"\" class=\"wp-image-10331\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/image10-1.jpg\" alt=\"\" class=\"wp-image-10331\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Container Queries<\/h3>\n","innerContent":["\n<h3>Container Queries<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>O Container Queries w internecie napisane zosta\u0142o ju\u017c chyba wszystko. Od kiedy kilka lat temu do sieci trafi\u0142y pierwsze szkice API, wszyscy frontend deweloperzy zakochali si\u0119 po uszy i z niecierpliwo\u015bci\u0105 czekali, a\u017c trafi\u0105 one w ich r\u0119ce. Ten moment w\u0142a\u015bnie nadszed\u0142 bo zar\u00f3wno Chrome 105 jak i Safari 16 obs\u0142uguj\u0105 t\u0105 technologi\u0119. Niestety w Firefox wci\u0105\u017c nie wida\u0107 jej na horyzoncie (i kto tu teraz jest IE naszych czas\u00f3w), ale na szcz\u0119\u015bcie od jakiego\u015b czasu dost\u0119pny jest dzia\u0142aj\u0105cy przyzwoicie polyfill.<\/p>\n","innerContent":["\n<p>O Container Queries w internecie napisane zosta\u0142o ju\u017c chyba wszystko. Od kiedy kilka lat temu do sieci trafi\u0142y pierwsze szkice API, wszyscy frontend deweloperzy zakochali si\u0119 po uszy i z niecierpliwo\u015bci\u0105 czekali, a\u017c trafi\u0105 one w ich r\u0119ce. Ten moment w\u0142a\u015bnie nadszed\u0142 bo zar\u00f3wno Chrome 105 jak i Safari 16 obs\u0142uguj\u0105 t\u0105 technologi\u0119. Niestety w Firefox wci\u0105\u017c nie wida\u0107 jej na horyzoncie (i kto tu teraz jest IE naszych czas\u00f3w), ale na szcz\u0119\u015bcie od jakiego\u015b czasu dost\u0119pny jest dzia\u0142aj\u0105cy przyzwoicie polyfill.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><span style=\"font-weight: 400;\">Czym s\u0105 Container Queries? Na pewno w swojej karierza chocia\u017c raz korzystali\u015bcie z Media Queries, kt\u00f3re pozwalaj\u0105 nam przygotowa\u0107 r\u00f3\u017cny zbi\u00f3r CSS\u00f3w w zale\u017cno\u015bci od wysoko\u015bci czy szeroko\u015bci ekranu. Container Queries to takie Media Queries, tylko, \u017ce umo\u017cliwiaj\u0105 one obserwowanie parametr\u00f3w dowolnego elementu HTML. Je\u015bli szukacie dobrego \u017ar\u00f3d\u0142a wprowadzaj\u0105cego w tajniki Container Queries, to ja gor\u0105co polecam <\/span><a href=\"https:\/\/ishadeed.com\/article\/say-hello-to-css-container-queries\/\"><span style=\"font-weight: 400;\">ten artyku\u0142<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n","innerContent":["\n<p><span style=\"font-weight: 400;\">Czym s\u0105 Container Queries? Na pewno w swojej karierza chocia\u017c raz korzystali\u015bcie z Media Queries, kt\u00f3re pozwalaj\u0105 nam przygotowa\u0107 r\u00f3\u017cny zbi\u00f3r CSS\u00f3w w zale\u017cno\u015bci od wysoko\u015bci czy szeroko\u015bci ekranu. Container Queries to takie Media Queries, tylko, \u017ce umo\u017cliwiaj\u0105 one obserwowanie parametr\u00f3w dowolnego elementu HTML. Je\u015bli szukacie dobrego \u017ar\u00f3d\u0142a wprowadzaj\u0105cego w tajniki Container Queries, to ja gor\u0105co polecam <\/span><a href=\"https:\/\/ishadeed.com\/article\/say-hello-to-css-container-queries\/\"><span style=\"font-weight: 400;\">ten artyku\u0142<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":10333,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem3.jpg\" alt=\"\" class=\"wp-image-10333\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem3.jpg\" alt=\"\" class=\"wp-image-10333\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Web Inspector Extensions<\/h3>\n","innerContent":["\n<h3>Web Inspector Extensions<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nie znam nikogo, kto na co dzie\u0144 do developmentu korzysta\u0142by z Safari. Pewnie to dlatego, jest to przegl\u0105darka na kt\u00f3rej najcz\u0119\u015bciej do\u015bwiadczy\u0107 mo\u017cna drobnych bug\u00f3w i glitchy. Safari 16 wprowadza szereg usprawnie\u0144, je\u015bli chodzi narz\u0119dzia do debugowania aplikacji, takich jak chocia\u017cby Flexbox inspector czy Screenshots timeline.<\/p>\n","innerContent":["\n<p>Nie znam nikogo, kto na co dzie\u0144 do developmentu korzysta\u0142by z Safari. Pewnie to dlatego, jest to przegl\u0105darka na kt\u00f3rej najcz\u0119\u015bciej do\u015bwiadczy\u0107 mo\u017cna drobnych bug\u00f3w i glitchy. Safari 16 wprowadza szereg usprawnie\u0144, je\u015bli chodzi narz\u0119dzia do debugowania aplikacji, takich jak chocia\u017cby Flexbox inspector czy Screenshots timeline.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Absolutna funkcjonalno\u015b\u0107 zab\u00f3jca (jak ju\u017c m\u00f3wi\u0142em, nie przekonacie mnie do rezygnacji z spolszcze\u0144), to natomiast wsparcie dla Web Inspector Extensions - API niezb\u0119dnego do dzia\u0142ania wtyczek od tw\u00f3rc\u00f3w framework\u00f3w i bibliotek. Oznacza to, \u017ce prawdopodobnie doczekamy si\u0119 w ko\u0144cu Angular DevTools czy React Developer Tools dla Safari.<\/p>\n","innerContent":["\n<p>Absolutna funkcjonalno\u015b\u0107 zab\u00f3jca (jak ju\u017c m\u00f3wi\u0142em, nie przekonacie mnie do rezygnacji z spolszcze\u0144), to natomiast wsparcie dla Web Inspector Extensions - API niezb\u0119dnego do dzia\u0142ania wtyczek od tw\u00f3rc\u00f3w framework\u00f3w i bibliotek. Oznacza to, \u017ce prawdopodobnie doczekamy si\u0119 w ko\u0144cu Angular DevTools czy React Developer Tools dla Safari.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Osobi\u015bcie raczej nie zamierzam przerzuci\u0107 si\u0119 na co dzie\u0144 do Safari, a inspektor oferowany przez Chrome pozostaje dla mnie niezast\u0105piony. Natomiast dzi\u0119ki ma\u0142ym usprawnieniom w Safari 16, kr\u00f3tkie wycieczki do przegl\u0105darki od Apple na potrzeby test\u00f3w i naprawy b\u0142\u0119d\u00f3w, b\u0119d\u0105 troch\u0119 przyjemniejsze.<\/p>\n","innerContent":["\n<p>Osobi\u015bcie raczej nie zamierzam przerzuci\u0107 si\u0119 na co dzie\u0144 do Safari, a inspektor oferowany przez Chrome pozostaje dla mnie niezast\u0105piony. Natomiast dzi\u0119ki ma\u0142ym usprawnieniom w Safari 16, kr\u00f3tkie wycieczki do przegl\u0105darki od Apple na potrzeby test\u00f3w i naprawy b\u0142\u0119d\u00f3w, b\u0119d\u0105 troch\u0119 przyjemniejsze.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":10335,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem4.jpg\" alt=\"\" class=\"wp-image-10335\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem4.jpg\" alt=\"\" class=\"wp-image-10335\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Passkeys<\/h3>\n","innerContent":["\n<h3>Passkeys<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Passkeys to technologia, kt\u00f3ra mo\u017ce s\u0142u\u017cy\u0107 jako alternatywa dla hase\u0142, kt\u00f3ra pozwala logowa\u0107 si\u0119 na podstawie potwierdzenia to\u017csamo\u015bci dostarczonego przez nasze urz\u0105dzenie. Pod spodem ca\u0142o\u015b\u0107 przy rejestracji tworzy klucz kryptograficzny zapisywany na urz\u0105dzeniu, kt\u00f3ry potem wykorzystywany jest do autentykacji. Ca\u0142o\u015b\u0107 jest bardziej funkcjonalno\u015bci\u0105 macOS 16 i iOS 16, ale Safari 16 dosta\u0142o wszystkie niezb\u0119dne do obs\u0142ugi nowego mechanizmy API. Nie wiem, czy zamierzacie doda\u0107 nowy spos\u00f3b logowania do Waszych aplikacji, ale z perspektywy u\u017cytkownika wygl\u0105da to naprawd\u0119 ciekawie (dow\u00f3d poni\u017cej)<\/p>\n","innerContent":["\n<p>Passkeys to technologia, kt\u00f3ra mo\u017ce s\u0142u\u017cy\u0107 jako alternatywa dla hase\u0142, kt\u00f3ra pozwala logowa\u0107 si\u0119 na podstawie potwierdzenia to\u017csamo\u015bci dostarczonego przez nasze urz\u0105dzenie. Pod spodem ca\u0142o\u015b\u0107 przy rejestracji tworzy klucz kryptograficzny zapisywany na urz\u0105dzeniu, kt\u00f3ry potem wykorzystywany jest do autentykacji. Ca\u0142o\u015b\u0107 jest bardziej funkcjonalno\u015bci\u0105 macOS 16 i iOS 16, ale Safari 16 dosta\u0142o wszystkie niezb\u0119dne do obs\u0142ugi nowego mechanizmy API. Nie wiem, czy zamierzacie doda\u0107 nowy spos\u00f3b logowania do Waszych aplikacji, ale z perspektywy u\u017cytkownika wygl\u0105da to naprawd\u0119 ciekawie (dow\u00f3d poni\u017cej)<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":10337,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem5.gif\" alt=\"\" class=\"wp-image-10337\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem5.gif\" alt=\"\" class=\"wp-image-10337\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/webkit.org\/blog\/13152\/webkit-features-in-safari-16-0\/\">https:\/\/webkit.org\/blog\/13152\/webkit-features-in-safari-16-0\/<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/webkit.org\/blog\/13152\/webkit-features-in-safari-16-0\/\">https:\/\/webkit.org\/blog\/13152\/webkit-features-in-safari-16-0\/<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>2. MemLab: Wycieki pami\u0119ci? - nigdy wi\u0119cej!<\/h2>\n","innerContent":["\n<h2>2. MemLab: Wycieki pami\u0119ci? - nigdy wi\u0119cej!<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zanim przejdziemy do sedna, chcia\u0142bym podzieli\u0107 si\u0119 z Wami ma\u0142\u0105 \u0142amig\u0142\u00f3wk\u0105. Czy poni\u017cszy kod zawiera wyciek pami\u0119ci?<\/p>\n","innerContent":["\n<p>Zanim przejdziemy do sedna, chcia\u0142bym podzieli\u0107 si\u0119 z Wami ma\u0142\u0105 \u0142amig\u0142\u00f3wk\u0105. Czy poni\u017cszy kod zawiera wyciek pami\u0119ci?<\/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\">var obj = {};\nconsole.log(obj);\nobj = null;<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">var obj = {};\nconsole.log(obj);\nobj = null;<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jak to cz\u0119sto w programowaniu bywa, poprawna odpowied\u017a brzmi - to zale\u017cy. Okazuje si\u0119, \u017ce niekt\u00f3re \u015brodowiska (np. Chrome), nigdy nie zwolni\u0105 z pami\u0119ci obiekt\u00f3w, kt\u00f3re zosta\u0142y wy\u015bwietlone w konsoli. Na pierwszy rzut oka mo\u017ce wydawa\u0107 si\u0119 to podejrzane, ale z drugiej strony niesamowicie u\u0142atwia debugowanie. Gdyby obiekt wy\u015bwietlony w konsoli by\u0142 czyszczony z pami\u0119ci nie mogliby\u015bmy \u0142atwo si\u0119 do niego dobra\u0107 i manipulowa\u0107 nim wed\u0142ug w\u0142asnego widzimisi\u0119.<\/p>\n","innerContent":["\n<p>Jak to cz\u0119sto w programowaniu bywa, poprawna odpowied\u017a brzmi - to zale\u017cy. Okazuje si\u0119, \u017ce niekt\u00f3re \u015brodowiska (np. Chrome), nigdy nie zwolni\u0105 z pami\u0119ci obiekt\u00f3w, kt\u00f3re zosta\u0142y wy\u015bwietlone w konsoli. Na pierwszy rzut oka mo\u017ce wydawa\u0107 si\u0119 to podejrzane, ale z drugiej strony niesamowicie u\u0142atwia debugowanie. Gdyby obiekt wy\u015bwietlony w konsoli by\u0142 czyszczony z pami\u0119ci nie mogliby\u015bmy \u0142atwo si\u0119 do niego dobra\u0107 i manipulowa\u0107 nim wed\u0142ug w\u0142asnego widzimisi\u0119.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":10339,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem6.jpg\" alt=\"\" class=\"wp-image-10339\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem6.jpg\" alt=\"\" class=\"wp-image-10339\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>MemLab to narz\u0119dzie kt\u00f3rego Facebook u\u017cywa do wykrywania i monitorowania wyciek\u00f3w pami\u0119ci w aplikacjach. Ich monitorowanie jest o tyle wa\u017cne, \u017ce zazwyczaj drobne wycieki nie maj\u0105 wp\u0142ywu na wydajno\u015b\u0107 aplikacji i pozostaj\u0105 niezauwa\u017cone. Kiedy jednak korzystamy z aplikacji d\u0142u\u017cej, drobne wycieki kumuluj\u0105 si\u0119, doprowadzaj\u0105c do powolnego obni\u017cenia wydajno\u015bci i ostecznie do OutOfMemoryException. Problem polega na tym, \u017ce podczas rozwijania aplikacji bardzo rzadko symulujemy tak d\u0142ugie sesje. Nawet je\u015bli takie sesje przytrafi\u0105 nam si\u0119 od czasu do czasu, to zazwyczaj maj\u0105 one miejsce na wydajnym komputerze i bardzo \u0142atwo jest nam ignorowa\u0107 drobne spowolnienia.<\/p>\n","innerContent":["\n<p>MemLab to narz\u0119dzie kt\u00f3rego Facebook u\u017cywa do wykrywania i monitorowania wyciek\u00f3w pami\u0119ci w aplikacjach. Ich monitorowanie jest o tyle wa\u017cne, \u017ce zazwyczaj drobne wycieki nie maj\u0105 wp\u0142ywu na wydajno\u015b\u0107 aplikacji i pozostaj\u0105 niezauwa\u017cone. Kiedy jednak korzystamy z aplikacji d\u0142u\u017cej, drobne wycieki kumuluj\u0105 si\u0119, doprowadzaj\u0105c do powolnego obni\u017cenia wydajno\u015bci i ostecznie do OutOfMemoryException. Problem polega na tym, \u017ce podczas rozwijania aplikacji bardzo rzadko symulujemy tak d\u0142ugie sesje. Nawet je\u015bli takie sesje przytrafi\u0105 nam si\u0119 od czasu do czasu, to zazwyczaj maj\u0105 one miejsce na wydajnym komputerze i bardzo \u0142atwo jest nam ignorowa\u0107 drobne spowolnienia.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>MemLab dzia\u0142a w stosunkowo prosty spos\u00f3b. Przy pomocy Puppeteera uruchamia on przegl\u0105dark\u0119, nawiguje na stron\u0119 g\u0142\u00f3wn\u0105 aplikacji oraz wykonuje snapshot stosu JavaScript. Nast\u0119pnie wykonywana jest nawigacja na testowan\u0105 podstron\u0119 i po raz kolejny zapisywany jest snapshot stosu JavaScript. Ostatni krok to powr\u00f3t na stron\u0119 g\u0142\u00f3wn\u0105 oraz wykonanie jeszcze jednego snapshotu. Na podstawie por\u00f3wnania trzech snapshot\u00f3w stosu JavaScript, MemLab jest w stanie wykry\u0107 potencjalne wycieki pami\u0119ci.<\/p>\n","innerContent":["\n<p>MemLab dzia\u0142a w stosunkowo prosty spos\u00f3b. Przy pomocy Puppeteera uruchamia on przegl\u0105dark\u0119, nawiguje na stron\u0119 g\u0142\u00f3wn\u0105 aplikacji oraz wykonuje snapshot stosu JavaScript. Nast\u0119pnie wykonywana jest nawigacja na testowan\u0105 podstron\u0119 i po raz kolejny zapisywany jest snapshot stosu JavaScript. Ostatni krok to powr\u00f3t na stron\u0119 g\u0142\u00f3wn\u0105 oraz wykonanie jeszcze jednego snapshotu. Na podstawie por\u00f3wnania trzech snapshot\u00f3w stosu JavaScript, MemLab jest w stanie wykry\u0107 potencjalne wycieki pami\u0119ci.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":10341,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem7.gif\" alt=\"\" class=\"wp-image-10341\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem7.gif\" alt=\"\" class=\"wp-image-10341\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Poza wykrywaniem wyciek\u00f3w pami\u0119ci, MemLab oferuje te\u017c swego rodzaju debugger stosu JavaScript. Pozwala on przekszta\u0142ci\u0107 stos obiekt\u00f3w do postaci grafu zale\u017cno\u015bci. Dzi\u0119ki temu znalezienie obiektu, kt\u00f3ry przechowuje nadmiarowe referencje staje si\u0119 du\u017co \u0142atwiejsze.<\/p>\n","innerContent":["\n<p>Poza wykrywaniem wyciek\u00f3w pami\u0119ci, MemLab oferuje te\u017c swego rodzaju debugger stosu JavaScript. Pozwala on przekszta\u0142ci\u0107 stos obiekt\u00f3w do postaci grafu zale\u017cno\u015bci. Dzi\u0119ki temu znalezienie obiektu, kt\u00f3ry przechowuje nadmiarowe referencje staje si\u0119 du\u017co \u0142atwiejsze.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":10343,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem8-1024x602.jpg\" alt=\"\" class=\"wp-image-10343\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem8-1024x602.jpg\" alt=\"\" class=\"wp-image-10343\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>W minionym tygodniu Facebook upubliczni\u0142 MemLab jako narz\u0119dzie OpenSource. Nie wiem jak Wy, ale ja ju\u017c nie mog\u0119 doczeka\u0107 si\u0119, a\u017c znajd\u0119 chwil\u0119, \u017ceby pobawi\u0107 si\u0119 nim osobi\u015bcie. <\/p>\n","innerContent":["\n<p>W minionym tygodniu Facebook upubliczni\u0142 MemLab jako narz\u0119dzie OpenSource. Nie wiem jak Wy, ale ja ju\u017c nie mog\u0119 doczeka\u0107 si\u0119, a\u017c znajd\u0119 chwil\u0119, \u017ceby pobawi\u0107 si\u0119 nim osobi\u015bcie. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/engineering.fb.com\/2022\/09\/12\/open-source\/memlab\/\">https:\/\/engineering.fb.com\/2022\/09\/12\/open-source\/memlab\/<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/engineering.fb.com\/2022\/09\/12\/open-source\/memlab\/\">https:\/\/engineering.fb.com\/2022\/09\/12\/open-source\/memlab\/<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>3. React Router 6.4<\/h2>\n","innerContent":["\n<h2>3. React Router 6.4<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>React Router jest de facto standardow\u0105 bibliotek\u0105 do routingu w React. Prawie rok temu doczeka\u0142 si\u0119 on 6 wersji i tradycyjnie dla ju\u017c tej biblioteki, pe\u0142ny by\u0142 breaking changes. Trzeba jednak przyzna\u0107, \u017ce wprowadzi\u0142 te\u017c kilka interesuj\u0105cych nowo\u015bci, na zawsze zako\u0144czy\u0142 \u017cywot alternatywnego `reach-router` i postawi\u0142 podwaliny pod budow\u0119 Remixa (w sporym uproszczeniu alternatywy dla Next.js).\n<\/p>\n","innerContent":["\n<p>React Router jest de facto standardow\u0105 bibliotek\u0105 do routingu w React. Prawie rok temu doczeka\u0142 si\u0119 on 6 wersji i tradycyjnie dla ju\u017c tej biblioteki, pe\u0142ny by\u0142 breaking changes. Trzeba jednak przyzna\u0107, \u017ce wprowadzi\u0142 te\u017c kilka interesuj\u0105cych nowo\u015bci, na zawsze zako\u0144czy\u0142 \u017cywot alternatywnego `reach-router` i postawi\u0142 podwaliny pod budow\u0119 Remixa (w sporym uproszczeniu alternatywy dla Next.js).\n<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":10345,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem9.jpg\" alt=\"\" class=\"wp-image-10345\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/09\/frontend105-mem9.jpg\" alt=\"\" class=\"wp-image-10345\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>React Router 6.4 to pierwsze od tego czasu werska biblioteki, kt\u00f3re wprowadza interesuj\u0105ce nowo\u015bci. Zacznijmy od zgrabnego API, do obs\u0142ugi asynchronicznego \u0142adowania danych. Sk\u0142ada si\u0119 ono z propsa `loader` dodanego do komponentu `<route><\/route>` oraz hooka `useLoaderData()`.  Dane potrzebne do za\u0142adowania wszystkich dopasowanych \u015bcie\u017cek pobierane s\u0105 r\u00f3wnolegle, a biblioteka dba o to, \u017ceby dane nie by\u0142y pobierane kilkukrotnie. Ponadto react-router pozwala teraz na  wykorzystanie Suspense z React 18, aby zoptymalizowa\u0107 proces renderowania.<\/p>\n","innerContent":["\n<p>React Router 6.4 to pierwsze od tego czasu werska biblioteki, kt\u00f3re wprowadza interesuj\u0105ce nowo\u015bci. Zacznijmy od zgrabnego API, do obs\u0142ugi asynchronicznego \u0142adowania danych. Sk\u0142ada si\u0119 ono z propsa `loader` dodanego do komponentu `<route><\/route>` oraz hooka `useLoaderData()`.  Dane potrzebne do za\u0142adowania wszystkich dopasowanych \u015bcie\u017cek pobierane s\u0105 r\u00f3wnolegle, a biblioteka dba o to, \u017ceby dane nie by\u0142y pobierane kilkukrotnie. Ponadto react-router pozwala teraz na  wykorzystanie Suspense z React 18, aby zoptymalizowa\u0107 proces renderowania.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"prismatic\/blocks","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-\">&lt;Route\n  path=\"\/\"\n  loader={async ({ request }) => {\n    const res = await fetch(\"\/api\/user.json\", {\n      signal: request.signal,\n    });\n    const user = await res.json();\n    return user;\n  }}\n  element={&lt;Root \/>}\n>\n  &lt;Route\n    path=\":teamId\"\n    loader={({ params }) => {\n      return fetch(`\/api\/teams\/${params.teamId}`);\n    }}\n    element={&lt;Team \/>}\n  >\n&lt;\/Route>\n\nfunction Root() {\n  const user = useLoaderData();\n  \/\/ data from &lt;Route path=\"\/\">\n}\n\nfunction Team() {\n  const team = useLoaderData();\n  \/\/ data from &lt;Route path=\":teamId\">\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-\">&lt;Route\n  path=\"\/\"\n  loader={async ({ request }) => {\n    const res = await fetch(\"\/api\/user.json\", {\n      signal: request.signal,\n    });\n    const user = await res.json();\n    return user;\n  }}\n  element={&lt;Root \/>}\n>\n  &lt;Route\n    path=\":teamId\"\n    loader={({ params }) => {\n      return fetch(`\/api\/teams\/${params.teamId}`);\n    }}\n    element={&lt;Team \/>}\n  >\n&lt;\/Route>\n\nfunction Root() {\n  const user = useLoaderData();\n  \/\/ data from &lt;Route path=\"\/\">\n}\n\nfunction Team() {\n  const team = useLoaderData();\n  \/\/ data from &lt;Route path=\":teamId\">\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nieodzown\u0105 cz\u0119\u015bci\u0105 asynchronicznego \u0142adowania danych jest obs\u0142uga b\u0142\u0119d\u00f3w. Tej te\u017c nie zabrak\u0142o w nowym react-router.<\/p>\n","innerContent":["\n<p>Nieodzown\u0105 cz\u0119\u015bci\u0105 asynchronicznego \u0142adowania danych jest obs\u0142uga b\u0142\u0119d\u00f3w. Tej te\u017c nie zabrak\u0142o w nowym react-router.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"prismatic\/blocks","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-\">&lt;Route\n  path=\"\/\"\n  loader={() => {\n    somethingThatThrowsAnError();\n  }}\n  \/\/ this will not be rendered\n  element={&lt;HappyPath \/>}\n  \/\/ but this will instead\n  errorElement={&lt;ErrorBoundary \/>}\n\/><\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-\">&lt;Route\n  path=\"\/\"\n  loader={() => {\n    somethingThatThrowsAnError();\n  }}\n  \/\/ this will not be rendered\n  element={&lt;HappyPath \/>}\n  \/\/ but this will instead\n  errorElement={&lt;ErrorBoundary \/>}\n\/><\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ostatnia spora nowo\u015b\u0107 to obs\u0142uga formularzy. Jak twierdz\u0105 tw\u00f3rcy biblioteki, mutacja danych przez formularze HTML powinna by\u0107 wydarzeniem routingu. Ci\u0119\u017cko si\u0119 z nimi nie zgodzi\u0107 - natywne formularze zbudowane zosta\u0142y zbudowane tak, aby wraz z ich zaakceptowaniem wysy\u0142a\u0107 zapytanie do serwera, kt\u00f3re przenosi u\u017cytkownika na now\u0105 stron\u0119. Standardowe obecnie rozwi\u0105zania z wywo\u0142ywaniem `event.preventDefault()`, s\u0105 wi\u0119c sporym hakiem, a nawigacj\u0105 na now\u0105 stron\u0119 by\u0142oby rozwi\u0105zaniem zdecydowanie bli\u017cszym oryginalnej architektury.<\/p>\n","innerContent":["\n<p>Ostatnia spora nowo\u015b\u0107 to obs\u0142uga formularzy. Jak twierdz\u0105 tw\u00f3rcy biblioteki, mutacja danych przez formularze HTML powinna by\u0107 wydarzeniem routingu. Ci\u0119\u017cko si\u0119 z nimi nie zgodzi\u0107 - natywne formularze zbudowane zosta\u0142y zbudowane tak, aby wraz z ich zaakceptowaniem wysy\u0142a\u0107 zapytanie do serwera, kt\u00f3re przenosi u\u017cytkownika na now\u0105 stron\u0119. Standardowe obecnie rozwi\u0105zania z wywo\u0142ywaniem `event.preventDefault()`, s\u0105 wi\u0119c sporym hakiem, a nawigacj\u0105 na now\u0105 stron\u0119 by\u0142oby rozwi\u0105zaniem zdecydowanie bli\u017cszym oryginalnej architektury.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Od teraz react-router b\u0119dzie w stanie dopasowa\u0107 zapytania typu POST, PUT i PATCH, do zdefiniowanych \u015bcie\u017cek. Nast\u0119pnie wywo\u0142ana zostanie funkcja przekazana do \u015bcie\u017cki jako props action.\n<\/p>\n","innerContent":["\n<p>Od teraz react-router b\u0119dzie w stanie dopasowa\u0107 zapytania typu POST, PUT i PATCH, do zdefiniowanych \u015bcie\u017cek. Nast\u0119pnie wywo\u0142ana zostanie funkcja przekazana do \u015bcie\u017cki jako props action.\n<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"prismatic\/blocks","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-\">\u200b\u200b&lt;Route\n  path=\"\/song\/:songId\/edit\"\n  element={&lt;EditSong \/>}\n  action={async ({ params, request }) => {\n    let formData = await request.formData();\n    return fakeUpdateSong(params.songId, formData);\n  }}\n\/>\n\nfunction EditSong() {\n  return (&lt;Form method=\"post\" action=\"\/songs\/123\/edit\" \/>)\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-\">\u200b\u200b&lt;Route\n  path=\"\/song\/:songId\/edit\"\n  element={&lt;EditSong \/>}\n  action={async ({ params, request }) => {\n    let formData = await request.formData();\n    return fakeUpdateSong(params.songId, formData);\n  }}\n\/>\n\nfunction EditSong() {\n  return (&lt;Form method=\"post\" action=\"\/songs\/123\/edit\" \/>)\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/remix.run\/blog\/react-router-v6.4\">https:\/\/remix.run\/blog\/react-router-v6.4<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/remix.run\/blog\/react-router-v6.4\">https:\/\/remix.run\/blog\/react-router-v6.4<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>Bonus #1: Adobe kupuje Figm\u0119!<\/h2>\n","innerContent":["\n<h2>Bonus #1: Adobe kupuje Figm\u0119!<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Na pewno kojarzycie Figm\u0119, czyli narz\u0119dzie do tworzenia designu aplikacji. Na przestrzeni ostatnich kilku lat sta\u0142o si\u0119 ono w\u0142a\u015bciwie rynkowym standardem. By\u0142o to troch\u0119 nie na r\u0119k\u0119 Adobe, kt\u00f3re do tej pory w\u0142a\u015bciwie posiada\u0142o monopol w tej kategorii. Z tego wzgl\u0119du postanowili oni zakupi\u0107 m\u0142odego potentata.<\/p>\n","innerContent":["\n<p>Na pewno kojarzycie Figm\u0119, czyli narz\u0119dzie do tworzenia designu aplikacji. Na przestrzeni ostatnich kilku lat sta\u0142o si\u0119 ono w\u0142a\u015bciwie rynkowym standardem. By\u0142o to troch\u0119 nie na r\u0119k\u0119 Adobe, kt\u00f3re do tej pory w\u0142a\u015bciwie posiada\u0142o monopol w tej kategorii. Z tego wzgl\u0119du postanowili oni zakupi\u0107 m\u0142odego potentata.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Z notatki informuj\u0105cej o przej\u0119ciu dowiadujemy si\u0119, \u017ce tak naprawd\u0119 z perspektywy klient\u00f3w niewiele si\u0119 zmieni. Z perspektywy firmy pojawia si\u0119 natomiast szansa na przyspieszenie rozwoju i skorzystanie z wiedzy Adobe na temat video, 3d czy sztucznej inteligencji, <\/p>\n","innerContent":["\n<p>Z notatki informuj\u0105cej o przej\u0119ciu dowiadujemy si\u0119, \u017ce tak naprawd\u0119 z perspektywy klient\u00f3w niewiele si\u0119 zmieni. Z perspektywy firmy pojawia si\u0119 natomiast szansa na przyspieszenie rozwoju i skorzystanie z wiedzy Adobe na temat video, 3d czy sztucznej inteligencji, <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/www.figma.com\/blog\/a-new-collaboration-with-adobe\/\">https:\/\/www.figma.com\/blog\/a-new-collaboration-with-adobe\/<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/www.figma.com\/blog\/a-new-collaboration-with-adobe\/\">https:\/\/www.figma.com\/blog\/a-new-collaboration-with-adobe\/<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>Bonus #2: ng-cong 2022 Angular Team Keynote<\/h2>\n","innerContent":["\n<h2>Bonus #2: ng-cong 2022 Angular Team Keynote<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Pocz\u0105tkiem wrze\u015bnia w Salt Lake City mia\u0142a miejsce najwi\u0119ksza i najwa\u017cniejsza Angularowa konferencja - ng-conf 2022. Niestety, nie wszystkie prezentacje s\u0105 ju\u017c dost\u0119pne na YouTube. Dost\u0119pny jest ju\u017c natomiast Angular Team Keynote, kt\u00f3ry jest \u015bwietnym miejscem je\u015bli chcecie przypomnie\u0107 sobie co w ostatnich miesi\u0105cach zmieni\u0142o si\u0119 w Angularze i jakich zmian mo\u017cemy oczekiwa\u0107 w kilku kolejnych.<\/p>\n","innerContent":["\n<p>Pocz\u0105tkiem wrze\u015bnia w Salt Lake City mia\u0142a miejsce najwi\u0119ksza i najwa\u017cniejsza Angularowa konferencja - ng-conf 2022. Niestety, nie wszystkie prezentacje s\u0105 ju\u017c dost\u0119pne na YouTube. Dost\u0119pny jest ju\u017c natomiast Angular Team Keynote, kt\u00f3ry jest \u015bwietnym miejscem je\u015bli chcecie przypomnie\u0107 sobie co w ostatnich miesi\u0105cach zmieni\u0142o si\u0119 w Angularze i jakich zmian mo\u017cemy oczekiwa\u0107 w kilku kolejnych.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/embed","attrs":{"url":"https:\/\/www.youtube.com\/watch?v=CABHcf1gCbg","type":"video","providerNameSlug":"youtube","responsive":true,"className":"wp-embed-aspect-16-9 wp-has-aspect-ratio"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=CABHcf1gCbg\n<\/div><\/figure>\n","innerContent":["\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=CABHcf1gCbg\n<\/div><\/figure>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10358","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=10358"}],"version-history":[{"count":5,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10358\/revisions"}],"predecessor-version":[{"id":10456,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10358\/revisions\/10456"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/10353"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=10358"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=10358"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=10358"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}