{"id":16021,"date":"2023-06-09T00:03:29","date_gmt":"2023-06-08T22:03:29","guid":{"rendered":"https:\/\/vived.io\/?p=16021"},"modified":"2023-06-09T15:07:58","modified_gmt":"2023-06-09T13:07:58","slug":"react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/","title":{"rendered":"React == PHP &#038;&#038; NgRevolution &#8211; Frontend Monthly (Maj 2023)"},"content":{"rendered":"\n<p>Zanim przejdziemy do dzisiejszego podsumowania, nale\u017c\u0105 si\u0119 Wam dwa s\u0142owa wyja\u015bnienia. W kwietniu Vived przeszed\u0142 ma\u0142e zawirowania (nic strasznego &#8211; zesp\u00f3\u0142 edytorski nadal dzia\u0142a pe\u0142n\u0105 par\u0105, \u017ceby dostarcza\u0107 do aplikacji \u015bwie\u017ce i ciekawe tre\u015bci), a na to wszystko na\u0142o\u017cy\u0142 si\u0119 m\u00f3j prawie miesi\u0119czny urlop (je\u015bli zastanawiacie si\u0119 czy warto odwiedzi\u0107 zachodnie wybrze\u017ce USA, to ja jak najbardziej warto!). W efekcie frontendowe podsumowania znikn\u0119\u0142y z radar\u00f3w na prawie 2 miesi\u0105ce&#8230; Teraz wracamy jednak z lekko zmienion\u0105 formu\u0142\u0105. Zamiast kr\u00f3tkich cotygodniowych podsumowa\u0144 mo\u017cecie spodziewa\u0107 si\u0119 odrobin\u0119 d\u0142u\u017cszych comiesi\u0119cznych raport\u00f3w i okazjonalnych wyda\u0144 specjalnych. Mam nadziej\u0119, \u017ce nowy format spodoba si\u0119 Wam r\u00f3wnie mocno jak poprzedni i bez zb\u0119dnego przed\u0142u\u017cania &#8211; \u0142apcie kubek ulubionego napoju, rozsi\u0105d\u017acie si\u0119 wygodnie i zapraszamy do lektury!<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"480\" height=\"480\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/giphy-1.gif\" alt=\"\" class=\"wp-image-16165\"\/><figcaption class=\"wp-element-caption\">Zapami\u0119tajcie, tak wygl\u0105da jedyna s\u0142uszna pozycja do czytania Frontend Monthly <\/figcaption><\/figure><\/div>\n\n\n<h2 id=\"react-19-next-js-13-4\" data-num=1><s>React 19 &#8211; <\/s> Next.js 13.4<\/h2>\n\n\n\n<p>Je\u015bli interesuj\u0105 Was nowo\u015bci w React, to najlepiej zrobicie je\u015bli jak najszybciej zaczniecie dok\u0142adnie \u015bledzi\u0107 co dzieje si\u0119 ekosystemie Next.js. Zesp\u00f3\u0142 Reacta skupia swoj\u0105 uwag\u0119 g\u0142\u00f3wnie na rozwoju React Server Components(RSC). Ze wzgl\u0119du na to, \u017ce funkcjonalno\u015bci tej nie mo\u017cna u\u017cywa\u0107 bez frameworka, Meta rozpocz\u0119\u0142a \u015bcis\u0142\u0105 wsp\u00f3\u0142prac\u0119 z Vercelem (firma matka Next.js) i to w\u0142a\u015bnie Next.js jest aktualnie pionierem wdra\u017caj\u0105cym kolejne nowo\u015bci. Wydany pocz\u0105tkiem maja Next.js 13.4 stanowi w tej kwestii spory krok milowy, bo nowy router oparty o React Server Components staje si\u0119 oficjalnie rekomendowanym rozwi\u0105zaniem. Zanim przejdziemy do rzeczy, cofnijmy si\u0119 o dwa kroki i przypomnijmy czym s\u0105 React Server Components i jak dzia\u0142a nowy routing w Next.js.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Fr6j3ABWIAI2lSU-2.png\" alt=\"\" class=\"wp-image-16115\" width=\"660\" height=\"599\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Fr6j3ABWIAI2lSU-2.png 796w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Fr6j3ABWIAI2lSU-2-300x272.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Fr6j3ABWIAI2lSU-2-768x697.png 768w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption class=\"wp-element-caption\">\u0179r\u00f3d\u0142o: <a href=\"https:\/\/twitter.com\/thekitze\/status\/1638927506723033088\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/twitter.com\/thekitze\/status\/1638927506723033088<\/a><\/figcaption><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">React Server Components<\/h3>\n\n\n\n<p>React Server Components zosta\u0142y po raz pierwszy zaprezentowane przez Dana Abramova w grudniu 2020 roku. W swoich za\u0142o\u017ceniach koncepcja jest prosta &#8211;&nbsp;cz\u0119\u015b\u0107 z komponent\u00f3w b\u0119dzie renderowana po stronie klienta, a cz\u0119\u015b\u0107 po stronie serwera.  Dzi\u0119ki jasnej separacji mi\u0119dzy serwerem i przegl\u0105dark\u0105, serwerowe komponenty otrzymaj\u0105 dost\u0119p do nowych API i b\u0119d\u0105 mog\u0142y na przyk\u0142ad bezpo\u015brednio odpytywa\u0107 baz\u0119 danych, czy korzysta\u0107 z systemu plik\u00f3w. Deweloperzy b\u0119d\u0105 mogli r\u00f3wnie\u017c przesta\u0107 martwi\u0107 si\u0119 o rozmiar zale\u017cno\u015bci w serwerowych komponentach, gdy\u017c te nigdy nie b\u0119d\u0105 wysy\u0142ane do klienta.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">&quot;use server&quot;\n\nimport db from &#039;db&#039;; \n\/\/This is interactive client component\nimport NoteEditor from &#039;NoteEditor&#039;; \n\nasync function Note(props) {\n  const {id, isEditing} = props;\n  const note = await db.posts.get(id);\n  \n  return (\n    &lt;div&gt;\n      &lt;h1&gt;{note.title}&lt;\/h1&gt;\n      &lt;section&gt;{note.body}&lt;\/section&gt;\n      {isEditing \n        ? &lt;NoteEditor note={note} \/&gt;\n        : null\n      }\n    &lt;\/div&gt;\n  );\n}<\/code><\/pre>\n\n\n\n<p>Architektura React Server Components r\u00f3\u017cni si\u0119 mocno od standardowego podej\u015bcia do renderowania po stronie serwera. Po pierwsze, w standardowym podej\u015bciu, serwer czeka, a\u017c ca\u0142a strona zostanie wyrenderowana. Oznacza to, \u017ce je\u015bli serwer potrzebuje wykona\u0107 powolne zapytanie, to ca\u0142a strona b\u0119dzie \u0142adowa\u0107 si\u0119 powoli. Przy wykorzystaniu React Server Components, szkielet aplikacji szybko trafia do przegl\u0105darki, a kolejne komponenty s\u0105 stopniowo strumieniowe w postaci pseudo HTMLa. Po drugie, w standardowym podej\u015bciu, framework po stronie klienta przejmuje kontrol\u0119 nad aplikacj\u0105, co skutkuje tym, \u017ce wszystkie komponenty by\u0107 przystosowane do dzia\u0142ania zar\u00f3wno po stronie klienta jak i serwera. W przypadku React Server Components kod komponent\u00f3w nigdy nie jest wysy\u0142any do klienta i renderowanie zawsze odbywa si\u0119 po stronie serwera.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"598\" height=\"420\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download.jpeg\" alt=\"\" class=\"wp-image-16120\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download.jpeg 598w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-300x211.jpeg 300w\" sizes=\"auto, (max-width: 598px) 100vw, 598px\" \/><\/figure><\/div>\n\n\n<p>React Server Components maj\u0105 te\u017c swoje ograniczenia. Po pierwsze, ze wzgl\u0119du na zupe\u0142nie inny cykl \u017cycia, nie mo\u017cna w nich wykorzystywa\u0107 hook\u00f3w <code>useState<\/code> i <code>useEffect<\/code>. Po drugie, mi\u0119dzy komponentami renderowanymi po stronie serwera i kliena nie mo\u017cemy przechodzi\u0107 ca\u0142kiem swobodnie. B\u0119d\u0105c bardziej precyzyjny, komponenty renderowane po stronie klienta nie mog\u0105 bezpo\u015brednio importowa\u0107 komponent\u00f3w renderowanych po stronie serwera. Mo\u017cliwe jest jedynie przekazanie takiego komponentu jako jeden z props\u00f3w. Pomimo tego, \u017ce na poz\u00f3r mo\u017ce si\u0119 to wydawa\u0107 sporym ograniczeniem, to w ostatecznym rozrachunku nie sprawia to wielu problem\u00f3w.<\/p>\n\n\n\n<p>Od 2020 roku, zesp\u00f3\u0142 React intensywnie pracuje nad rozwojem React Server Components. Po drodze zmieni\u0142 si\u0119 na przyk\u0142ad spos\u00f3b oznaczania komponent\u00f3w czy spos\u00f3b obs\u0142ugi asynchronicznych operacji. Po 3 latach intensywnego rozwoju, chyba doczekali\u015bmy si\u0119 w ko\u0144cu w miar\u0119 stabilnego API. Je\u015bli jeste\u015bcie g\u0142odni detali dotycz\u0105cy serwerowych komponent\u00f3w, to osobi\u015bcie polecam <a href=\"https:\/\/www.youtube.com\/watch?v=TQQPAU21ZUw\" target=\"_blank\" rel=\"noreferrer noopener\">oryginaln\u0105 prezentacj\u0119 Dana Abramova<\/a> i <a href=\"https:\/\/www.plasmic.app\/blog\/how-react-server-components-work\" target=\"_blank\" rel=\"noreferrer noopener\">\u015bwietny blog post z Plasmic Blog w detalach pokrywaj\u0105cy ten temat<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Next.js Page Router<\/h3>\n\n\n\n<p>Wraz z Next.js 13 zaprezentowany zosta\u0142 nowy model routingu dla Next.js. Wprowadza\u0142 on sporo drobnych, aczkolwiek istotnych usprawnie\u0144. W\u015br\u00f3d nich znajdziemy mi\u0119dzy innymi natywne wsparcie dla zagnie\u017cd\u017conych szablon\u00f3w czy lepsz\u0105 obs\u0142ug\u0119 b\u0142\u0119d\u00f3w i \u0142adowania. Po\u015br\u00f3d nowo\u015bci najbardziej wybrzmiewa jednak fakt, \u017ce nowy router zbudowany zosta\u0142 w oparciu o React Server Components. Oznacza to, \u017ce wszystkie komponenty s\u0105 komponentami serwerowymi, a przysz\u0142o\u015b\u0107 Next.js \u015bci\u015ble zwi\u0105zana jest z przysz\u0142o\u015bci\u0105 React Server Components. Je\u015bli jeste\u015bcie ciekawi szczeg\u00f3\u0142\u00f3w na temat tego jak dzia\u0142a nowy Page Router, to <a href=\"https:\/\/vived.io\/the-future-is-now-next-js-13-frontend-weekly-vol-110\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">po\u015bwi\u0119cili\u015bmy temu tematowi wi\u0119kszo\u015b\u0107 jednej z edycji naszego raportu<\/a>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1OEFTQKz1bXF4p1p6tcbf6ANIT06c3bdWWuiK9X5wYBk.png\" alt=\"\" class=\"wp-image-16118\" width=\"437\" height=\"661\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1OEFTQKz1bXF4p1p6tcbf6ANIT06c3bdWWuiK9X5wYBk.png 500w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1OEFTQKz1bXF4p1p6tcbf6ANIT06c3bdWWuiK9X5wYBk-198x300.png 198w\" sizes=\"auto, (max-width: 437px) 100vw, 437px\" \/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Next.js 13.4, Page Router i React Canary<\/h3>\n\n\n\n<p>Je\u015bli odpowiednio po\u0142\u0105czyli\u015bcie kropki, to zapewne teraz drapiecie si\u0119 po g\u0142owie &#8211; Jak to jest, \u017ce Next.js domy\u015blnie zaleca stosowanie React Server Components, je\u015bli nie s\u0105 one jeszcze stabiln\u0105 funkcjonalno\u015bci\u0105? Jest to mo\u017cliwe dzi\u0119ki nowemu kana\u0142owi releas\u00f3w na jakie zdecydowa\u0142 si\u0119 zesp\u00f3\u0142 Reacta. Do wersji Canary trafia\u0107 b\u0119d\u0105 funkcjonalno\u015bci o stabilnym API, kt\u00f3re wydane zostan\u0105 wraz z kolejn\u0105 wi\u0119ksz\u0105 wersj\u0105 Reacta. Dlaczego zesp\u00f3\u0142 nie zdecydowa\u0142 si\u0119 po prostu cz\u0119\u015bciej publikowa\u0107 kolejnych wersji biblioteki? Czasami zdarza si\u0119, \u017ce release zblokowany jest na kilku brakuj\u0105cych funkcjonalno\u015bciach kompletnie nie zwi\u0105zanych z ustabilizowanym w\u0142a\u015bnie API. Dzi\u0119ki nowemu kana\u0142owi releas\u00f3w, spo\u0142eczno\u015b\u0107 szybciej b\u0119dzie mog\u0142a testowa\u0107 nowe funkcjonalno\u015bci, r\u00f3wnocze\u015bnie nie martwi\u0105c si\u0119, \u017ce kolejna eksperymentalna wersja ca\u0142kowicie zepsuje ich aplikacje.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">React Server Actions<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/EXENDo-UEAMlhhW-1-1024x1024.jpeg\" alt=\"\" class=\"wp-image-16108\" width=\"596\" height=\"596\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/EXENDo-UEAMlhhW-1-1024x1024.jpeg 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/EXENDo-UEAMlhhW-1-300x300.jpeg 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/EXENDo-UEAMlhhW-1-150x150.jpeg 150w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/EXENDo-UEAMlhhW-1-768x768.jpeg 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/EXENDo-UEAMlhhW-1-1536x1536.jpeg 1536w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/EXENDo-UEAMlhhW-1.jpeg 2048w\" sizes=\"auto, (max-width: 596px) 100vw, 596px\" \/><figcaption class=\"wp-element-caption\">\u0179r\u00f3d\u0142o: <a href=\"https:\/\/twitter.com\/markdalgleish\/status\/1256800146118959109\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/twitter.com\/markdalgleish\/status\/1256800146118959109<\/a><\/figcaption><\/figure><\/div>\n\n\n<p>Je\u015bli regularnie czytacie nasze przegl\u0105dy, to na pewno widzieli\u015bcie ju\u017c nie jeden mem na temat tego jak React upodabnia sie do PHP. No c\u00f3\u017c, wraz z Next.js 13.4 poczyniony zosta\u0142 kolejny krok w tym kierunku. React Server Actions umo\u017cliwiaj\u0105 wywo\u0142anie funkcji na serwerze i ca\u0142kowicie ukrywaj\u0105 przed programist\u0105 warstw\u0119 komunikacji(innymi stare dobre Remote Protocol Call). Wszystko co musimy zrobi\u0107, to zacz\u0105\u0107 nasz\u0105 funkcj\u0119 od <code>&#039;use server;<\/code> i voil\u00e0 &#8211; kod b\u0119dzie wykonywany po stronie serwera i nigdy nie trafi do klienta.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">import { cookies } from &#039;next\/headers&#039;;\n \nexport default function AddToCart({ productId }) {\n  async function addItem(data) {\n    &#039;use server&#039;;\n    const cartId = cookies().get(&#039;cartId&#039;)?.value;\n    await saveToDb({ cartId, data });\n  }\n \n  return (\n    &lt;form action={addItem}&gt;\n      &lt;button type=&quot;submit&quot;&gt;Add to Cart&lt;\/button&gt;\n    &lt;\/form&gt;\n  );\n}<\/code><\/pre>\n\n\n\n<p>Co istotne, React Server Actions maj\u0105 swoje ograniczenia. Po pierwsze, funkcja tego typu musi by\u0107 asynchroniczna. Po drugie, funkcj\u0119 tak\u0105 mo\u017cemy przekaza\u0107 tylko do formularza, albo do hooka <code>startTransition<\/code>.  Co ciekawe, w tej pierwszej opcji formularz b\u0119dzie dzia\u0142a\u0142 nawet kiedy klient wy\u0142\u0105czy po swojej stronie obs\u0142ug\u0119 JavaScript.<\/p>\n\n\n\n<p>React Server Actions zdecydowanie nie s\u0105 pierwszym podej\u015bciem do RPC w JavaScript. S\u0105 natomiast pierwsz\u0105 implementacj\u0105 zintegrowan\u0105 w frontendowy framework. Je\u015bli uda im si\u0119 opu\u015bci\u0107 wersj\u0119 alpha, to na pewno stan\u0105 si\u0119 ciekawym rozszerzeniem dla React Server Components.  <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"550\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-5.jpeg\" alt=\"\" class=\"wp-image-16170\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-5.jpeg 500w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-5-273x300.jpeg 273w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure><\/div>\n\n\n<h2 id=\"angular-16\" data-num=2>Angular 16<\/h2>\n\n\n\n<p>Nowe wersje Angulara pojawiaj\u0105 si\u0119 punktualnie co p\u00f3\u0142 roku niczym japo\u0144ski Shinkansen i w maju \u015bwiat\u0142o dzienne ujrza\u0142 Angular 16. Patrz\u0105c na kilka ostatnich wersji frameworka, nie spos\u00f3b nie zauwa\u017cy\u0107, \u017ce jego rozw\u00f3j znacznie przy\u015bpieszy\u0142. Co wa\u017cne, zesp\u00f3\u0142 stoj\u0105cy za frameworkiem wreszcie zacz\u0105\u0142 wys\u0142uchiwa\u0107 problem\u00f3w spo\u0142eczno\u015bci. Z wersji na wersj\u0119 rozwi\u0105zywane s\u0105 teraz najwi\u0119ksze bol\u0105czki deweloper\u00f3w &#8211; i to nawet takie, kt\u00f3re towarzyszy\u0142y frameworkowi ju\u017c od zarania dziej\u00f3w. Angular 16 kontynuuje ten trend i proponuje rewolucj\u0119 jakiej Angular jeszcze nie widzia\u0142.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"650\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/180-Klb_j6w_oWgtDoxUOfMqWfVOlnfukMGJIBJET1Ks.png\" alt=\"\" class=\"wp-image-16125\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/180-Klb_j6w_oWgtDoxUOfMqWfVOlnfukMGJIBJET1Ks.png 500w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/180-Klb_j6w_oWgtDoxUOfMqWfVOlnfukMGJIBJET1Ks-231x300.png 231w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Signals<\/h3>\n\n\n\n<p>Angular zosta\u0142 zbudowany na fundamencie stosunkowo niewielkiej biblioteki <code>zone.js<\/code>. Jest ona odpowiedzialna za monkey-patching asynchronicznych metod przegl\u0105darki. Za ka\u017cdym razem kiedy kt\u00f3rakolwiek z takich metod jest wywo\u0142ywana, <code>zone.js<\/code> powiadamia o tym Angulara, a ten stara si\u0119 okre\u015bli\u0107 czy stan aplikacji uleg\u0142 zmianie. Dzi\u0119ki takiej architekturze, Angular w stosunkowo &#8222;magiczny&#8221; spos\u00f3b potrafi od\u015bwie\u017ca\u0107 warto\u015b\u0107 zmiennych w interfejsie u\u017cytkownika.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"635\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-2.jpeg\" alt=\"\" class=\"wp-image-16127\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-2.jpeg 500w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-2-236x300.jpeg 236w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><figcaption class=\"wp-element-caption\">Based on famous: <a href=\"https:\/\/xkcd.com\/2347\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/xkcd.com\/2347\/<\/a><\/figcaption><\/figure><\/div>\n\n\n<p>Jak to zwykle bywa, magiczne rozwi\u0105zania maj\u0105 r\u00f3wnie\u017c swoj\u0105 ciemn\u0105 stron\u0119. Aby okre\u015bli\u0107 co zmieni\u0142o si\u0119 w interfejsie u\u017cytkownika, Angular musi wykonywa\u0107 ci\u0119\u017ck\u0105 i skomplikowan\u0105 operacj\u0119 Change Detection. Je\u015bli kiedykolwiek musieli\u015bcie optymalizowa\u0107 Angularowe komponenty albo natkneli\u015bcie si\u0119 na b\u0142\u0119dy zwi\u0105zane z od\u015bwie\u017caniem interfejsu, na pewno wiecie do czego zmierzam. Magia Angulara potrafi ca\u0142kiem szybko doprowadzi\u0107 do problem\u00f3w z wydajno\u015bci\u0105 i debugowaniem. <\/p>\n\n\n\n<p>Na przestrzeni lat deweloperzy Angulara nauczyli si\u0119 lawirowa\u0107 mi\u0119dzy ograniczeniami <code>zone.js<\/code> i <code>ChangeDetection<\/code>, ale wci\u0105\u017c czuli, \u017ce da si\u0119 to zrobi\u0107 lepiej. Tym lepiej maj\u0105 by\u0107 zaprezentowane w Angularze 16 Signals, kt\u00f3re s\u0105 pierwszym krokiem w kierunku pozbycia si\u0119 <code>zone.js<\/code>. Nie nast\u0105pi to prawdopodobnie szybko (o ile w og\u00f3le &#8211; w ko\u0144cu aplikacji i bibliotek bazuj\u0105cych na zachowaniu <code>zone.js<\/code> jest sporo&#8230;). Wydaje si\u0119 jednak, \u017ce pod-drzewa komponent\u00f3w pozbawione <code>zone.js<\/code> s\u0105 ju\u017c tu\u017c za rogiem.<\/p>\n\n\n\n<p>Wr\u00f3\u0107my jednak do clue dzisiejszego tematu i przyjrzymy si\u0119 czym tak naprawd\u0119 s\u0105 sygna\u0142y. Cytuj\u0105c za dokumentacj\u0105 Angulara: sygna\u0142 jest opakowaniem wok\u00f3\u0142 warto\u015bci, kt\u00f3re jest w stanie powiadomi\u0107 zainteresowanych konsument\u00f3w, gdy ta warto\u015b\u0107 ulega zmianie. Dla wszystkich operuj\u0105cych na co dzie\u0144 w Angularze i RxJS ja\u015bniejsza  mo\u017ce by\u0107 analogia do <code>BehaviourSubject<\/code>, gdy\u017c dok\u0142adnie tym w lekkim uproszczeniu s\u0105 sygna\u0142y.<\/p>\n\n\n\n<p>Sygna\u0142y tworzone s\u0105 za pomoc\u0105 factory method&nbsp;<code>signal()<\/code>&nbsp;przyjmuj\u0105cej warto\u015b\u0107 pocz\u0105tkow\u0105 jako parametr. Sygna\u0142y mog\u0105 by\u0107 komponowane za pomoc\u0105 metody&nbsp;<code>computed<\/code>(). Mo\u017cliwe jest r\u00f3wnie\u017c wywo\u0142ywanie efekt\u00f3w ubocznych, gdy warto\u015b\u0107 sygna\u0142u si\u0119 zmienia, rejestruj\u0105c odpowiedni callback w metodzie&nbsp;<code>effect()<\/code>. W dowolnym momencie mo\u017cemy odczyta\u0107 warto\u015b\u0107 sygna\u0142u wywo\u0142uj\u0105c go jak funkcj\u0119. Sygna\u0142y mog\u0105 by\u0107 aktualizowane za pomoc\u0105 metod&nbsp;<code>set<\/code>(),&nbsp;<code>update<\/code>() i&nbsp;<code>mutate<\/code>(). W du\u017cym uproszczeniu, to wszystko co musicie wiedzie\u0107 o sygna\u0142ach. Je\u015bli jeste\u015bcie natomiast ciekawi jak dzia\u0142aj\u0105 poszczeg\u00f3lne bebechy, to po\u015bwi\u0119cili\u015bmy temu tematowi <a href=\"https:\/\/vived.io\/pl\/angular-signals-w-10-minut-frontend-weekly-vol-132\/\" target=\"_blank\" rel=\"noreferrer noopener\">ca\u0142\u0105 132 edycj\u0119 naszego przegl\u0105du<\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">@Component({\n  selector: &#039;my-app&#039;,\n  standalone: true,\n  template: `\n    {{ fullName() }} &lt;button (click)=&quot;setName(&#039;John&#039;)&quot;&gt;Click&lt;\/button&gt;\n  `,\n})\nexport class App {\n  firstName = signal(&#039;Jane&#039;);\n  lastName = signal(&#039;Doe&#039;);\n  fullName = computed(() =&gt; `${this.firstName()} ${this.lastName()}`);\n\n  constructor() {\n    effect(() =&gt; console.log(&#039;Name changed:&#039;, this.fullName()));\n  }\n\n  setName(newName: string) {\n    this.firstName.set(newName);\n  }\n}<\/code><\/pre>\n\n\n\n<p>Opr\u00f3cz nowego prymitywu zesp\u00f3\u0142 Angulara pracuje te\u017c nad szeregiem wbudowanych w framework integracji. Dostaniemy wi\u0119c narz\u0119dzia do wygodnej integracji z sygna\u0142\u00f3w z strumieniami, API frameworka zwracaj\u0105ce sygna\u0142y zamiast strumieni i reaktywne inputy oparte o sygna\u0142y. Szczeg\u00f3lnie te ostatnie wygl\u0105daj\u0105 wyj\u0105tkowo ciekawie.<\/p>\n\n\n\n<p>Skoro <code>Signals<\/code> zachowuj\u0105 si\u0119 bardzo podobnie do <code>BehaviurSubject<\/code>, to czy Angular na pewno potrzebuje kolejnego prymitywu zintegrowanego z frameworkiem? Po pierwsze <code>Signal<\/code> to du\u017co prostsza abstrakcja ni\u017c <code>Observable<\/code>. \u017beby sprawnie operowa\u0107 <code>RxJS<\/code> musimy pozna\u0107 ca\u0142y szereg skomplikowanych zagadnie\u0144 takich jak zimne i gor\u0105ce strumienie, asynchroniczno\u015b\u0107 w JavaScript czy ponad 100 dost\u0119pnych w RxJS operator\u00f3w. Po drugie, wszystkie strumienie naturalnie grawituj\u0105 w kierunku zimnych strumieni (wystarczy na dowolnym <code>BehaviourSubject<\/code> zastosowa\u0107 operator <code>map<\/code>). Sprawia to, \u017ce nigdy nie mo\u017cemy by\u0107 pewni, \u017ce subskrypcja do strumienia synchronicznie zwr\u00f3ci warto\u015b\u0107. W efekcie nasze aplikacje zalane s\u0105 zb\u0119dnym i powtarzalnym kodem. Podsumowuj\u0105c, RxJS sprawdza si\u0119 \u015bwietnie, gdy potrzebujemy modelowa\u0107 z\u0142o\u017cone zdarzenia dziej\u0105ce si\u0119 na przestrzeni czasu, takie jak limitowanie zapyta\u0144 do backendu czy agregowanie klikni\u0119\u0107 myszk\u0105. Je\u015bli chodzi o zarz\u0105dzanie stanem komponent\u00f3w i aplikacji, RxJS&nbsp;ma wi\u0119cej wad ni\u017c zalet.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"680\" height=\"452\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1HBUIJu3n1kXwERfyTxKSfHqgAJ7VolAPwt5fPpPgUGw.png\" alt=\"\" class=\"wp-image-16129\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1HBUIJu3n1kXwERfyTxKSfHqgAJ7VolAPwt5fPpPgUGw.png 680w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1HBUIJu3n1kXwERfyTxKSfHqgAJ7VolAPwt5fPpPgUGw-300x199.png 300w\" sizes=\"auto, (max-width: 680px) 100vw, 680px\" \/><figcaption class=\"wp-element-caption\">\u0179r\u00f3d\u0142o: <a href=\"https:\/\/twitter.com\/t3dotgg\/status\/1626393874393595907\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/twitter.com\/t3dotgg\/status\/1626393874393595907\/<\/a><\/figcaption><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Non-Destructive Hydration<\/h3>\n\n\n\n<p>Hydracja to proces podczas kt\u00f3rego wyrenderowany na serwerze HTML jest przejmowany przez framework po stronie klienta. Wi\u0119kszo\u015b\u0107 framework\u00f3w w trakcie tego procesu pod\u0142\u0105cza listenery do istniej\u0105cych w\u0119z\u0142\u00f3w DOM. Do wersji 16, Angular zamiast wykorzystywa\u0107 istniej\u0105c\u0105 struktur\u0119 DOM, bazowa\u0142 w ca\u0142o\u015bci na strukturze wygenerowanej po stronie klienta. Jak \u0142atwo si\u0119 domy\u015bli\u0107, od czasu do czasu powodowa\u0142o to drobne glitche i nie by\u0142o najbardziej optymaln\u0105 strategi\u0105. Od najnowszej wersji, po ustawieniu odpowiedniej flagi, Angular po stronie klienta b\u0119dzie w stanie operowa\u0107 na strukturze HTML wyrenderowanej na serwerze.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"526\" height=\"499\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1sCeK-thDFHe49j3QU9ryfx9a0mviS7CtGKXl3xFdnP4.png\" alt=\"\" class=\"wp-image-16131\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1sCeK-thDFHe49j3QU9ryfx9a0mviS7CtGKXl3xFdnP4.png 526w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1sCeK-thDFHe49j3QU9ryfx9a0mviS7CtGKXl3xFdnP4-300x285.png 300w\" sizes=\"auto, (max-width: 526px) 100vw, 526px\" \/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Vite + ESBuild = Speed<\/h3>\n\n\n\n<p>Je\u015bli nigdy nie narzekali\u015bcie na powolne budowanie Angulara to&#8230; prawdopodobnie nigdy nie pracowali\u015bcie z du\u017cym projektem w Angularze. Ju\u017c od kilku wersji Angular wprowadza spore usprawnienia je\u015bli chodzi o czas uruchomienia serwera deweloperskiego. Angular 16 ca\u0142kowicie migruje serwer deweloperski na Vite + ESBuild. Z jednej strony usprawnienia wydajno\u015bci ciesz\u0105, z drugiej rozjazd mi\u0119dzy narz\u0119dziami wykorzystywanymi na produkcji (gdzie wci\u0105\u017c aplikacj\u0119 buduje webpack) i lokalnie troch\u0119 martwi. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"532\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1z9-8Vy3KvXzZtFYKAGfHBfpKopj15O2anY8QxH3vsy0-1.png\" alt=\"\" class=\"wp-image-16136\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1z9-8Vy3KvXzZtFYKAGfHBfpKopj15O2anY8QxH3vsy0-1.png 500w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1z9-8Vy3KvXzZtFYKAGfHBfpKopj15O2anY8QxH3vsy0-1-282x300.png 282w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure><\/div>\n\n\n<h2 id=\"vue-3-3\" data-num=3>Vue 3.3<\/h2>\n\n\n\n<p>Na Vue 3.3 czekali\u015bmy od dawna. Ju\u017c <a href=\"https:\/\/vived.io\/javascript-wrapped-2022-frontend-weekly-vol-119\/\" target=\"_blank\" rel=\"noreferrer noopener\">w naszym grudniowym podsumowaniu roku<\/a> pisali\u015bmy, \u017ce kolejny Vue uka\u017ce si\u0119 za kilka tygodni. Po drodze zesp\u00f3\u0142 dowodzony przez Evana You napotka\u0142 sporo perturbacji i z stycznia zrobi\u0142 si\u0119 nagle maj. Nie dziwi wiec, \u017ce jednym z celi zespo\u0142u na kolejne miesi\u0105ce jest regularne dowo\u017cenie mniejszych, inkrementalnych wyda\u0144. Czas poka\u017ce, czy cel uda si\u0119 spe\u0142ni\u0107, ale zgodnie z zapowiedziami Vue 3.4 ma ukaza\u0107 si\u0119 najp\u00f3\u017aniej za 6 miesi\u0119cy.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"539\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-4.jpeg\" alt=\"\" class=\"wp-image-16148\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-4.jpeg 500w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-4-278x300.jpeg 278w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">TypeScript, TypeScript, TypeScript<\/h3>\n\n\n\n<p>Motywem przewodnim Vue 3.3 jest lepsza integracja z TypeScript. Zacznijmy od wsparcia z\u0142o\u017conych typ\u00f3w w funkcjach <code>defineProps<\/code> i <code>defineEmits<\/code>. Je\u015bli nigdy nie korzystali\u015bcie z Vue, to funkcje te s\u0142u\u017c\u0105 do definiowania schematu wej\u015b\u0107 i wyj\u015b\u0107 z komponentu. Vue w procesie kompilacji wykorzystywa\u0142 typ danych przekazanych do generycznych metod, co ogranicza\u0142o zakres mo\u017cliwo\u015bci do prostych typ\u00f3w zdefiniowanych w tym samym pliku co komponent. Wraz z Vue 3.3 ograniczenia te znikaj\u0105 ca\u0142kowicie i do <code>defineProps<\/code> i <code>defineEmits<\/code> mo\u017cemy teraz przekazywa\u0107 dowolne typy &#8211; czy to importowane z innych plik\u00f3w, czy to Union Types, czy to zaawansowane potworki wykorzystuj\u0105ce Utility Types.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-xml\">&lt;script setup lang=&quot;ts&quot;&gt;\nimport type { Props } from &#039;.\/foo&#039;\n\n\/\/ imported + intersection type\ndefineProps&lt;Props &amp; { extraProp?: string }&gt;()\n&lt;\/script&gt;<\/code><\/pre>\n\n\n\n<p>Kolejn\u0105 nowo\u015bci\u0105 w Vue 3.3 s\u0105 generyczne komponenty. Pr\u00f3bowa\u0142em dogrzeba\u0107 si\u0119 do informacji, w jaki spos\u00f3b deweloperzy Vue radzili sobie z generycznymi komponentami do tej pory. Okazuje si\u0119, \u017ce albo rezygnowali oni ca\u0142kowicie ze sprawdzania typ\u00f3w, albo <a href=\"https:\/\/logaretm.com\/blog\/generically-typed-vue-components\/\" target=\"_blank\" rel=\"noreferrer noopener\">skazani byli na pokraczne i skomplikowane rozwi\u0105zania<\/a>. Na szcz\u0119\u015bcie, od teraz rozs\u0105dne rozwi\u0105zanie jest ju\u017c wbudowane w framework.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-xml\">&lt;script setup lang=&quot;ts&quot; generic=&quot;T&quot;&gt;\ndefineProps&lt;{\n  items: T[]\n  selected: T\n}&gt;()\n&lt;\/script&gt;<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"501\" height=\"500\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-3-2.jpeg\" alt=\"\" class=\"wp-image-16144\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-3-2.jpeg 501w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-3-2-300x300.jpeg 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-3-2-150x150.jpeg 150w\" sizes=\"auto, (max-width: 501px) 100vw, 501px\" \/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Inne usprawnienia<\/h3>\n\n\n\n<p>Opr\u00f3cz usprawnionej integracji z TypeScript, Vue 3.3 to te\u017c ma\u0142a paczka drobnych usprawnie\u0144. Dostali\u015bmy na przyk\u0142ad nowe, zdecydowanie schludniejsze API dla metody <code>&lt;code&gt;defineEmits<\/code><\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-\">\/\/ BEFORE\nconst emit = defineEmits&lt;{\n  (e: &#039;foo&#039;, id: number): void\n  (e: &#039;bar&#039;, name: string, ...rest: any[]): void\n}&gt;()\n\n\/\/ AFTER\nconst emit = defineEmits&lt;{\n  foo: [id: number]\n  bar: [name: string, ...rest: any[]]\n}&gt;()<\/code><\/pre>\n\n\n\n<p>Poza tym dostali\u015bmy now\u0105 metod\u0119 <code>defineSlots<\/code>, kt\u00f3ra b\u0119dzie s\u0142u\u017cy\u0142a do zdefiniowania typ\u00f3w slot\u00f3w w komponencie. Na ten moment  kompilator weryfikuje tylko zgodno\u015b\u0107 schematu komponentu, przez co nie da si\u0119 na przyk\u0142ad zdefiniowa\u0107 sko\u0144czonej listy akceptowanych komponent\u00f3w. Rozwi\u0105zanie nie jest te\u017c wspierane przez <code>Volar<\/code>, czyli  Language Server wykorzystywany przez Vue, dzi\u0119ki kt\u00f3remu w VSCode mo\u017cemy korzysta\u0107 z podpowiadania sk\u0142adni i innych podobnych dobrodziejstw. Pomimo drobnych ogranicze\u0144, <code>defineSlots<\/code> wydaje si\u0119 krokiem w dobrym kierunku i na pewno ucieszy wszystkich pracuj\u0105cych na co dzie\u0144 z Vue. <\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-xml\">&lt;script setup lang=&quot;ts&quot;&gt;\ndefineSlots&lt;{\n  default?: (props: { msg: string }) =&gt; any\n  item?: (props: { id: number }) =&gt; any\n}&gt;()\n&lt;\/script&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Przysz\u0142o\u015b\u0107 Vue<\/h3>\n\n\n\n<p>Por\u00f3wnuj\u0105c nowo\u015bci z Vue do tych z Angulara i React, nie spos\u00f3b nie odnie\u015b\u0107 wra\u017cenia, \u017ce s\u0105 one troch\u0119 mniej ekscytuj\u0105ce. Vue mierzy si\u0119 w\u0142a\u015bnie z migracj\u0105 swoich u\u017cytkownik\u00f3w z wersji 2 na 3. Oznacza to, \u017ce zesp\u00f3\u0142 nie mo\u017ce skupi\u0107 si\u0119 ca\u0142kowicie na rozwoju nowych funkcjonalno\u015bci. Poprzednio wydana wersja Vue, to w ko\u0144cu nie Vue 3.2, a Vue 2.7, kt\u00f3re portowa\u0142o nowo\u015bci z Vue 3 do Vue 2. Wszystko wskazuje na to, \u017ce sytuacja wkr\u00f3tce ulegnie zmianie. Po pierwsze, Vue 2 dokona swojego \u017cywota wraz z ko\u0144cem tego roku. Po drugie, na tegorocznej konferencji Vuejs Amsterdam, Evan You uchyli\u0142 r\u0105bka tajemnicy i zdradzi\u0142, \u017ce zesp\u00f3\u0142 pracuje nad nowym wydajnym kompilatorem na wz\u00f3r SolidJS. Po trzecie, Vue to nie tylko Vue. W ostatnich miesi\u0105cach narz\u0119dzia zbudowane wok\u00f3\u0142 Vue (np. Vite, Volar) zacz\u0119\u0142y szturmem zdobywa\u0107 popularno\u015b\u0107 r\u00f3wnie\u017c poza matczynym frameworkiem i to w\u0142a\u015bnie tutaj dzieje si\u0119 teraz najwi\u0119cej.<\/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\/2023\/06\/7oeh02-1.jpeg\" alt=\"\" class=\"wp-image-16146\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/7oeh02-1.jpeg 717w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/7oeh02-1-300x146.jpeg 300w\" sizes=\"auto, (max-width: 717px) 100vw, 717px\" \/><\/figure><\/div>\n\n\n<p>PS Je\u015bli na co dzie\u0144 pracujecie z Vue i jeszcze nie widzieli\u015bcie prezentacji Evana, to najwy\u017cszy czas to nadrobi\u0107. <\/p>\n\n\n\n<figure class=\"wp-block-embed aligncenter 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=\"Evan You - State of the Vuenion 2023 - Vuejs Amsterdam 2023\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/I5mGNB-4f0o?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\n\n\n<h2 id=\"qwik-1-0\" data-num=4>Qwik 1.0<\/h2>\n\n\n\n<p>Qwik to framework rozwijany przez prawdziw\u0105 frontendow\u0105 dru\u017cyn\u0119 All-Stars. W zespole pracuj\u0105cym nad frameworkiem znale\u017a\u0107 mo\u017cemy mi\u0119dzy innymi Mi\u0161ko Heverego (wsp\u00f3\u0142tw\u00f3rca Angulara) czy Adama Bradleya (wsp\u00f3\u0142tw\u00f3rc\u0119 Ionica) &#8211; ludzi wiedz\u0105cych jak zbudowa\u0107 i sprzeda\u0107 framework. Dodatkowo za Qwikiem stoi coraz szerzej rozpoznawalna firma Builder.io. W jej portfolio opr\u00f3cz omawianego dzi\u015b frameworka znajdziemy mi\u0119dzy innymi bibliotek\u0119 <a href=\"https:\/\/partytown.builder.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Partytown<\/a> (umo\u017cliwiaj\u0105c\u0105 przerzucenie kodu tracker\u00f3w takich jak Google Analytics do r\u00f3wnoleg\u0142ych worker\u00f3w) i <a href=\"https:\/\/vived.io\/pl\/frontend-thursday-vol-84-mitosis-node-18-react-redux-v8\/\" target=\"_blank\" rel=\"noreferrer noopener\">Mitosis<\/a> (umo\u017cliwiaj\u0105c\u0105 pisanie komponent\u00f3w w specjalnym j\u0119zyku, a nast\u0119pnie kompilowanie ich do dowolnego frameworku).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"665\" height=\"375\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image10-2.jpeg\" alt=\"\" class=\"wp-image-16150\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image10-2.jpeg 665w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image10-2-300x169.jpeg 300w\" sizes=\"auto, (max-width: 665px) 100vw, 665px\" \/><\/figure><\/div>\n\n\n<p>Qwik wywraca do g\u00f3ry nogami obecny paradygmaty renderowania po stronie serwera, poprzez ca\u0142kowite pozbycie si\u0119 procesu hydracji. Hydracja, to proces po stronie klienta, podczas kt\u00f3rego wyrenderowana po stronie serwera aplikacja \u0142aduje kod JavaScript, nast\u0119pnie powtarza ca\u0142\u0105 logik\u0119 inicjalizacyjn\u0105 i ostatecznie pod\u0142\u0105cza odpowiednie listenery do istniej\u0105cej struktury DOM. O ile klient szybko widzi docelow\u0105 te\u015b\u0107, o tyle sam proces hydracji mo\u017ce trwa\u0107 od kilku do kilkunastu sekund. Do tego czasu aplikacja pozostaje ca\u0142kowicie statyczna.<\/p>\n\n\n\n<p>Alternatywa, kt\u00f3r\u0105 oferuje Qwik, to wznawiane wykonania (ang. Resumable). Paradygmat ten pozwala zapisa\u0107 stan aplikacji po stronie serwera w taki spos\u00f3b, aby po stronie klienta mo\u017cliwe by\u0142o natychmiastowe wznowienie wykonywania kodu. Dodatkowo Qwik dzieli aplikacj\u0119 na bardzo ma\u0142e cz\u0119\u015bci i nie pobiera ca\u0142ego kodu aplikacji przy starcie. Zamiast tego stosowane s\u0105 zaawansowane strategie pre-loadingu, kt\u00f3re \u0142aduj\u0105 kod tylko niezb\u0119dnych komponent\u00f3w. W r\u0119ce programist\u00f3w trafiaj\u0105 zaawansowane narz\u0119dzia umo\u017cliwiaj\u0105ce okre\u015blenie jasnych priorytet\u00f3w wzgl\u0119dem pobierania komponent\u00f3w. Je\u015bli komponent jest nieistotny, to mo\u017cliwe jest nawet pobranie jego kodu dopiero kiedy u\u017cytkownik wejdzie z nim w interakcje.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image3-1024x462.png\" alt=\"\" class=\"wp-image-16155\" width=\"815\" height=\"368\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image3-1024x462.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image3-300x135.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image3-768x346.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image3-1536x693.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image3.png 2000w\" sizes=\"auto, (max-width: 815px) 100vw, 815px\" \/><\/figure><\/div>\n\n\n<p>Sk\u0142adnia Qwika na pierwszy rzut oka bardzo przypomina sk\u0142adni\u0119 Reacta i dlatego wi\u0119kszo\u015b\u0107 deweloper\u00f3w szybko si\u0119 w niej odjnajdzie. Zaskakuj\u0105ce dla nowicjuszy mog\u0105 by\u0107 wszechobecne <code>$<\/code> ko\u0144cz\u0105ce definicje wielu funkcji. Wyznaczaj\u0105 one fragmenty, na jakie Qwik podzieli aplikacj\u0119 i maj\u0105 kluczowe znaczenie w przypadku zaawansowanych optymalizacji.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">import { component$, useStore } from &#039;@builder.io\/qwik&#039;;\n\nexport default component$(() =&gt; {\n  const store = useStore({ count: 0 });\n\n  return (\n    &lt;main&gt;\n      &lt;p&gt;Count: {store.count}&lt;\/p&gt;\n      &lt;p&gt;\n        &lt;button onClick$={() =&gt; store.count++}&gt;Click&lt;\/button&gt;\n      &lt;\/p&gt;\n    &lt;\/main&gt;\n  );\n});<\/code><\/pre>\n\n\n\n<p> jednej strony bardzo przypomina on Reacta, co czyni go przyst\u0119pnym i zrozumia\u0142ym dla pocz\u0105tkuj\u0105cych. Z drugiej strony, model mentalny polegaj\u0105cy na dzieleniu kodu na tysi\u0105ce ma\u0142ych kawa\u0142k\u00f3w i do\u0142adowywanie ich asynchronicznie mo\u017ce wprowadza\u0107 na deweloper\u00f3w spory narzut. Osobi\u015bcie nie mia\u0142em jeszcze okazji pobawi\u0107 si\u0119 t\u0105 now\u0105, l\u015bni\u0105c\u0105 zabawk\u0105 i wstrzymam si\u0119 jeszcze z ostatecznymi os\u0105dami. Podsk\u00f3rnie mam jednak wra\u017cenie, \u017ce architektury takie jak Dynamic Islands czy React Server Components nie staraj\u0105 si\u0119 rozwi\u0105za\u0107 wszystkich problem\u00f3w r\u00f3wnocze\u015bnie i oferuj\u0105 zdecydowanie prostsze modele mentalne.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"735\" height=\"490\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image1.png\" alt=\"\" class=\"wp-image-16152\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image1.png 735w, https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image1-300x200.png 300w\" sizes=\"auto, (max-width: 735px) 100vw, 735px\" \/><\/figure><\/div>\n\n\n<h2 id=\"ps-urodziny-reacta-i-php\" data-num=5>PS: Urodziny Reacta i PHP \ud83c\udf89<\/h2>\n\n\n\n<p>Je\u015bli nie mieli\u015bcie w tym miesi\u0105cu okazji do \u015bwi\u0119towania, to ju\u017c \u015bpiesz\u0119 z odsiecz\u0105. Ot\u00f3\u017c w maju 28 urodziny \u015bwi\u0119towa\u0142 PHP, a jego m\u0142odszy kolega w postaci Reacta 10. Idealna okazja, \u017ceby troch\u0119 powspomina\u0107 i wszama\u0107 ulubiony tort lub wci\u0105gn\u0105\u0107 lampk\u0119 ulubionego alkoholu. Do zobaczenia za miesi\u0105c!<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/giphy.gif\" alt=\"\" class=\"wp-image-16158\" width=\"641\" height=\"495\"\/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a:<\/h3>\n\n\n\n<p><a href=\"https:\/\/nextjs.org\/blog\/next-13-4\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/nextjs.org\/blog\/next-13-4<\/a><br><a href=\"https:\/\/react.dev\/blog\/2023\/05\/03\/react-canaries\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/react.dev\/blog\/2023\/05\/03\/react-canaries<\/a><br><a href=\"https:\/\/blog.angular.io\/angular-v16-is-here-4d7a28ec680d\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/blog.angular.io\/angular-v16-is-here-4d7a28ec680d<\/a><br><a href=\"https:\/\/blog.vuejs.org\/posts\/vue-3-3\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/blog.vuejs.org\/posts\/vue-3-3<\/a><br><a href=\"https:\/\/www.builder.io\/blog\/qwik-v1\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.builder.io\/blog\/qwik-v1<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W maju 2023 sporo si\u0119 dzia\u0142o. Next.js 13.4 wyra\u017anie pokaza\u0142 w jak\u0105 stron\u0119 zmierza obecnie React, Angular przeszed\u0142 totaln\u0105 rewolucj\u0119, a Vue doczeka\u0142 si\u0119 od dawna wyczekiwanej wersji 3.4.<\/p>\n","protected":false},"author":12,"featured_media":16216,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[273,1],"tags":[],"class_list":["post-16021","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\/06\/Frontend-Weekly-1200x628_V2-1.png","feature_image_blog":{"ID":16173,"id":16173,"title":"Vived_a_photo_of_a_family_having_saturdays_grill_cbad8571-51c9-4efc-bb25-4a81c119fa65","filename":"Vived_a_photo_of_a_family_having_saturdays_grill_cbad8571-51c9-4efc-bb25-4a81c119fa65.png","filesize":1107349,"url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Vived_a_photo_of_a_family_having_saturdays_grill_cbad8571-51c9-4efc-bb25-4a81c119fa65.png","link":"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/vived_a_photo_of_a_family_having_saturdays_grill_cbad8571-51c9-4efc-bb25-4a81c119fa65\/","alt":"","author":"12","description":"","caption":"","name":"vived_a_photo_of_a_family_having_saturdays_grill_cbad8571-51c9-4efc-bb25-4a81c119fa65","status":"inherit","uploaded_to":16021,"date":"2023-06-08 21:42:21","modified":"2023-06-08 21:42:21","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/vived.io\/wp-includes\/images\/media\/default.png","width":1070,"height":713,"sizes":{"thumbnail":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Vived_a_photo_of_a_family_having_saturdays_grill_cbad8571-51c9-4efc-bb25-4a81c119fa65-150x150.png","thumbnail-width":150,"thumbnail-height":150,"medium":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Vived_a_photo_of_a_family_having_saturdays_grill_cbad8571-51c9-4efc-bb25-4a81c119fa65-300x200.png","medium-width":300,"medium-height":200,"medium_large":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Vived_a_photo_of_a_family_having_saturdays_grill_cbad8571-51c9-4efc-bb25-4a81c119fa65-768x512.png","medium_large-width":768,"medium_large-height":512,"large":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Vived_a_photo_of_a_family_having_saturdays_grill_cbad8571-51c9-4efc-bb25-4a81c119fa65-1024x682.png","large-width":1024,"large-height":682,"1536x1536":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Vived_a_photo_of_a_family_having_saturdays_grill_cbad8571-51c9-4efc-bb25-4a81c119fa65.png","1536x1536-width":1070,"1536x1536-height":713,"2048x2048":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Vived_a_photo_of_a_family_having_saturdays_grill_cbad8571-51c9-4efc-bb25-4a81c119fa65.png","2048x2048-width":1070,"2048x2048-height":713,"gform-image-choice-sm":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Vived_a_photo_of_a_family_having_saturdays_grill_cbad8571-51c9-4efc-bb25-4a81c119fa65.png","gform-image-choice-sm-width":300,"gform-image-choice-sm-height":200,"gform-image-choice-md":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Vived_a_photo_of_a_family_having_saturdays_grill_cbad8571-51c9-4efc-bb25-4a81c119fa65.png","gform-image-choice-md-width":400,"gform-image-choice-md-height":267,"gform-image-choice-lg":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Vived_a_photo_of_a_family_having_saturdays_grill_cbad8571-51c9-4efc-bb25-4a81c119fa65.png","gform-image-choice-lg-width":600,"gform-image-choice-lg-height":400}},"estimated_reading_time":"17"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>React == PHP &amp;&amp; NgRevolution - Frontend Monthly (Maj 2023) - 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\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"React == PHP &amp;&amp; NgRevolution - Frontend Monthly (Maj 2023) - Vived\" \/>\n<meta property=\"og:description\" content=\"W maju 2023 sporo si\u0119 dzia\u0142o. Next.js 13.4 wyra\u017anie pokaza\u0142 w jak\u0105 stron\u0119 zmierza obecnie React, Angular przeszed\u0142 totaln\u0105 rewolucj\u0119, a Vue doczeka\u0142 si\u0119 od dawna wyczekiwanej wersji 3.4.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-08T22:03:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-09T13:07:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.vived.io\/wp-content\/uploads\/2023\/06\/Frontend-Weekly-1200x628_V2-1.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\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/\"},\"author\":{\"name\":\"Tomasz Borowicz\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb\"},\"headline\":\"React == PHP &#038;&#038; NgRevolution &#8211; Frontend Monthly (Maj 2023)\",\"datePublished\":\"2023-06-08T22:03:29+00:00\",\"dateModified\":\"2023-06-09T13:07:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/\"},\"wordCount\":3215,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Frontend-Weekly-1200x628_V2-1.png\",\"articleSection\":[\"Frontend\",\"No category\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/\",\"url\":\"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/\",\"name\":\"React == PHP && NgRevolution - Frontend Monthly (Maj 2023) - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Frontend-Weekly-1200x628_V2-1.png\",\"datePublished\":\"2023-06-08T22:03:29+00:00\",\"dateModified\":\"2023-06-09T13:07:58+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Frontend-Weekly-1200x628_V2-1.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Frontend-Weekly-1200x628_V2-1.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"React == PHP &#038;&#038; NgRevolution &#8211; Frontend Monthly (Maj 2023)\"}]},{\"@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":"React == PHP && NgRevolution - Frontend Monthly (Maj 2023) - 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\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/","og_locale":"pl_PL","og_type":"article","og_title":"React == PHP && NgRevolution - Frontend Monthly (Maj 2023) - Vived","og_description":"W maju 2023 sporo si\u0119 dzia\u0142o. Next.js 13.4 wyra\u017anie pokaza\u0142 w jak\u0105 stron\u0119 zmierza obecnie React, Angular przeszed\u0142 totaln\u0105 rewolucj\u0119, a Vue doczeka\u0142 si\u0119 od dawna wyczekiwanej wersji 3.4.","og_url":"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/","og_site_name":"Vived","article_published_time":"2023-06-08T22:03:29+00:00","article_modified_time":"2023-06-09T13:07:58+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/blog.vived.io\/wp-content\/uploads\/2023\/06\/Frontend-Weekly-1200x628_V2-1.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\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/"},"author":{"name":"Tomasz Borowicz","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb"},"headline":"React == PHP &#038;&#038; NgRevolution &#8211; Frontend Monthly (Maj 2023)","datePublished":"2023-06-08T22:03:29+00:00","dateModified":"2023-06-09T13:07:58+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/"},"wordCount":3215,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Frontend-Weekly-1200x628_V2-1.png","articleSection":["Frontend","No category"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/","url":"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/","name":"React == PHP && NgRevolution - Frontend Monthly (Maj 2023) - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Frontend-Weekly-1200x628_V2-1.png","datePublished":"2023-06-08T22:03:29+00:00","dateModified":"2023-06-09T13:07:58+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Frontend-Weekly-1200x628_V2-1.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Frontend-Weekly-1200x628_V2-1.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/react-jeszcze-blizej-php-i-rewolucja-w-angularze-frontend-monthly-may-2023\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"React == PHP &#038;&#038; NgRevolution &#8211; Frontend Monthly (Maj 2023)"}]},{"@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\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zanim przejdziemy do dzisiejszego podsumowania, nale\u017c\u0105 si\u0119 Wam dwa s\u0142owa wyja\u015bnienia. W kwietniu Vived przeszed\u0142 ma\u0142e zawirowania (nic strasznego - zesp\u00f3\u0142 edytorski nadal dzia\u0142a pe\u0142n\u0105 par\u0105, \u017ceby dostarcza\u0107 do aplikacji \u015bwie\u017ce i ciekawe tre\u015bci), a na to wszystko na\u0142o\u017cy\u0142 si\u0119 m\u00f3j prawie miesi\u0119czny urlop (je\u015bli zastanawiacie si\u0119 czy warto odwiedzi\u0107 zachodnie wybrze\u017ce USA, to ja jak najbardziej warto!). W efekcie frontendowe podsumowania znikn\u0119\u0142y z radar\u00f3w na prawie 2 miesi\u0105ce... Teraz wracamy jednak z lekko zmienion\u0105 formu\u0142\u0105. Zamiast kr\u00f3tkich cotygodniowych podsumowa\u0144 mo\u017cecie spodziewa\u0107 si\u0119 odrobin\u0119 d\u0142u\u017cszych comiesi\u0119cznych raport\u00f3w i okazjonalnych wyda\u0144 specjalnych. Mam nadziej\u0119, \u017ce nowy format spodoba si\u0119 Wam r\u00f3wnie mocno jak poprzedni i bez zb\u0119dnego przed\u0142u\u017cania - \u0142apcie kubek ulubionego napoju, rozsi\u0105d\u017acie si\u0119 wygodnie i zapraszamy do lektury!<\/p>\n","innerContent":["\n<p>Zanim przejdziemy do dzisiejszego podsumowania, nale\u017c\u0105 si\u0119 Wam dwa s\u0142owa wyja\u015bnienia. W kwietniu Vived przeszed\u0142 ma\u0142e zawirowania (nic strasznego - zesp\u00f3\u0142 edytorski nadal dzia\u0142a pe\u0142n\u0105 par\u0105, \u017ceby dostarcza\u0107 do aplikacji \u015bwie\u017ce i ciekawe tre\u015bci), a na to wszystko na\u0142o\u017cy\u0142 si\u0119 m\u00f3j prawie miesi\u0119czny urlop (je\u015bli zastanawiacie si\u0119 czy warto odwiedzi\u0107 zachodnie wybrze\u017ce USA, to ja jak najbardziej warto!). W efekcie frontendowe podsumowania znikn\u0119\u0142y z radar\u00f3w na prawie 2 miesi\u0105ce... Teraz wracamy jednak z lekko zmienion\u0105 formu\u0142\u0105. Zamiast kr\u00f3tkich cotygodniowych podsumowa\u0144 mo\u017cecie spodziewa\u0107 si\u0119 odrobin\u0119 d\u0142u\u017cszych comiesi\u0119cznych raport\u00f3w i okazjonalnych wyda\u0144 specjalnych. Mam nadziej\u0119, \u017ce nowy format spodoba si\u0119 Wam r\u00f3wnie mocno jak poprzedni i bez zb\u0119dnego przed\u0142u\u017cania - \u0142apcie kubek ulubionego napoju, rozsi\u0105d\u017acie si\u0119 wygodnie i zapraszamy do lektury!<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16165,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/giphy-1.gif\" alt=\"\" class=\"wp-image-16165\"\/><figcaption class=\"wp-element-caption\">Zapami\u0119tajcie, tak wygl\u0105da jedyna s\u0142uszna pozycja do czytania Frontend Monthly <\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/giphy-1.gif\" alt=\"\" class=\"wp-image-16165\"\/><figcaption class=\"wp-element-caption\">Zapami\u0119tajcie, tak wygl\u0105da jedyna s\u0142uszna pozycja do czytania Frontend Monthly <\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\"><s>React 19 - <\/s> Next.js 13.4<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\"><s>React 19 - <\/s> Next.js 13.4<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli interesuj\u0105 Was nowo\u015bci w React, to najlepiej zrobicie je\u015bli jak najszybciej zaczniecie dok\u0142adnie \u015bledzi\u0107 co dzieje si\u0119 ekosystemie Next.js. Zesp\u00f3\u0142 Reacta skupia swoj\u0105 uwag\u0119 g\u0142\u00f3wnie na rozwoju React Server Components(RSC). Ze wzgl\u0119du na to, \u017ce funkcjonalno\u015bci tej nie mo\u017cna u\u017cywa\u0107 bez frameworka, Meta rozpocz\u0119\u0142a \u015bcis\u0142\u0105 wsp\u00f3\u0142prac\u0119 z Vercelem (firma matka Next.js) i to w\u0142a\u015bnie Next.js jest aktualnie pionierem wdra\u017caj\u0105cym kolejne nowo\u015bci. Wydany pocz\u0105tkiem maja Next.js 13.4 stanowi w tej kwestii spory krok milowy, bo nowy router oparty o React Server Components staje si\u0119 oficjalnie rekomendowanym rozwi\u0105zaniem. Zanim przejdziemy do rzeczy, cofnijmy si\u0119 o dwa kroki i przypomnijmy czym s\u0105 React Server Components i jak dzia\u0142a nowy routing w Next.js.<\/p>\n","innerContent":["\n<p>Je\u015bli interesuj\u0105 Was nowo\u015bci w React, to najlepiej zrobicie je\u015bli jak najszybciej zaczniecie dok\u0142adnie \u015bledzi\u0107 co dzieje si\u0119 ekosystemie Next.js. Zesp\u00f3\u0142 Reacta skupia swoj\u0105 uwag\u0119 g\u0142\u00f3wnie na rozwoju React Server Components(RSC). Ze wzgl\u0119du na to, \u017ce funkcjonalno\u015bci tej nie mo\u017cna u\u017cywa\u0107 bez frameworka, Meta rozpocz\u0119\u0142a \u015bcis\u0142\u0105 wsp\u00f3\u0142prac\u0119 z Vercelem (firma matka Next.js) i to w\u0142a\u015bnie Next.js jest aktualnie pionierem wdra\u017caj\u0105cym kolejne nowo\u015bci. Wydany pocz\u0105tkiem maja Next.js 13.4 stanowi w tej kwestii spory krok milowy, bo nowy router oparty o React Server Components staje si\u0119 oficjalnie rekomendowanym rozwi\u0105zaniem. Zanim przejdziemy do rzeczy, cofnijmy si\u0119 o dwa kroki i przypomnijmy czym s\u0105 React Server Components i jak dzia\u0142a nowy routing w Next.js.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16115,"width":660,"height":599,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Fr6j3ABWIAI2lSU-2.png\" alt=\"\" class=\"wp-image-16115\" width=\"660\" height=\"599\"\/><figcaption class=\"wp-element-caption\">\u0179r\u00f3d\u0142o: <a href=\"https:\/\/twitter.com\/thekitze\/status\/1638927506723033088\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/twitter.com\/thekitze\/status\/1638927506723033088<\/a><\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/Fr6j3ABWIAI2lSU-2.png\" alt=\"\" class=\"wp-image-16115\" width=\"660\" height=\"599\"\/><figcaption class=\"wp-element-caption\">\u0179r\u00f3d\u0142o: <a href=\"https:\/\/twitter.com\/thekitze\/status\/1638927506723033088\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/twitter.com\/thekitze\/status\/1638927506723033088<\/a><\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">React Server Components<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">React Server Components<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>React Server Components zosta\u0142y po raz pierwszy zaprezentowane przez Dana Abramova w grudniu 2020 roku. W swoich za\u0142o\u017ceniach koncepcja jest prosta -&nbsp;cz\u0119\u015b\u0107 z komponent\u00f3w b\u0119dzie renderowana po stronie klienta, a cz\u0119\u015b\u0107 po stronie serwera.  Dzi\u0119ki jasnej separacji mi\u0119dzy serwerem i przegl\u0105dark\u0105, serwerowe komponenty otrzymaj\u0105 dost\u0119p do nowych API i b\u0119d\u0105 mog\u0142y na przyk\u0142ad bezpo\u015brednio odpytywa\u0107 baz\u0119 danych, czy korzysta\u0107 z systemu plik\u00f3w. Deweloperzy b\u0119d\u0105 mogli r\u00f3wnie\u017c przesta\u0107 martwi\u0107 si\u0119 o rozmiar zale\u017cno\u015bci w serwerowych komponentach, gdy\u017c te nigdy nie b\u0119d\u0105 wysy\u0142ane do klienta.<\/p>\n","innerContent":["\n<p>React Server Components zosta\u0142y po raz pierwszy zaprezentowane przez Dana Abramova w grudniu 2020 roku. W swoich za\u0142o\u017ceniach koncepcja jest prosta -&nbsp;cz\u0119\u015b\u0107 z komponent\u00f3w b\u0119dzie renderowana po stronie klienta, a cz\u0119\u015b\u0107 po stronie serwera.  Dzi\u0119ki jasnej separacji mi\u0119dzy serwerem i przegl\u0105dark\u0105, serwerowe komponenty otrzymaj\u0105 dost\u0119p do nowych API i b\u0119d\u0105 mog\u0142y na przyk\u0142ad bezpo\u015brednio odpytywa\u0107 baz\u0119 danych, czy korzysta\u0107 z systemu plik\u00f3w. Deweloperzy b\u0119d\u0105 mogli r\u00f3wnie\u017c przesta\u0107 martwi\u0107 si\u0119 o rozmiar zale\u017cno\u015bci w serwerowych komponentach, gdy\u017c te nigdy nie b\u0119d\u0105 wysy\u0142ane do klienta.<\/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\">\"use server\"\n\nimport db from 'db'; \n\/\/This is interactive client component\nimport NoteEditor from 'NoteEditor'; \n\nasync function Note(props) {\n  const {id, isEditing} = props;\n  const note = await db.posts.get(id);\n  \n  return (\n    &lt;div>\n      &lt;h1>{note.title}&lt;\/h1>\n      &lt;section>{note.body}&lt;\/section>\n      {isEditing \n        ? &lt;NoteEditor note={note} \/>\n        : null\n      }\n    &lt;\/div>\n  );\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">\"use server\"\n\nimport db from 'db'; \n\/\/This is interactive client component\nimport NoteEditor from 'NoteEditor'; \n\nasync function Note(props) {\n  const {id, isEditing} = props;\n  const note = await db.posts.get(id);\n  \n  return (\n    &lt;div>\n      &lt;h1>{note.title}&lt;\/h1>\n      &lt;section>{note.body}&lt;\/section>\n      {isEditing \n        ? &lt;NoteEditor note={note} \/>\n        : null\n      }\n    &lt;\/div>\n  );\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Architektura React Server Components r\u00f3\u017cni si\u0119 mocno od standardowego podej\u015bcia do renderowania po stronie serwera. Po pierwsze, w standardowym podej\u015bciu, serwer czeka, a\u017c ca\u0142a strona zostanie wyrenderowana. Oznacza to, \u017ce je\u015bli serwer potrzebuje wykona\u0107 powolne zapytanie, to ca\u0142a strona b\u0119dzie \u0142adowa\u0107 si\u0119 powoli. Przy wykorzystaniu React Server Components, szkielet aplikacji szybko trafia do przegl\u0105darki, a kolejne komponenty s\u0105 stopniowo strumieniowe w postaci pseudo HTMLa. Po drugie, w standardowym podej\u015bciu, framework po stronie klienta przejmuje kontrol\u0119 nad aplikacj\u0105, co skutkuje tym, \u017ce wszystkie komponenty by\u0107 przystosowane do dzia\u0142ania zar\u00f3wno po stronie klienta jak i serwera. W przypadku React Server Components kod komponent\u00f3w nigdy nie jest wysy\u0142any do klienta i renderowanie zawsze odbywa si\u0119 po stronie serwera.<\/p>\n","innerContent":["\n<p>Architektura React Server Components r\u00f3\u017cni si\u0119 mocno od standardowego podej\u015bcia do renderowania po stronie serwera. Po pierwsze, w standardowym podej\u015bciu, serwer czeka, a\u017c ca\u0142a strona zostanie wyrenderowana. Oznacza to, \u017ce je\u015bli serwer potrzebuje wykona\u0107 powolne zapytanie, to ca\u0142a strona b\u0119dzie \u0142adowa\u0107 si\u0119 powoli. Przy wykorzystaniu React Server Components, szkielet aplikacji szybko trafia do przegl\u0105darki, a kolejne komponenty s\u0105 stopniowo strumieniowe w postaci pseudo HTMLa. Po drugie, w standardowym podej\u015bciu, framework po stronie klienta przejmuje kontrol\u0119 nad aplikacj\u0105, co skutkuje tym, \u017ce wszystkie komponenty by\u0107 przystosowane do dzia\u0142ania zar\u00f3wno po stronie klienta jak i serwera. W przypadku React Server Components kod komponent\u00f3w nigdy nie jest wysy\u0142any do klienta i renderowanie zawsze odbywa si\u0119 po stronie serwera.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16120,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download.jpeg\" alt=\"\" class=\"wp-image-16120\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download.jpeg\" alt=\"\" class=\"wp-image-16120\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>React Server Components maj\u0105 te\u017c swoje ograniczenia. Po pierwsze, ze wzgl\u0119du na zupe\u0142nie inny cykl \u017cycia, nie mo\u017cna w nich wykorzystywa\u0107 hook\u00f3w <code>useState<\/code> i <code>useEffect<\/code>. Po drugie, mi\u0119dzy komponentami renderowanymi po stronie serwera i kliena nie mo\u017cemy przechodzi\u0107 ca\u0142kiem swobodnie. B\u0119d\u0105c bardziej precyzyjny, komponenty renderowane po stronie klienta nie mog\u0105 bezpo\u015brednio importowa\u0107 komponent\u00f3w renderowanych po stronie serwera. Mo\u017cliwe jest jedynie przekazanie takiego komponentu jako jeden z props\u00f3w. Pomimo tego, \u017ce na poz\u00f3r mo\u017ce si\u0119 to wydawa\u0107 sporym ograniczeniem, to w ostatecznym rozrachunku nie sprawia to wielu problem\u00f3w.<\/p>\n","innerContent":["\n<p>React Server Components maj\u0105 te\u017c swoje ograniczenia. Po pierwsze, ze wzgl\u0119du na zupe\u0142nie inny cykl \u017cycia, nie mo\u017cna w nich wykorzystywa\u0107 hook\u00f3w <code>useState<\/code> i <code>useEffect<\/code>. Po drugie, mi\u0119dzy komponentami renderowanymi po stronie serwera i kliena nie mo\u017cemy przechodzi\u0107 ca\u0142kiem swobodnie. B\u0119d\u0105c bardziej precyzyjny, komponenty renderowane po stronie klienta nie mog\u0105 bezpo\u015brednio importowa\u0107 komponent\u00f3w renderowanych po stronie serwera. Mo\u017cliwe jest jedynie przekazanie takiego komponentu jako jeden z props\u00f3w. Pomimo tego, \u017ce na poz\u00f3r mo\u017ce si\u0119 to wydawa\u0107 sporym ograniczeniem, to w ostatecznym rozrachunku nie sprawia to wielu problem\u00f3w.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Od 2020 roku, zesp\u00f3\u0142 React intensywnie pracuje nad rozwojem React Server Components. Po drodze zmieni\u0142 si\u0119 na przyk\u0142ad spos\u00f3b oznaczania komponent\u00f3w czy spos\u00f3b obs\u0142ugi asynchronicznych operacji. Po 3 latach intensywnego rozwoju, chyba doczekali\u015bmy si\u0119 w ko\u0144cu w miar\u0119 stabilnego API. Je\u015bli jeste\u015bcie g\u0142odni detali dotycz\u0105cy serwerowych komponent\u00f3w, to osobi\u015bcie polecam <a href=\"https:\/\/www.youtube.com\/watch?v=TQQPAU21ZUw\" target=\"_blank\" rel=\"noreferrer noopener\">oryginaln\u0105 prezentacj\u0119 Dana Abramova<\/a> i <a href=\"https:\/\/www.plasmic.app\/blog\/how-react-server-components-work\" target=\"_blank\" rel=\"noreferrer noopener\">\u015bwietny blog post z Plasmic Blog w detalach pokrywaj\u0105cy ten temat<\/a>.<\/p>\n","innerContent":["\n<p>Od 2020 roku, zesp\u00f3\u0142 React intensywnie pracuje nad rozwojem React Server Components. Po drodze zmieni\u0142 si\u0119 na przyk\u0142ad spos\u00f3b oznaczania komponent\u00f3w czy spos\u00f3b obs\u0142ugi asynchronicznych operacji. Po 3 latach intensywnego rozwoju, chyba doczekali\u015bmy si\u0119 w ko\u0144cu w miar\u0119 stabilnego API. Je\u015bli jeste\u015bcie g\u0142odni detali dotycz\u0105cy serwerowych komponent\u00f3w, to osobi\u015bcie polecam <a href=\"https:\/\/www.youtube.com\/watch?v=TQQPAU21ZUw\" target=\"_blank\" rel=\"noreferrer noopener\">oryginaln\u0105 prezentacj\u0119 Dana Abramova<\/a> i <a href=\"https:\/\/www.plasmic.app\/blog\/how-react-server-components-work\" target=\"_blank\" rel=\"noreferrer noopener\">\u015bwietny blog post z Plasmic Blog w detalach pokrywaj\u0105cy ten temat<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">Next.js Page Router<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Next.js Page Router<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wraz z Next.js 13 zaprezentowany zosta\u0142 nowy model routingu dla Next.js. Wprowadza\u0142 on sporo drobnych, aczkolwiek istotnych usprawnie\u0144. W\u015br\u00f3d nich znajdziemy mi\u0119dzy innymi natywne wsparcie dla zagnie\u017cd\u017conych szablon\u00f3w czy lepsz\u0105 obs\u0142ug\u0119 b\u0142\u0119d\u00f3w i \u0142adowania. Po\u015br\u00f3d nowo\u015bci najbardziej wybrzmiewa jednak fakt, \u017ce nowy router zbudowany zosta\u0142 w oparciu o React Server Components. Oznacza to, \u017ce wszystkie komponenty s\u0105 komponentami serwerowymi, a przysz\u0142o\u015b\u0107 Next.js \u015bci\u015ble zwi\u0105zana jest z przysz\u0142o\u015bci\u0105 React Server Components. Je\u015bli jeste\u015bcie ciekawi szczeg\u00f3\u0142\u00f3w na temat tego jak dzia\u0142a nowy Page Router, to <a href=\"https:\/\/vived.io\/the-future-is-now-next-js-13-frontend-weekly-vol-110\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">po\u015bwi\u0119cili\u015bmy temu tematowi wi\u0119kszo\u015b\u0107 jednej z edycji naszego raportu<\/a>.<\/p>\n","innerContent":["\n<p>Wraz z Next.js 13 zaprezentowany zosta\u0142 nowy model routingu dla Next.js. Wprowadza\u0142 on sporo drobnych, aczkolwiek istotnych usprawnie\u0144. W\u015br\u00f3d nich znajdziemy mi\u0119dzy innymi natywne wsparcie dla zagnie\u017cd\u017conych szablon\u00f3w czy lepsz\u0105 obs\u0142ug\u0119 b\u0142\u0119d\u00f3w i \u0142adowania. Po\u015br\u00f3d nowo\u015bci najbardziej wybrzmiewa jednak fakt, \u017ce nowy router zbudowany zosta\u0142 w oparciu o React Server Components. Oznacza to, \u017ce wszystkie komponenty s\u0105 komponentami serwerowymi, a przysz\u0142o\u015b\u0107 Next.js \u015bci\u015ble zwi\u0105zana jest z przysz\u0142o\u015bci\u0105 React Server Components. Je\u015bli jeste\u015bcie ciekawi szczeg\u00f3\u0142\u00f3w na temat tego jak dzia\u0142a nowy Page Router, to <a href=\"https:\/\/vived.io\/the-future-is-now-next-js-13-frontend-weekly-vol-110\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">po\u015bwi\u0119cili\u015bmy temu tematowi wi\u0119kszo\u015b\u0107 jednej z edycji naszego raportu<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16118,"width":437,"height":661,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1OEFTQKz1bXF4p1p6tcbf6ANIT06c3bdWWuiK9X5wYBk.png\" alt=\"\" class=\"wp-image-16118\" width=\"437\" height=\"661\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1OEFTQKz1bXF4p1p6tcbf6ANIT06c3bdWWuiK9X5wYBk.png\" alt=\"\" class=\"wp-image-16118\" width=\"437\" height=\"661\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">Next.js 13.4, Page Router i React Canary<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Next.js 13.4, Page Router i React Canary<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli odpowiednio po\u0142\u0105czyli\u015bcie kropki, to zapewne teraz drapiecie si\u0119 po g\u0142owie - Jak to jest, \u017ce Next.js domy\u015blnie zaleca stosowanie React Server Components, je\u015bli nie s\u0105 one jeszcze stabiln\u0105 funkcjonalno\u015bci\u0105? Jest to mo\u017cliwe dzi\u0119ki nowemu kana\u0142owi releas\u00f3w na jakie zdecydowa\u0142 si\u0119 zesp\u00f3\u0142 Reacta. Do wersji Canary trafia\u0107 b\u0119d\u0105 funkcjonalno\u015bci o stabilnym API, kt\u00f3re wydane zostan\u0105 wraz z kolejn\u0105 wi\u0119ksz\u0105 wersj\u0105 Reacta. Dlaczego zesp\u00f3\u0142 nie zdecydowa\u0142 si\u0119 po prostu cz\u0119\u015bciej publikowa\u0107 kolejnych wersji biblioteki? Czasami zdarza si\u0119, \u017ce release zblokowany jest na kilku brakuj\u0105cych funkcjonalno\u015bciach kompletnie nie zwi\u0105zanych z ustabilizowanym w\u0142a\u015bnie API. Dzi\u0119ki nowemu kana\u0142owi releas\u00f3w, spo\u0142eczno\u015b\u0107 szybciej b\u0119dzie mog\u0142a testowa\u0107 nowe funkcjonalno\u015bci, r\u00f3wnocze\u015bnie nie martwi\u0105c si\u0119, \u017ce kolejna eksperymentalna wersja ca\u0142kowicie zepsuje ich aplikacje.<\/p>\n","innerContent":["\n<p>Je\u015bli odpowiednio po\u0142\u0105czyli\u015bcie kropki, to zapewne teraz drapiecie si\u0119 po g\u0142owie - Jak to jest, \u017ce Next.js domy\u015blnie zaleca stosowanie React Server Components, je\u015bli nie s\u0105 one jeszcze stabiln\u0105 funkcjonalno\u015bci\u0105? Jest to mo\u017cliwe dzi\u0119ki nowemu kana\u0142owi releas\u00f3w na jakie zdecydowa\u0142 si\u0119 zesp\u00f3\u0142 Reacta. Do wersji Canary trafia\u0107 b\u0119d\u0105 funkcjonalno\u015bci o stabilnym API, kt\u00f3re wydane zostan\u0105 wraz z kolejn\u0105 wi\u0119ksz\u0105 wersj\u0105 Reacta. Dlaczego zesp\u00f3\u0142 nie zdecydowa\u0142 si\u0119 po prostu cz\u0119\u015bciej publikowa\u0107 kolejnych wersji biblioteki? Czasami zdarza si\u0119, \u017ce release zblokowany jest na kilku brakuj\u0105cych funkcjonalno\u015bciach kompletnie nie zwi\u0105zanych z ustabilizowanym w\u0142a\u015bnie API. Dzi\u0119ki nowemu kana\u0142owi releas\u00f3w, spo\u0142eczno\u015b\u0107 szybciej b\u0119dzie mog\u0142a testowa\u0107 nowe funkcjonalno\u015bci, r\u00f3wnocze\u015bnie nie martwi\u0105c si\u0119, \u017ce kolejna eksperymentalna wersja ca\u0142kowicie zepsuje ich aplikacje.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">React Server Actions<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">React Server Actions<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16108,"width":596,"height":596,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/EXENDo-UEAMlhhW-1-1024x1024.jpeg\" alt=\"\" class=\"wp-image-16108\" width=\"596\" height=\"596\"\/><figcaption class=\"wp-element-caption\">\u0179r\u00f3d\u0142o: <a href=\"https:\/\/twitter.com\/markdalgleish\/status\/1256800146118959109\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/twitter.com\/markdalgleish\/status\/1256800146118959109<\/a><\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/EXENDo-UEAMlhhW-1-1024x1024.jpeg\" alt=\"\" class=\"wp-image-16108\" width=\"596\" height=\"596\"\/><figcaption class=\"wp-element-caption\">\u0179r\u00f3d\u0142o: <a href=\"https:\/\/twitter.com\/markdalgleish\/status\/1256800146118959109\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/twitter.com\/markdalgleish\/status\/1256800146118959109<\/a><\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli regularnie czytacie nasze przegl\u0105dy, to na pewno widzieli\u015bcie ju\u017c nie jeden mem na temat tego jak React upodabnia sie do PHP. No c\u00f3\u017c, wraz z Next.js 13.4 poczyniony zosta\u0142 kolejny krok w tym kierunku. React Server Actions umo\u017cliwiaj\u0105 wywo\u0142anie funkcji na serwerze i ca\u0142kowicie ukrywaj\u0105 przed programist\u0105 warstw\u0119 komunikacji(innymi stare dobre Remote Protocol Call). Wszystko co musimy zrobi\u0107, to zacz\u0105\u0107 nasz\u0105 funkcj\u0119 od <code>'use server;<\/code> i voil\u00e0 - kod b\u0119dzie wykonywany po stronie serwera i nigdy nie trafi do klienta.<\/p>\n","innerContent":["\n<p>Je\u015bli regularnie czytacie nasze przegl\u0105dy, to na pewno widzieli\u015bcie ju\u017c nie jeden mem na temat tego jak React upodabnia sie do PHP. No c\u00f3\u017c, wraz z Next.js 13.4 poczyniony zosta\u0142 kolejny krok w tym kierunku. React Server Actions umo\u017cliwiaj\u0105 wywo\u0142anie funkcji na serwerze i ca\u0142kowicie ukrywaj\u0105 przed programist\u0105 warstw\u0119 komunikacji(innymi stare dobre Remote Protocol Call). Wszystko co musimy zrobi\u0107, to zacz\u0105\u0107 nasz\u0105 funkcj\u0119 od <code>'use server;<\/code> i voil\u00e0 - kod b\u0119dzie wykonywany po stronie serwera i nigdy nie trafi do klienta.<\/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\">import { cookies } from 'next\/headers';\n \nexport default function AddToCart({ productId }) {\n  async function addItem(data) {\n    'use server';\n    const cartId = cookies().get('cartId')?.value;\n    await saveToDb({ cartId, data });\n  }\n \n  return (\n    &lt;form action={addItem}>\n      &lt;button type=\"submit\">Add to Cart&lt;\/button>\n    &lt;\/form>\n  );\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">import { cookies } from 'next\/headers';\n \nexport default function AddToCart({ productId }) {\n  async function addItem(data) {\n    'use server';\n    const cartId = cookies().get('cartId')?.value;\n    await saveToDb({ cartId, data });\n  }\n \n  return (\n    &lt;form action={addItem}>\n      &lt;button type=\"submit\">Add to Cart&lt;\/button>\n    &lt;\/form>\n  );\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Co istotne, React Server Actions maj\u0105 swoje ograniczenia. Po pierwsze, funkcja tego typu musi by\u0107 asynchroniczna. Po drugie, funkcj\u0119 tak\u0105 mo\u017cemy przekaza\u0107 tylko do formularza, albo do hooka <code>startTransition<\/code>.  Co ciekawe, w tej pierwszej opcji formularz b\u0119dzie dzia\u0142a\u0142 nawet kiedy klient wy\u0142\u0105czy po swojej stronie obs\u0142ug\u0119 JavaScript.<\/p>\n","innerContent":["\n<p>Co istotne, React Server Actions maj\u0105 swoje ograniczenia. Po pierwsze, funkcja tego typu musi by\u0107 asynchroniczna. Po drugie, funkcj\u0119 tak\u0105 mo\u017cemy przekaza\u0107 tylko do formularza, albo do hooka <code>startTransition<\/code>.  Co ciekawe, w tej pierwszej opcji formularz b\u0119dzie dzia\u0142a\u0142 nawet kiedy klient wy\u0142\u0105czy po swojej stronie obs\u0142ug\u0119 JavaScript.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>React Server Actions zdecydowanie nie s\u0105 pierwszym podej\u015bciem do RPC w JavaScript. S\u0105 natomiast pierwsz\u0105 implementacj\u0105 zintegrowan\u0105 w frontendowy framework. Je\u015bli uda im si\u0119 opu\u015bci\u0107 wersj\u0119 alpha, to na pewno stan\u0105 si\u0119 ciekawym rozszerzeniem dla React Server Components.  <\/p>\n","innerContent":["\n<p>React Server Actions zdecydowanie nie s\u0105 pierwszym podej\u015bciem do RPC w JavaScript. S\u0105 natomiast pierwsz\u0105 implementacj\u0105 zintegrowan\u0105 w frontendowy framework. Je\u015bli uda im si\u0119 opu\u015bci\u0107 wersj\u0119 alpha, to na pewno stan\u0105 si\u0119 ciekawym rozszerzeniem dla React Server Components.  <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16170,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-5.jpeg\" alt=\"\" class=\"wp-image-16170\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-5.jpeg\" alt=\"\" class=\"wp-image-16170\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">Angular 16<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">Angular 16<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nowe wersje Angulara pojawiaj\u0105 si\u0119 punktualnie co p\u00f3\u0142 roku niczym japo\u0144ski Shinkansen i w maju \u015bwiat\u0142o dzienne ujrza\u0142 Angular 16. Patrz\u0105c na kilka ostatnich wersji frameworka, nie spos\u00f3b nie zauwa\u017cy\u0107, \u017ce jego rozw\u00f3j znacznie przy\u015bpieszy\u0142. Co wa\u017cne, zesp\u00f3\u0142 stoj\u0105cy za frameworkiem wreszcie zacz\u0105\u0142 wys\u0142uchiwa\u0107 problem\u00f3w spo\u0142eczno\u015bci. Z wersji na wersj\u0119 rozwi\u0105zywane s\u0105 teraz najwi\u0119ksze bol\u0105czki deweloper\u00f3w - i to nawet takie, kt\u00f3re towarzyszy\u0142y frameworkowi ju\u017c od zarania dziej\u00f3w. Angular 16 kontynuuje ten trend i proponuje rewolucj\u0119 jakiej Angular jeszcze nie widzia\u0142.<\/p>\n","innerContent":["\n<p>Nowe wersje Angulara pojawiaj\u0105 si\u0119 punktualnie co p\u00f3\u0142 roku niczym japo\u0144ski Shinkansen i w maju \u015bwiat\u0142o dzienne ujrza\u0142 Angular 16. Patrz\u0105c na kilka ostatnich wersji frameworka, nie spos\u00f3b nie zauwa\u017cy\u0107, \u017ce jego rozw\u00f3j znacznie przy\u015bpieszy\u0142. Co wa\u017cne, zesp\u00f3\u0142 stoj\u0105cy za frameworkiem wreszcie zacz\u0105\u0142 wys\u0142uchiwa\u0107 problem\u00f3w spo\u0142eczno\u015bci. Z wersji na wersj\u0119 rozwi\u0105zywane s\u0105 teraz najwi\u0119ksze bol\u0105czki deweloper\u00f3w - i to nawet takie, kt\u00f3re towarzyszy\u0142y frameworkowi ju\u017c od zarania dziej\u00f3w. Angular 16 kontynuuje ten trend i proponuje rewolucj\u0119 jakiej Angular jeszcze nie widzia\u0142.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16125,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/180-Klb_j6w_oWgtDoxUOfMqWfVOlnfukMGJIBJET1Ks.png\" alt=\"\" class=\"wp-image-16125\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/180-Klb_j6w_oWgtDoxUOfMqWfVOlnfukMGJIBJET1Ks.png\" alt=\"\" class=\"wp-image-16125\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">Signals<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Signals<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Angular zosta\u0142 zbudowany na fundamencie stosunkowo niewielkiej biblioteki <code>zone.js<\/code>. Jest ona odpowiedzialna za monkey-patching asynchronicznych metod przegl\u0105darki. Za ka\u017cdym razem kiedy kt\u00f3rakolwiek z takich metod jest wywo\u0142ywana, <code>zone.js<\/code> powiadamia o tym Angulara, a ten stara si\u0119 okre\u015bli\u0107 czy stan aplikacji uleg\u0142 zmianie. Dzi\u0119ki takiej architekturze, Angular w stosunkowo \"magiczny\" spos\u00f3b potrafi od\u015bwie\u017ca\u0107 warto\u015b\u0107 zmiennych w interfejsie u\u017cytkownika.<\/p>\n","innerContent":["\n<p>Angular zosta\u0142 zbudowany na fundamencie stosunkowo niewielkiej biblioteki <code>zone.js<\/code>. Jest ona odpowiedzialna za monkey-patching asynchronicznych metod przegl\u0105darki. Za ka\u017cdym razem kiedy kt\u00f3rakolwiek z takich metod jest wywo\u0142ywana, <code>zone.js<\/code> powiadamia o tym Angulara, a ten stara si\u0119 okre\u015bli\u0107 czy stan aplikacji uleg\u0142 zmianie. Dzi\u0119ki takiej architekturze, Angular w stosunkowo \"magiczny\" spos\u00f3b potrafi od\u015bwie\u017ca\u0107 warto\u015b\u0107 zmiennych w interfejsie u\u017cytkownika.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16127,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-2.jpeg\" alt=\"\" class=\"wp-image-16127\"\/><figcaption class=\"wp-element-caption\">Based on famous: <a href=\"https:\/\/xkcd.com\/2347\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/xkcd.com\/2347\/<\/a><\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-2.jpeg\" alt=\"\" class=\"wp-image-16127\"\/><figcaption class=\"wp-element-caption\">Based on famous: <a href=\"https:\/\/xkcd.com\/2347\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/xkcd.com\/2347\/<\/a><\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jak to zwykle bywa, magiczne rozwi\u0105zania maj\u0105 r\u00f3wnie\u017c swoj\u0105 ciemn\u0105 stron\u0119. Aby okre\u015bli\u0107 co zmieni\u0142o si\u0119 w interfejsie u\u017cytkownika, Angular musi wykonywa\u0107 ci\u0119\u017ck\u0105 i skomplikowan\u0105 operacj\u0119 Change Detection. Je\u015bli kiedykolwiek musieli\u015bcie optymalizowa\u0107 Angularowe komponenty albo natkneli\u015bcie si\u0119 na b\u0142\u0119dy zwi\u0105zane z od\u015bwie\u017caniem interfejsu, na pewno wiecie do czego zmierzam. Magia Angulara potrafi ca\u0142kiem szybko doprowadzi\u0107 do problem\u00f3w z wydajno\u015bci\u0105 i debugowaniem. <\/p>\n","innerContent":["\n<p>Jak to zwykle bywa, magiczne rozwi\u0105zania maj\u0105 r\u00f3wnie\u017c swoj\u0105 ciemn\u0105 stron\u0119. Aby okre\u015bli\u0107 co zmieni\u0142o si\u0119 w interfejsie u\u017cytkownika, Angular musi wykonywa\u0107 ci\u0119\u017ck\u0105 i skomplikowan\u0105 operacj\u0119 Change Detection. Je\u015bli kiedykolwiek musieli\u015bcie optymalizowa\u0107 Angularowe komponenty albo natkneli\u015bcie si\u0119 na b\u0142\u0119dy zwi\u0105zane z od\u015bwie\u017caniem interfejsu, na pewno wiecie do czego zmierzam. Magia Angulara potrafi ca\u0142kiem szybko doprowadzi\u0107 do problem\u00f3w z wydajno\u015bci\u0105 i debugowaniem. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Na przestrzeni lat deweloperzy Angulara nauczyli si\u0119 lawirowa\u0107 mi\u0119dzy ograniczeniami <code>zone.js<\/code> i <code>ChangeDetection<\/code>, ale wci\u0105\u017c czuli, \u017ce da si\u0119 to zrobi\u0107 lepiej. Tym lepiej maj\u0105 by\u0107 zaprezentowane w Angularze 16 Signals, kt\u00f3re s\u0105 pierwszym krokiem w kierunku pozbycia si\u0119 <code>zone.js<\/code>. Nie nast\u0105pi to prawdopodobnie szybko (o ile w og\u00f3le - w ko\u0144cu aplikacji i bibliotek bazuj\u0105cych na zachowaniu <code>zone.js<\/code> jest sporo...). Wydaje si\u0119 jednak, \u017ce pod-drzewa komponent\u00f3w pozbawione <code>zone.js<\/code> s\u0105 ju\u017c tu\u017c za rogiem.<\/p>\n","innerContent":["\n<p>Na przestrzeni lat deweloperzy Angulara nauczyli si\u0119 lawirowa\u0107 mi\u0119dzy ograniczeniami <code>zone.js<\/code> i <code>ChangeDetection<\/code>, ale wci\u0105\u017c czuli, \u017ce da si\u0119 to zrobi\u0107 lepiej. Tym lepiej maj\u0105 by\u0107 zaprezentowane w Angularze 16 Signals, kt\u00f3re s\u0105 pierwszym krokiem w kierunku pozbycia si\u0119 <code>zone.js<\/code>. Nie nast\u0105pi to prawdopodobnie szybko (o ile w og\u00f3le - w ko\u0144cu aplikacji i bibliotek bazuj\u0105cych na zachowaniu <code>zone.js<\/code> jest sporo...). Wydaje si\u0119 jednak, \u017ce pod-drzewa komponent\u00f3w pozbawione <code>zone.js<\/code> s\u0105 ju\u017c tu\u017c za rogiem.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wr\u00f3\u0107my jednak do clue dzisiejszego tematu i przyjrzymy si\u0119 czym tak naprawd\u0119 s\u0105 sygna\u0142y. Cytuj\u0105c za dokumentacj\u0105 Angulara: sygna\u0142 jest opakowaniem wok\u00f3\u0142 warto\u015bci, kt\u00f3re jest w stanie powiadomi\u0107 zainteresowanych konsument\u00f3w, gdy ta warto\u015b\u0107 ulega zmianie. Dla wszystkich operuj\u0105cych na co dzie\u0144 w Angularze i RxJS ja\u015bniejsza  mo\u017ce by\u0107 analogia do <code>BehaviourSubject<\/code>, gdy\u017c dok\u0142adnie tym w lekkim uproszczeniu s\u0105 sygna\u0142y.<\/p>\n","innerContent":["\n<p>Wr\u00f3\u0107my jednak do clue dzisiejszego tematu i przyjrzymy si\u0119 czym tak naprawd\u0119 s\u0105 sygna\u0142y. Cytuj\u0105c za dokumentacj\u0105 Angulara: sygna\u0142 jest opakowaniem wok\u00f3\u0142 warto\u015bci, kt\u00f3re jest w stanie powiadomi\u0107 zainteresowanych konsument\u00f3w, gdy ta warto\u015b\u0107 ulega zmianie. Dla wszystkich operuj\u0105cych na co dzie\u0144 w Angularze i RxJS ja\u015bniejsza  mo\u017ce by\u0107 analogia do <code>BehaviourSubject<\/code>, gdy\u017c dok\u0142adnie tym w lekkim uproszczeniu s\u0105 sygna\u0142y.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Sygna\u0142y tworzone s\u0105 za pomoc\u0105 factory method&nbsp;<code>signal()<\/code>&nbsp;przyjmuj\u0105cej warto\u015b\u0107 pocz\u0105tkow\u0105 jako parametr. Sygna\u0142y mog\u0105 by\u0107 komponowane za pomoc\u0105 metody&nbsp;<code>computed<\/code>(). Mo\u017cliwe jest r\u00f3wnie\u017c wywo\u0142ywanie efekt\u00f3w ubocznych, gdy warto\u015b\u0107 sygna\u0142u si\u0119 zmienia, rejestruj\u0105c odpowiedni callback w metodzie&nbsp;<code>effect()<\/code>. W dowolnym momencie mo\u017cemy odczyta\u0107 warto\u015b\u0107 sygna\u0142u wywo\u0142uj\u0105c go jak funkcj\u0119. Sygna\u0142y mog\u0105 by\u0107 aktualizowane za pomoc\u0105 metod&nbsp;<code>set<\/code>(),&nbsp;<code>update<\/code>() i&nbsp;<code>mutate<\/code>(). W du\u017cym uproszczeniu, to wszystko co musicie wiedzie\u0107 o sygna\u0142ach. Je\u015bli jeste\u015bcie natomiast ciekawi jak dzia\u0142aj\u0105 poszczeg\u00f3lne bebechy, to po\u015bwi\u0119cili\u015bmy temu tematowi <a href=\"https:\/\/vived.io\/pl\/angular-signals-w-10-minut-frontend-weekly-vol-132\/\" target=\"_blank\" rel=\"noreferrer noopener\">ca\u0142\u0105 132 edycj\u0119 naszego przegl\u0105du<\/a>.<\/p>\n","innerContent":["\n<p>Sygna\u0142y tworzone s\u0105 za pomoc\u0105 factory method&nbsp;<code>signal()<\/code>&nbsp;przyjmuj\u0105cej warto\u015b\u0107 pocz\u0105tkow\u0105 jako parametr. Sygna\u0142y mog\u0105 by\u0107 komponowane za pomoc\u0105 metody&nbsp;<code>computed<\/code>(). Mo\u017cliwe jest r\u00f3wnie\u017c wywo\u0142ywanie efekt\u00f3w ubocznych, gdy warto\u015b\u0107 sygna\u0142u si\u0119 zmienia, rejestruj\u0105c odpowiedni callback w metodzie&nbsp;<code>effect()<\/code>. W dowolnym momencie mo\u017cemy odczyta\u0107 warto\u015b\u0107 sygna\u0142u wywo\u0142uj\u0105c go jak funkcj\u0119. Sygna\u0142y mog\u0105 by\u0107 aktualizowane za pomoc\u0105 metod&nbsp;<code>set<\/code>(),&nbsp;<code>update<\/code>() i&nbsp;<code>mutate<\/code>(). W du\u017cym uproszczeniu, to wszystko co musicie wiedzie\u0107 o sygna\u0142ach. Je\u015bli jeste\u015bcie natomiast ciekawi jak dzia\u0142aj\u0105 poszczeg\u00f3lne bebechy, to po\u015bwi\u0119cili\u015bmy temu tematowi <a href=\"https:\/\/vived.io\/pl\/angular-signals-w-10-minut-frontend-weekly-vol-132\/\" target=\"_blank\" rel=\"noreferrer noopener\">ca\u0142\u0105 132 edycj\u0119 naszego przegl\u0105du<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"prismatic\/blocks","attrs":{"language":"typescript"},"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">@Component({\n  selector: 'my-app',\n  standalone: true,\n  template: `\n    {{ fullName() }} &lt;button (click)=\"setName('John')\">Click&lt;\/button>\n  `,\n})\nexport class App {\n  firstName = signal('Jane');\n  lastName = signal('Doe');\n  fullName = computed(() => `${this.firstName()} ${this.lastName()}`);\n\n  constructor() {\n    effect(() => console.log('Name changed:', this.fullName()));\n  }\n\n  setName(newName: string) {\n    this.firstName.set(newName);\n  }\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">@Component({\n  selector: 'my-app',\n  standalone: true,\n  template: `\n    {{ fullName() }} &lt;button (click)=\"setName('John')\">Click&lt;\/button>\n  `,\n})\nexport class App {\n  firstName = signal('Jane');\n  lastName = signal('Doe');\n  fullName = computed(() => `${this.firstName()} ${this.lastName()}`);\n\n  constructor() {\n    effect(() => console.log('Name changed:', this.fullName()));\n  }\n\n  setName(newName: string) {\n    this.firstName.set(newName);\n  }\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Opr\u00f3cz nowego prymitywu zesp\u00f3\u0142 Angulara pracuje te\u017c nad szeregiem wbudowanych w framework integracji. Dostaniemy wi\u0119c narz\u0119dzia do wygodnej integracji z sygna\u0142\u00f3w z strumieniami, API frameworka zwracaj\u0105ce sygna\u0142y zamiast strumieni i reaktywne inputy oparte o sygna\u0142y. Szczeg\u00f3lnie te ostatnie wygl\u0105daj\u0105 wyj\u0105tkowo ciekawie.<\/p>\n","innerContent":["\n<p>Opr\u00f3cz nowego prymitywu zesp\u00f3\u0142 Angulara pracuje te\u017c nad szeregiem wbudowanych w framework integracji. Dostaniemy wi\u0119c narz\u0119dzia do wygodnej integracji z sygna\u0142\u00f3w z strumieniami, API frameworka zwracaj\u0105ce sygna\u0142y zamiast strumieni i reaktywne inputy oparte o sygna\u0142y. Szczeg\u00f3lnie te ostatnie wygl\u0105daj\u0105 wyj\u0105tkowo ciekawie.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Skoro <code>Signals<\/code> zachowuj\u0105 si\u0119 bardzo podobnie do <code>BehaviurSubject<\/code>, to czy Angular na pewno potrzebuje kolejnego prymitywu zintegrowanego z frameworkiem? Po pierwsze <code>Signal<\/code> to du\u017co prostsza abstrakcja ni\u017c <code>Observable<\/code>. \u017beby sprawnie operowa\u0107 <code>RxJS<\/code> musimy pozna\u0107 ca\u0142y szereg skomplikowanych zagadnie\u0144 takich jak zimne i gor\u0105ce strumienie, asynchroniczno\u015b\u0107 w JavaScript czy ponad 100 dost\u0119pnych w RxJS operator\u00f3w. Po drugie, wszystkie strumienie naturalnie grawituj\u0105 w kierunku zimnych strumieni (wystarczy na dowolnym <code>BehaviourSubject<\/code> zastosowa\u0107 operator <code>map<\/code>). Sprawia to, \u017ce nigdy nie mo\u017cemy by\u0107 pewni, \u017ce subskrypcja do strumienia synchronicznie zwr\u00f3ci warto\u015b\u0107. W efekcie nasze aplikacje zalane s\u0105 zb\u0119dnym i powtarzalnym kodem. Podsumowuj\u0105c, RxJS sprawdza si\u0119 \u015bwietnie, gdy potrzebujemy modelowa\u0107 z\u0142o\u017cone zdarzenia dziej\u0105ce si\u0119 na przestrzeni czasu, takie jak limitowanie zapyta\u0144 do backendu czy agregowanie klikni\u0119\u0107 myszk\u0105. Je\u015bli chodzi o zarz\u0105dzanie stanem komponent\u00f3w i aplikacji, RxJS&nbsp;ma wi\u0119cej wad ni\u017c zalet.<\/p>\n","innerContent":["\n<p>Skoro <code>Signals<\/code> zachowuj\u0105 si\u0119 bardzo podobnie do <code>BehaviurSubject<\/code>, to czy Angular na pewno potrzebuje kolejnego prymitywu zintegrowanego z frameworkiem? Po pierwsze <code>Signal<\/code> to du\u017co prostsza abstrakcja ni\u017c <code>Observable<\/code>. \u017beby sprawnie operowa\u0107 <code>RxJS<\/code> musimy pozna\u0107 ca\u0142y szereg skomplikowanych zagadnie\u0144 takich jak zimne i gor\u0105ce strumienie, asynchroniczno\u015b\u0107 w JavaScript czy ponad 100 dost\u0119pnych w RxJS operator\u00f3w. Po drugie, wszystkie strumienie naturalnie grawituj\u0105 w kierunku zimnych strumieni (wystarczy na dowolnym <code>BehaviourSubject<\/code> zastosowa\u0107 operator <code>map<\/code>). Sprawia to, \u017ce nigdy nie mo\u017cemy by\u0107 pewni, \u017ce subskrypcja do strumienia synchronicznie zwr\u00f3ci warto\u015b\u0107. W efekcie nasze aplikacje zalane s\u0105 zb\u0119dnym i powtarzalnym kodem. Podsumowuj\u0105c, RxJS sprawdza si\u0119 \u015bwietnie, gdy potrzebujemy modelowa\u0107 z\u0142o\u017cone zdarzenia dziej\u0105ce si\u0119 na przestrzeni czasu, takie jak limitowanie zapyta\u0144 do backendu czy agregowanie klikni\u0119\u0107 myszk\u0105. Je\u015bli chodzi o zarz\u0105dzanie stanem komponent\u00f3w i aplikacji, RxJS&nbsp;ma wi\u0119cej wad ni\u017c zalet.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16129,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1HBUIJu3n1kXwERfyTxKSfHqgAJ7VolAPwt5fPpPgUGw.png\" alt=\"\" class=\"wp-image-16129\"\/><figcaption class=\"wp-element-caption\">\u0179r\u00f3d\u0142o: <a href=\"https:\/\/twitter.com\/t3dotgg\/status\/1626393874393595907\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/twitter.com\/t3dotgg\/status\/1626393874393595907\/<\/a><\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1HBUIJu3n1kXwERfyTxKSfHqgAJ7VolAPwt5fPpPgUGw.png\" alt=\"\" class=\"wp-image-16129\"\/><figcaption class=\"wp-element-caption\">\u0179r\u00f3d\u0142o: <a href=\"https:\/\/twitter.com\/t3dotgg\/status\/1626393874393595907\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/twitter.com\/t3dotgg\/status\/1626393874393595907\/<\/a><\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">Non-Destructive Hydration<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Non-Destructive Hydration<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Hydracja to proces podczas kt\u00f3rego wyrenderowany na serwerze HTML jest przejmowany przez framework po stronie klienta. Wi\u0119kszo\u015b\u0107 framework\u00f3w w trakcie tego procesu pod\u0142\u0105cza listenery do istniej\u0105cych w\u0119z\u0142\u00f3w DOM. Do wersji 16, Angular zamiast wykorzystywa\u0107 istniej\u0105c\u0105 struktur\u0119 DOM, bazowa\u0142 w ca\u0142o\u015bci na strukturze wygenerowanej po stronie klienta. Jak \u0142atwo si\u0119 domy\u015bli\u0107, od czasu do czasu powodowa\u0142o to drobne glitche i nie by\u0142o najbardziej optymaln\u0105 strategi\u0105. Od najnowszej wersji, po ustawieniu odpowiedniej flagi, Angular po stronie klienta b\u0119dzie w stanie operowa\u0107 na strukturze HTML wyrenderowanej na serwerze.<\/p>\n","innerContent":["\n<p>Hydracja to proces podczas kt\u00f3rego wyrenderowany na serwerze HTML jest przejmowany przez framework po stronie klienta. Wi\u0119kszo\u015b\u0107 framework\u00f3w w trakcie tego procesu pod\u0142\u0105cza listenery do istniej\u0105cych w\u0119z\u0142\u00f3w DOM. Do wersji 16, Angular zamiast wykorzystywa\u0107 istniej\u0105c\u0105 struktur\u0119 DOM, bazowa\u0142 w ca\u0142o\u015bci na strukturze wygenerowanej po stronie klienta. Jak \u0142atwo si\u0119 domy\u015bli\u0107, od czasu do czasu powodowa\u0142o to drobne glitche i nie by\u0142o najbardziej optymaln\u0105 strategi\u0105. Od najnowszej wersji, po ustawieniu odpowiedniej flagi, Angular po stronie klienta b\u0119dzie w stanie operowa\u0107 na strukturze HTML wyrenderowanej na serwerze.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16131,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1sCeK-thDFHe49j3QU9ryfx9a0mviS7CtGKXl3xFdnP4.png\" alt=\"\" class=\"wp-image-16131\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1sCeK-thDFHe49j3QU9ryfx9a0mviS7CtGKXl3xFdnP4.png\" alt=\"\" class=\"wp-image-16131\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">Vite + ESBuild = Speed<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Vite + ESBuild = Speed<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli nigdy nie narzekali\u015bcie na powolne budowanie Angulara to... prawdopodobnie nigdy nie pracowali\u015bcie z du\u017cym projektem w Angularze. Ju\u017c od kilku wersji Angular wprowadza spore usprawnienia je\u015bli chodzi o czas uruchomienia serwera deweloperskiego. Angular 16 ca\u0142kowicie migruje serwer deweloperski na Vite + ESBuild. Z jednej strony usprawnienia wydajno\u015bci ciesz\u0105, z drugiej rozjazd mi\u0119dzy narz\u0119dziami wykorzystywanymi na produkcji (gdzie wci\u0105\u017c aplikacj\u0119 buduje webpack) i lokalnie troch\u0119 martwi. <\/p>\n","innerContent":["\n<p>Je\u015bli nigdy nie narzekali\u015bcie na powolne budowanie Angulara to... prawdopodobnie nigdy nie pracowali\u015bcie z du\u017cym projektem w Angularze. Ju\u017c od kilku wersji Angular wprowadza spore usprawnienia je\u015bli chodzi o czas uruchomienia serwera deweloperskiego. Angular 16 ca\u0142kowicie migruje serwer deweloperski na Vite + ESBuild. Z jednej strony usprawnienia wydajno\u015bci ciesz\u0105, z drugiej rozjazd mi\u0119dzy narz\u0119dziami wykorzystywanymi na produkcji (gdzie wci\u0105\u017c aplikacj\u0119 buduje webpack) i lokalnie troch\u0119 martwi. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16136,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1z9-8Vy3KvXzZtFYKAGfHBfpKopj15O2anY8QxH3vsy0-1.png\" alt=\"\" class=\"wp-image-16136\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/1z9-8Vy3KvXzZtFYKAGfHBfpKopj15O2anY8QxH3vsy0-1.png\" alt=\"\" class=\"wp-image-16136\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">Vue 3.3<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">Vue 3.3<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Na Vue 3.3 czekali\u015bmy od dawna. Ju\u017c <a href=\"https:\/\/vived.io\/javascript-wrapped-2022-frontend-weekly-vol-119\/\" target=\"_blank\" rel=\"noreferrer noopener\">w naszym grudniowym podsumowaniu roku<\/a> pisali\u015bmy, \u017ce kolejny Vue uka\u017ce si\u0119 za kilka tygodni. Po drodze zesp\u00f3\u0142 dowodzony przez Evana You napotka\u0142 sporo perturbacji i z stycznia zrobi\u0142 si\u0119 nagle maj. Nie dziwi wiec, \u017ce jednym z celi zespo\u0142u na kolejne miesi\u0105ce jest regularne dowo\u017cenie mniejszych, inkrementalnych wyda\u0144. Czas poka\u017ce, czy cel uda si\u0119 spe\u0142ni\u0107, ale zgodnie z zapowiedziami Vue 3.4 ma ukaza\u0107 si\u0119 najp\u00f3\u017aniej za 6 miesi\u0119cy.<\/p>\n","innerContent":["\n<p>Na Vue 3.3 czekali\u015bmy od dawna. Ju\u017c <a href=\"https:\/\/vived.io\/javascript-wrapped-2022-frontend-weekly-vol-119\/\" target=\"_blank\" rel=\"noreferrer noopener\">w naszym grudniowym podsumowaniu roku<\/a> pisali\u015bmy, \u017ce kolejny Vue uka\u017ce si\u0119 za kilka tygodni. Po drodze zesp\u00f3\u0142 dowodzony przez Evana You napotka\u0142 sporo perturbacji i z stycznia zrobi\u0142 si\u0119 nagle maj. Nie dziwi wiec, \u017ce jednym z celi zespo\u0142u na kolejne miesi\u0105ce jest regularne dowo\u017cenie mniejszych, inkrementalnych wyda\u0144. Czas poka\u017ce, czy cel uda si\u0119 spe\u0142ni\u0107, ale zgodnie z zapowiedziami Vue 3.4 ma ukaza\u0107 si\u0119 najp\u00f3\u017aniej za 6 miesi\u0119cy.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16148,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-4.jpeg\" alt=\"\" class=\"wp-image-16148\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-4.jpeg\" alt=\"\" class=\"wp-image-16148\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">TypeScript, TypeScript, TypeScript<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">TypeScript, TypeScript, TypeScript<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Motywem przewodnim Vue 3.3 jest lepsza integracja z TypeScript. Zacznijmy od wsparcia z\u0142o\u017conych typ\u00f3w w funkcjach <code>defineProps<\/code> i <code>defineEmits<\/code>. Je\u015bli nigdy nie korzystali\u015bcie z Vue, to funkcje te s\u0142u\u017c\u0105 do definiowania schematu wej\u015b\u0107 i wyj\u015b\u0107 z komponentu. Vue w procesie kompilacji wykorzystywa\u0142 typ danych przekazanych do generycznych metod, co ogranicza\u0142o zakres mo\u017cliwo\u015bci do prostych typ\u00f3w zdefiniowanych w tym samym pliku co komponent. Wraz z Vue 3.3 ograniczenia te znikaj\u0105 ca\u0142kowicie i do <code>defineProps<\/code> i <code>defineEmits<\/code> mo\u017cemy teraz przekazywa\u0107 dowolne typy - czy to importowane z innych plik\u00f3w, czy to Union Types, czy to zaawansowane potworki wykorzystuj\u0105ce Utility Types.<\/p>\n","innerContent":["\n<p>Motywem przewodnim Vue 3.3 jest lepsza integracja z TypeScript. Zacznijmy od wsparcia z\u0142o\u017conych typ\u00f3w w funkcjach <code>defineProps<\/code> i <code>defineEmits<\/code>. Je\u015bli nigdy nie korzystali\u015bcie z Vue, to funkcje te s\u0142u\u017c\u0105 do definiowania schematu wej\u015b\u0107 i wyj\u015b\u0107 z komponentu. Vue w procesie kompilacji wykorzystywa\u0142 typ danych przekazanych do generycznych metod, co ogranicza\u0142o zakres mo\u017cliwo\u015bci do prostych typ\u00f3w zdefiniowanych w tym samym pliku co komponent. Wraz z Vue 3.3 ograniczenia te znikaj\u0105 ca\u0142kowicie i do <code>defineProps<\/code> i <code>defineEmits<\/code> mo\u017cemy teraz przekazywa\u0107 dowolne typy - czy to importowane z innych plik\u00f3w, czy to Union Types, czy to zaawansowane potworki wykorzystuj\u0105ce Utility Types.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"prismatic\/blocks","attrs":{"language":"xml"},"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-xml\">&lt;script setup lang=\"ts\">\nimport type { Props } from '.\/foo'\n\n\/\/ imported + intersection type\ndefineProps&lt;Props &amp; { extraProp?: string }>()\n&lt;\/script><\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-xml\">&lt;script setup lang=\"ts\">\nimport type { Props } from '.\/foo'\n\n\/\/ imported + intersection type\ndefineProps&lt;Props &amp; { extraProp?: string }>()\n&lt;\/script><\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Kolejn\u0105 nowo\u015bci\u0105 w Vue 3.3 s\u0105 generyczne komponenty. Pr\u00f3bowa\u0142em dogrzeba\u0107 si\u0119 do informacji, w jaki spos\u00f3b deweloperzy Vue radzili sobie z generycznymi komponentami do tej pory. Okazuje si\u0119, \u017ce albo rezygnowali oni ca\u0142kowicie ze sprawdzania typ\u00f3w, albo <a href=\"https:\/\/logaretm.com\/blog\/generically-typed-vue-components\/\" target=\"_blank\" rel=\"noreferrer noopener\">skazani byli na pokraczne i skomplikowane rozwi\u0105zania<\/a>. Na szcz\u0119\u015bcie, od teraz rozs\u0105dne rozwi\u0105zanie jest ju\u017c wbudowane w framework.<\/p>\n","innerContent":["\n<p>Kolejn\u0105 nowo\u015bci\u0105 w Vue 3.3 s\u0105 generyczne komponenty. Pr\u00f3bowa\u0142em dogrzeba\u0107 si\u0119 do informacji, w jaki spos\u00f3b deweloperzy Vue radzili sobie z generycznymi komponentami do tej pory. Okazuje si\u0119, \u017ce albo rezygnowali oni ca\u0142kowicie ze sprawdzania typ\u00f3w, albo <a href=\"https:\/\/logaretm.com\/blog\/generically-typed-vue-components\/\" target=\"_blank\" rel=\"noreferrer noopener\">skazani byli na pokraczne i skomplikowane rozwi\u0105zania<\/a>. Na szcz\u0119\u015bcie, od teraz rozs\u0105dne rozwi\u0105zanie jest ju\u017c wbudowane w framework.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"prismatic\/blocks","attrs":{"language":"xml"},"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-xml\">&lt;script setup lang=\"ts\" generic=\"T\">\ndefineProps&lt;{\n  items: T[]\n  selected: T\n}>()\n&lt;\/script><\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-xml\">&lt;script setup lang=\"ts\" generic=\"T\">\ndefineProps&lt;{\n  items: T[]\n  selected: T\n}>()\n&lt;\/script><\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16144,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-3-2.jpeg\" alt=\"\" class=\"wp-image-16144\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/download-3-2.jpeg\" alt=\"\" class=\"wp-image-16144\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">Inne usprawnienia<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Inne usprawnienia<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Opr\u00f3cz usprawnionej integracji z TypeScript, Vue 3.3 to te\u017c ma\u0142a paczka drobnych usprawnie\u0144. Dostali\u015bmy na przyk\u0142ad nowe, zdecydowanie schludniejsze API dla metody <code><code>defineEmits<\/code><\/code>.<\/p>\n","innerContent":["\n<p>Opr\u00f3cz usprawnionej integracji z TypeScript, Vue 3.3 to te\u017c ma\u0142a paczka drobnych usprawnie\u0144. Dostali\u015bmy na przyk\u0142ad nowe, zdecydowanie schludniejsze API dla metody <code><code>defineEmits<\/code><\/code>.<\/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-\">\/\/ BEFORE\nconst emit = defineEmits&lt;{\n  (e: 'foo', id: number): void\n  (e: 'bar', name: string, ...rest: any[]): void\n}>()\n\n\/\/ AFTER\nconst emit = defineEmits&lt;{\n  foo: [id: number]\n  bar: [name: string, ...rest: any[]]\n}>()<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-\">\/\/ BEFORE\nconst emit = defineEmits&lt;{\n  (e: 'foo', id: number): void\n  (e: 'bar', name: string, ...rest: any[]): void\n}>()\n\n\/\/ AFTER\nconst emit = defineEmits&lt;{\n  foo: [id: number]\n  bar: [name: string, ...rest: any[]]\n}>()<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Poza tym dostali\u015bmy now\u0105 metod\u0119 <code>defineSlots<\/code>, kt\u00f3ra b\u0119dzie s\u0142u\u017cy\u0142a do zdefiniowania typ\u00f3w slot\u00f3w w komponencie. Na ten moment  kompilator weryfikuje tylko zgodno\u015b\u0107 schematu komponentu, przez co nie da si\u0119 na przyk\u0142ad zdefiniowa\u0107 sko\u0144czonej listy akceptowanych komponent\u00f3w. Rozwi\u0105zanie nie jest te\u017c wspierane przez <code>Volar<\/code>, czyli  Language Server wykorzystywany przez Vue, dzi\u0119ki kt\u00f3remu w VSCode mo\u017cemy korzysta\u0107 z podpowiadania sk\u0142adni i innych podobnych dobrodziejstw. Pomimo drobnych ogranicze\u0144, <code>defineSlots<\/code> wydaje si\u0119 krokiem w dobrym kierunku i na pewno ucieszy wszystkich pracuj\u0105cych na co dzie\u0144 z Vue. <\/p>\n","innerContent":["\n<p>Poza tym dostali\u015bmy now\u0105 metod\u0119 <code>defineSlots<\/code>, kt\u00f3ra b\u0119dzie s\u0142u\u017cy\u0142a do zdefiniowania typ\u00f3w slot\u00f3w w komponencie. Na ten moment  kompilator weryfikuje tylko zgodno\u015b\u0107 schematu komponentu, przez co nie da si\u0119 na przyk\u0142ad zdefiniowa\u0107 sko\u0144czonej listy akceptowanych komponent\u00f3w. Rozwi\u0105zanie nie jest te\u017c wspierane przez <code>Volar<\/code>, czyli  Language Server wykorzystywany przez Vue, dzi\u0119ki kt\u00f3remu w VSCode mo\u017cemy korzysta\u0107 z podpowiadania sk\u0142adni i innych podobnych dobrodziejstw. Pomimo drobnych ogranicze\u0144, <code>defineSlots<\/code> wydaje si\u0119 krokiem w dobrym kierunku i na pewno ucieszy wszystkich pracuj\u0105cych na co dzie\u0144 z Vue. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"prismatic\/blocks","attrs":{"language":"xml"},"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-xml\">&lt;script setup lang=\"ts\">\ndefineSlots&lt;{\n  default?: (props: { msg: string }) => any\n  item?: (props: { id: number }) => any\n}>()\n&lt;\/script><\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-xml\">&lt;script setup lang=\"ts\">\ndefineSlots&lt;{\n  default?: (props: { msg: string }) => any\n  item?: (props: { id: number }) => any\n}>()\n&lt;\/script><\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">Przysz\u0142o\u015b\u0107 Vue<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Przysz\u0142o\u015b\u0107 Vue<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Por\u00f3wnuj\u0105c nowo\u015bci z Vue do tych z Angulara i React, nie spos\u00f3b nie odnie\u015b\u0107 wra\u017cenia, \u017ce s\u0105 one troch\u0119 mniej ekscytuj\u0105ce. Vue mierzy si\u0119 w\u0142a\u015bnie z migracj\u0105 swoich u\u017cytkownik\u00f3w z wersji 2 na 3. Oznacza to, \u017ce zesp\u00f3\u0142 nie mo\u017ce skupi\u0107 si\u0119 ca\u0142kowicie na rozwoju nowych funkcjonalno\u015bci. Poprzednio wydana wersja Vue, to w ko\u0144cu nie Vue 3.2, a Vue 2.7, kt\u00f3re portowa\u0142o nowo\u015bci z Vue 3 do Vue 2. Wszystko wskazuje na to, \u017ce sytuacja wkr\u00f3tce ulegnie zmianie. Po pierwsze, Vue 2 dokona swojego \u017cywota wraz z ko\u0144cem tego roku. Po drugie, na tegorocznej konferencji Vuejs Amsterdam, Evan You uchyli\u0142 r\u0105bka tajemnicy i zdradzi\u0142, \u017ce zesp\u00f3\u0142 pracuje nad nowym wydajnym kompilatorem na wz\u00f3r SolidJS. Po trzecie, Vue to nie tylko Vue. W ostatnich miesi\u0105cach narz\u0119dzia zbudowane wok\u00f3\u0142 Vue (np. Vite, Volar) zacz\u0119\u0142y szturmem zdobywa\u0107 popularno\u015b\u0107 r\u00f3wnie\u017c poza matczynym frameworkiem i to w\u0142a\u015bnie tutaj dzieje si\u0119 teraz najwi\u0119cej.<\/p>\n","innerContent":["\n<p>Por\u00f3wnuj\u0105c nowo\u015bci z Vue do tych z Angulara i React, nie spos\u00f3b nie odnie\u015b\u0107 wra\u017cenia, \u017ce s\u0105 one troch\u0119 mniej ekscytuj\u0105ce. Vue mierzy si\u0119 w\u0142a\u015bnie z migracj\u0105 swoich u\u017cytkownik\u00f3w z wersji 2 na 3. Oznacza to, \u017ce zesp\u00f3\u0142 nie mo\u017ce skupi\u0107 si\u0119 ca\u0142kowicie na rozwoju nowych funkcjonalno\u015bci. Poprzednio wydana wersja Vue, to w ko\u0144cu nie Vue 3.2, a Vue 2.7, kt\u00f3re portowa\u0142o nowo\u015bci z Vue 3 do Vue 2. Wszystko wskazuje na to, \u017ce sytuacja wkr\u00f3tce ulegnie zmianie. Po pierwsze, Vue 2 dokona swojego \u017cywota wraz z ko\u0144cem tego roku. Po drugie, na tegorocznej konferencji Vuejs Amsterdam, Evan You uchyli\u0142 r\u0105bka tajemnicy i zdradzi\u0142, \u017ce zesp\u00f3\u0142 pracuje nad nowym wydajnym kompilatorem na wz\u00f3r SolidJS. Po trzecie, Vue to nie tylko Vue. W ostatnich miesi\u0105cach narz\u0119dzia zbudowane wok\u00f3\u0142 Vue (np. Vite, Volar) zacz\u0119\u0142y szturmem zdobywa\u0107 popularno\u015b\u0107 r\u00f3wnie\u017c poza matczynym frameworkiem i to w\u0142a\u015bnie tutaj dzieje si\u0119 teraz najwi\u0119cej.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16146,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/7oeh02-1.jpeg\" alt=\"\" class=\"wp-image-16146\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/7oeh02-1.jpeg\" alt=\"\" class=\"wp-image-16146\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>PS Je\u015bli na co dzie\u0144 pracujecie z Vue i jeszcze nie widzieli\u015bcie prezentacji Evana, to najwy\u017cszy czas to nadrobi\u0107. <\/p>\n","innerContent":["\n<p>PS Je\u015bli na co dzie\u0144 pracujecie z Vue i jeszcze nie widzieli\u015bcie prezentacji Evana, to najwy\u017cszy czas to nadrobi\u0107. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/embed","attrs":{"url":"https:\/\/www.youtube.com\/watch?v=I5mGNB-4f0o","type":"video","providerNameSlug":"youtube","responsive":true,"align":"center","className":"wp-embed-aspect-16-9 wp-has-aspect-ratio"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-embed aligncenter 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=I5mGNB-4f0o\n<\/div><\/figure>\n","innerContent":["\n<figure class=\"wp-block-embed aligncenter 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=I5mGNB-4f0o\n<\/div><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">Qwik 1.0<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">Qwik 1.0<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Qwik to framework rozwijany przez prawdziw\u0105 frontendow\u0105 dru\u017cyn\u0119 All-Stars. W zespole pracuj\u0105cym nad frameworkiem znale\u017a\u0107 mo\u017cemy mi\u0119dzy innymi Mi\u0161ko Heverego (wsp\u00f3\u0142tw\u00f3rca Angulara) czy Adama Bradleya (wsp\u00f3\u0142tw\u00f3rc\u0119 Ionica) - ludzi wiedz\u0105cych jak zbudowa\u0107 i sprzeda\u0107 framework. Dodatkowo za Qwikiem stoi coraz szerzej rozpoznawalna firma Builder.io. W jej portfolio opr\u00f3cz omawianego dzi\u015b frameworka znajdziemy mi\u0119dzy innymi bibliotek\u0119 <a href=\"https:\/\/partytown.builder.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Partytown<\/a> (umo\u017cliwiaj\u0105c\u0105 przerzucenie kodu tracker\u00f3w takich jak Google Analytics do r\u00f3wnoleg\u0142ych worker\u00f3w) i <a href=\"https:\/\/vived.io\/pl\/frontend-thursday-vol-84-mitosis-node-18-react-redux-v8\/\" target=\"_blank\" rel=\"noreferrer noopener\">Mitosis<\/a> (umo\u017cliwiaj\u0105c\u0105 pisanie komponent\u00f3w w specjalnym j\u0119zyku, a nast\u0119pnie kompilowanie ich do dowolnego frameworku).<\/p>\n","innerContent":["\n<p>Qwik to framework rozwijany przez prawdziw\u0105 frontendow\u0105 dru\u017cyn\u0119 All-Stars. W zespole pracuj\u0105cym nad frameworkiem znale\u017a\u0107 mo\u017cemy mi\u0119dzy innymi Mi\u0161ko Heverego (wsp\u00f3\u0142tw\u00f3rca Angulara) czy Adama Bradleya (wsp\u00f3\u0142tw\u00f3rc\u0119 Ionica) - ludzi wiedz\u0105cych jak zbudowa\u0107 i sprzeda\u0107 framework. Dodatkowo za Qwikiem stoi coraz szerzej rozpoznawalna firma Builder.io. W jej portfolio opr\u00f3cz omawianego dzi\u015b frameworka znajdziemy mi\u0119dzy innymi bibliotek\u0119 <a href=\"https:\/\/partytown.builder.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Partytown<\/a> (umo\u017cliwiaj\u0105c\u0105 przerzucenie kodu tracker\u00f3w takich jak Google Analytics do r\u00f3wnoleg\u0142ych worker\u00f3w) i <a href=\"https:\/\/vived.io\/pl\/frontend-thursday-vol-84-mitosis-node-18-react-redux-v8\/\" target=\"_blank\" rel=\"noreferrer noopener\">Mitosis<\/a> (umo\u017cliwiaj\u0105c\u0105 pisanie komponent\u00f3w w specjalnym j\u0119zyku, a nast\u0119pnie kompilowanie ich do dowolnego frameworku).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16150,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image10-2.jpeg\" alt=\"\" class=\"wp-image-16150\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image10-2.jpeg\" alt=\"\" class=\"wp-image-16150\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Qwik wywraca do g\u00f3ry nogami obecny paradygmaty renderowania po stronie serwera, poprzez ca\u0142kowite pozbycie si\u0119 procesu hydracji. Hydracja, to proces po stronie klienta, podczas kt\u00f3rego wyrenderowana po stronie serwera aplikacja \u0142aduje kod JavaScript, nast\u0119pnie powtarza ca\u0142\u0105 logik\u0119 inicjalizacyjn\u0105 i ostatecznie pod\u0142\u0105cza odpowiednie listenery do istniej\u0105cej struktury DOM. O ile klient szybko widzi docelow\u0105 te\u015b\u0107, o tyle sam proces hydracji mo\u017ce trwa\u0107 od kilku do kilkunastu sekund. Do tego czasu aplikacja pozostaje ca\u0142kowicie statyczna.<\/p>\n","innerContent":["\n<p>Qwik wywraca do g\u00f3ry nogami obecny paradygmaty renderowania po stronie serwera, poprzez ca\u0142kowite pozbycie si\u0119 procesu hydracji. Hydracja, to proces po stronie klienta, podczas kt\u00f3rego wyrenderowana po stronie serwera aplikacja \u0142aduje kod JavaScript, nast\u0119pnie powtarza ca\u0142\u0105 logik\u0119 inicjalizacyjn\u0105 i ostatecznie pod\u0142\u0105cza odpowiednie listenery do istniej\u0105cej struktury DOM. O ile klient szybko widzi docelow\u0105 te\u015b\u0107, o tyle sam proces hydracji mo\u017ce trwa\u0107 od kilku do kilkunastu sekund. Do tego czasu aplikacja pozostaje ca\u0142kowicie statyczna.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Alternatywa, kt\u00f3r\u0105 oferuje Qwik, to wznawiane wykonania (ang. Resumable). Paradygmat ten pozwala zapisa\u0107 stan aplikacji po stronie serwera w taki spos\u00f3b, aby po stronie klienta mo\u017cliwe by\u0142o natychmiastowe wznowienie wykonywania kodu. Dodatkowo Qwik dzieli aplikacj\u0119 na bardzo ma\u0142e cz\u0119\u015bci i nie pobiera ca\u0142ego kodu aplikacji przy starcie. Zamiast tego stosowane s\u0105 zaawansowane strategie pre-loadingu, kt\u00f3re \u0142aduj\u0105 kod tylko niezb\u0119dnych komponent\u00f3w. W r\u0119ce programist\u00f3w trafiaj\u0105 zaawansowane narz\u0119dzia umo\u017cliwiaj\u0105ce okre\u015blenie jasnych priorytet\u00f3w wzgl\u0119dem pobierania komponent\u00f3w. Je\u015bli komponent jest nieistotny, to mo\u017cliwe jest nawet pobranie jego kodu dopiero kiedy u\u017cytkownik wejdzie z nim w interakcje.<\/p>\n","innerContent":["\n<p>Alternatywa, kt\u00f3r\u0105 oferuje Qwik, to wznawiane wykonania (ang. Resumable). Paradygmat ten pozwala zapisa\u0107 stan aplikacji po stronie serwera w taki spos\u00f3b, aby po stronie klienta mo\u017cliwe by\u0142o natychmiastowe wznowienie wykonywania kodu. Dodatkowo Qwik dzieli aplikacj\u0119 na bardzo ma\u0142e cz\u0119\u015bci i nie pobiera ca\u0142ego kodu aplikacji przy starcie. Zamiast tego stosowane s\u0105 zaawansowane strategie pre-loadingu, kt\u00f3re \u0142aduj\u0105 kod tylko niezb\u0119dnych komponent\u00f3w. W r\u0119ce programist\u00f3w trafiaj\u0105 zaawansowane narz\u0119dzia umo\u017cliwiaj\u0105ce okre\u015blenie jasnych priorytet\u00f3w wzgl\u0119dem pobierania komponent\u00f3w. Je\u015bli komponent jest nieistotny, to mo\u017cliwe jest nawet pobranie jego kodu dopiero kiedy u\u017cytkownik wejdzie z nim w interakcje.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16155,"width":815,"height":368,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image3-1024x462.png\" alt=\"\" class=\"wp-image-16155\" width=\"815\" height=\"368\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image3-1024x462.png\" alt=\"\" class=\"wp-image-16155\" width=\"815\" height=\"368\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Sk\u0142adnia Qwika na pierwszy rzut oka bardzo przypomina sk\u0142adni\u0119 Reacta i dlatego wi\u0119kszo\u015b\u0107 deweloper\u00f3w szybko si\u0119 w niej odjnajdzie. Zaskakuj\u0105ce dla nowicjuszy mog\u0105 by\u0107 wszechobecne <code>$<\/code> ko\u0144cz\u0105ce definicje wielu funkcji. Wyznaczaj\u0105 one fragmenty, na jakie Qwik podzieli aplikacj\u0119 i maj\u0105 kluczowe znaczenie w przypadku zaawansowanych optymalizacji.<\/p>\n","innerContent":["\n<p>Sk\u0142adnia Qwika na pierwszy rzut oka bardzo przypomina sk\u0142adni\u0119 Reacta i dlatego wi\u0119kszo\u015b\u0107 deweloper\u00f3w szybko si\u0119 w niej odjnajdzie. Zaskakuj\u0105ce dla nowicjuszy mog\u0105 by\u0107 wszechobecne <code>$<\/code> ko\u0144cz\u0105ce definicje wielu funkcji. Wyznaczaj\u0105 one fragmenty, na jakie Qwik podzieli aplikacj\u0119 i maj\u0105 kluczowe znaczenie w przypadku zaawansowanych optymalizacji.<\/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\">import { component$, useStore } from '@builder.io\/qwik';\n\nexport default component$(() => {\n  const store = useStore({ count: 0 });\n\n  return (\n    &lt;main>\n      &lt;p>Count: {store.count}&lt;\/p>\n      &lt;p>\n        &lt;button onClick$={() => store.count++}>Click&lt;\/button>\n      &lt;\/p>\n    &lt;\/main>\n  );\n});<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">import { component$, useStore } from '@builder.io\/qwik';\n\nexport default component$(() => {\n  const store = useStore({ count: 0 });\n\n  return (\n    &lt;main>\n      &lt;p>Count: {store.count}&lt;\/p>\n      &lt;p>\n        &lt;button onClick$={() => store.count++}>Click&lt;\/button>\n      &lt;\/p>\n    &lt;\/main>\n  );\n});<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p> jednej strony bardzo przypomina on Reacta, co czyni go przyst\u0119pnym i zrozumia\u0142ym dla pocz\u0105tkuj\u0105cych. Z drugiej strony, model mentalny polegaj\u0105cy na dzieleniu kodu na tysi\u0105ce ma\u0142ych kawa\u0142k\u00f3w i do\u0142adowywanie ich asynchronicznie mo\u017ce wprowadza\u0107 na deweloper\u00f3w spory narzut. Osobi\u015bcie nie mia\u0142em jeszcze okazji pobawi\u0107 si\u0119 t\u0105 now\u0105, l\u015bni\u0105c\u0105 zabawk\u0105 i wstrzymam si\u0119 jeszcze z ostatecznymi os\u0105dami. Podsk\u00f3rnie mam jednak wra\u017cenie, \u017ce architektury takie jak Dynamic Islands czy React Server Components nie staraj\u0105 si\u0119 rozwi\u0105za\u0107 wszystkich problem\u00f3w r\u00f3wnocze\u015bnie i oferuj\u0105 zdecydowanie prostsze modele mentalne.<\/p>\n","innerContent":["\n<p> jednej strony bardzo przypomina on Reacta, co czyni go przyst\u0119pnym i zrozumia\u0142ym dla pocz\u0105tkuj\u0105cych. Z drugiej strony, model mentalny polegaj\u0105cy na dzieleniu kodu na tysi\u0105ce ma\u0142ych kawa\u0142k\u00f3w i do\u0142adowywanie ich asynchronicznie mo\u017ce wprowadza\u0107 na deweloper\u00f3w spory narzut. Osobi\u015bcie nie mia\u0142em jeszcze okazji pobawi\u0107 si\u0119 t\u0105 now\u0105, l\u015bni\u0105c\u0105 zabawk\u0105 i wstrzymam si\u0119 jeszcze z ostatecznymi os\u0105dami. Podsk\u00f3rnie mam jednak wra\u017cenie, \u017ce architektury takie jak Dynamic Islands czy React Server Components nie staraj\u0105 si\u0119 rozwi\u0105za\u0107 wszystkich problem\u00f3w r\u00f3wnocze\u015bnie i oferuj\u0105 zdecydowanie prostsze modele mentalne.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16152,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image1.png\" alt=\"\" class=\"wp-image-16152\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/image1.png\" alt=\"\" class=\"wp-image-16152\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">PS: Urodziny Reacta i PHP \ud83c\udf89<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">PS: Urodziny Reacta i PHP \ud83c\udf89<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli nie mieli\u015bcie w tym miesi\u0105cu okazji do \u015bwi\u0119towania, to ju\u017c \u015bpiesz\u0119 z odsiecz\u0105. Ot\u00f3\u017c w maju 28 urodziny \u015bwi\u0119towa\u0142 PHP, a jego m\u0142odszy kolega w postaci Reacta 10. Idealna okazja, \u017ceby troch\u0119 powspomina\u0107 i wszama\u0107 ulubiony tort lub wci\u0105gn\u0105\u0107 lampk\u0119 ulubionego alkoholu. Do zobaczenia za miesi\u0105c!<\/p>\n","innerContent":["\n<p>Je\u015bli nie mieli\u015bcie w tym miesi\u0105cu okazji do \u015bwi\u0119towania, to ju\u017c \u015bpiesz\u0119 z odsiecz\u0105. Ot\u00f3\u017c w maju 28 urodziny \u015bwi\u0119towa\u0142 PHP, a jego m\u0142odszy kolega w postaci Reacta 10. Idealna okazja, \u017ceby troch\u0119 powspomina\u0107 i wszama\u0107 ulubiony tort lub wci\u0105gn\u0105\u0107 lampk\u0119 ulubionego alkoholu. Do zobaczenia za miesi\u0105c!<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16158,"width":641,"height":495,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/giphy.gif\" alt=\"\" class=\"wp-image-16158\" width=\"641\" height=\"495\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/06\/giphy.gif\" alt=\"\" class=\"wp-image-16158\" width=\"641\" height=\"495\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a:<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">\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:\/\/nextjs.org\/blog\/next-13-4\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/nextjs.org\/blog\/next-13-4<\/a><br><a href=\"https:\/\/react.dev\/blog\/2023\/05\/03\/react-canaries\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/react.dev\/blog\/2023\/05\/03\/react-canaries<\/a><br><a href=\"https:\/\/blog.angular.io\/angular-v16-is-here-4d7a28ec680d\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/blog.angular.io\/angular-v16-is-here-4d7a28ec680d<\/a><br><a href=\"https:\/\/blog.vuejs.org\/posts\/vue-3-3\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/blog.vuejs.org\/posts\/vue-3-3<\/a><br><a href=\"https:\/\/www.builder.io\/blog\/qwik-v1\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.builder.io\/blog\/qwik-v1<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/nextjs.org\/blog\/next-13-4\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/nextjs.org\/blog\/next-13-4<\/a><br><a href=\"https:\/\/react.dev\/blog\/2023\/05\/03\/react-canaries\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/react.dev\/blog\/2023\/05\/03\/react-canaries<\/a><br><a href=\"https:\/\/blog.angular.io\/angular-v16-is-here-4d7a28ec680d\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/blog.angular.io\/angular-v16-is-here-4d7a28ec680d<\/a><br><a href=\"https:\/\/blog.vuejs.org\/posts\/vue-3-3\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/blog.vuejs.org\/posts\/vue-3-3<\/a><br><a href=\"https:\/\/www.builder.io\/blog\/qwik-v1\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.builder.io\/blog\/qwik-v1<\/a><\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16021","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=16021"}],"version-history":[{"count":32,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16021\/revisions"}],"predecessor-version":[{"id":16227,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16021\/revisions\/16227"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/16216"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=16021"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=16021"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=16021"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}