{"id":11405,"date":"2022-10-20T12:37:20","date_gmt":"2022-10-20T10:37:20","guid":{"rendered":"https:\/\/vived.io\/?p=11405"},"modified":"2022-10-20T12:37:22","modified_gmt":"2022-10-20T10:37:22","slug":"pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/","title":{"rendered":"Pobieranie danych w React ju\u017c nigdy nie b\u0119dzie takie samo &#8211; Frontend Weekly vol. 109"},"content":{"rendered":"\n<h2 id=\"1-react-z-natywnym-wsparciem-dla-promise\" data-num=1>1. React z natywnym wsparciem dla Promise<\/h2>\n\n\n\n<p>Kolejne RFC (Request For Comments) zwyczajowo ju\u017c wzbudzaj\u0105 du\u017ce zainteresowanie w sieci. Nie inaczej by\u0142o i tym razem, bo nowo opublikowane RFC wprowadza do biblioteki natywne wsparcie dla Promis\u00f3w. Dla jednych zaproponowane rozwi\u0105zanie jest przekompilowane i niepotrzebne. Inni natomiast gloryfikuj\u0105 RFC do poziomu \u201costatniej brakuj\u0105cej funkcjonalno\u015bci Reacta\u201d. Jak to zwykle bywa prawda jest gdzie\u015b po\u015brodku, a my dzisiaj bli\u017cej przyjrzymy si\u0119 zaproponowanym nowo\u015bciom.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Komponenty renderowane po stronie klienta<\/h3>\n\n\n\n<p>Widz\u0105c tytu\u0142 nowego RFC mo\u017cecie si\u0119 zastanawia\u0107 o co tak naprawd\u0119 chodzi. W ko\u0144cu React jest w pe\u0142ni kompatybilny z Promisami i zapewne wi\u0119kszo\u015b\u0107 z Was mia\u0142a przyjemno\u015b\u0107 napisa\u0107 kod podobny do tego:<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">async function fetchNote(id) {\n  const data = await fetchNoteFromBackend(id);\n  return data.json();\n}\n\nfunction Note({id}) {\n  const [note, setNote] = useState(null);\n  \n  useEffect(() =&gt; {\n    fetchNote(id).then(it =&gt; setNote(it))\n  }, [id])\n\n  if(note === null) {\n    return &lt;h1&gt; Loading... &lt;\/h1&gt;\n  } \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    &lt;\/div&gt;\n    );\n}<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"500\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-20.jpeg\" alt=\"\" class=\"wp-image-11406\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-20.jpeg 500w, https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-20-300x300.jpeg 300w, https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-20-150x150.jpeg 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure><\/div>\n\n\n<p>Biblioteki takie jak React Query dostarczaj\u0105 odrobin\u0119 przyjemniejsze API, ale wci\u0105\u017c manualnie obs\u0142u\u017cy\u0107 musimy poszczeg\u00f3lne mo\u017cliwe stany Promsie<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">async function fetchNote(id) {\n  const data = await fetchNoteFromBackend(id);\n  return data.json();\n}\n\nfunction Note({id}) {\n     const query = useQuery(`note-{id}`, fetchNote)\n    \n     if(query.isLoading) {\n       return (&lt;h1&gt; Loading... &lt;\/h1&gt;);\n     }\n\n    return (\n      &lt;div&gt;\n        &lt;h1&gt;{query.data..title}&lt;\/h1&gt;\n        &lt;section&gt;{query.data.body}&lt;\/section&gt;\n      &lt;\/div&gt;\n    );\n}<\/code><\/pre>\n\n\n\n<p>Rozwi\u0105zanie, kt\u00f3re proponuje zesp\u00f3\u0142 stoj\u0105cy za Reactem, to wprowadzenie nowego hooka o nazwie `use`. Przy jego pomocy mo\u017cliwe jest odczytanie warto\u015bci fulfilled Promise, a obs\u0142uga b\u0142\u0119d\u00f3w i \u0142adowania oddelegowana zostanie do najbli\u017cszego Suspense. Taka architektura pozwala grupowa\u0107 komponenty w konteksty, kt\u00f3re s\u0105 gotowe do wyrenderowania dopiero kiedy wszystkie komponenty za\u0142aduj\u0105 dane.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">async function fetchNote(id) {\n  const data = await fetchNoteFromBackend(id, { useCache: true});\n  return data.json();\n}\n\nfunction Note({id}) {\n  const note = use(fetchNote(id));\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    &lt;\/div&gt;\n  );\n}\n\nfunction App() {\n  return (\n    {\/* Loading will be displayed until all Notes fetch necessary data *\/}\n    &lt;Suspense fallback={&lt;h1&gt;Loading\u2026&lt;\/h1&gt;}&gt;\n      &lt;Note id=\u201d1\u201d \/&gt;\n      &lt;Note id=\u201d2\u201d \/&gt;\n      &lt;Note id=\u201d3\u201d \/&gt;\n    &lt;\/Suspense&gt;\n  );\n}<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"553\" height=\"451\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-19.jpeg\" alt=\"\" class=\"wp-image-11408\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-19.jpeg 553w, https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-19-300x245.jpeg 300w\" sizes=\"auto, (max-width: 553px) 100vw, 553px\" \/><\/figure><\/div>\n\n\n<p>Warto zauwa\u017cy\u0107, \u017ce je\u015bli referencja do Promise zmieni si\u0119 mi\u0119dzy renderami, to ponownie wy\u015bwietlony zostanie fallback z komponentu Suspense. Jedynym wyj\u0105tkiem od tej regu\u0142y, jest przekazanie do `use` fulfilled Promise. W takiej sytuacji React od razu wy\u015bwietli wyrenderowany komponent. To oznacza, \u017ce aby unikn\u0105\u0107 niechcianego \u201cmrugania\u201d, niezb\u0119dne jest dodanie obs\u0142ugi cache. Mo\u017cemy w tej kwestii albo polega\u0107 na zewn\u0119trznych bibliotekach, albo po prostu&nbsp; skorzysta\u0107 `useMemo`. Na szcz\u0119\u015bcie zesp\u00f3\u0142 stoj\u0105cy za RFC obiecuj\u0119, \u017ce nied\u0142ugo zaprezentuje r\u00f3wnie\u017c API dedykowane temu \u0142atwiejszej obs\u0142ugi cache.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">async function fetchNote(id) {\n  const data = await fetchNoteFromBackend(id);\n  return data.json();\n}\n\nfunction Note({id}) {\n  const promise = useMemo(() =&gt; fetchNote(id), [id]);\n  const note = use(promise);\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    &lt;\/div&gt;\n  );\n}<\/code><\/pre>\n\n\n\n<p>Je\u015bli my\u015blicie, \u017ce zrobi\u0142o si\u0119 skomplikowanie, to dopiero si\u0119 rozkr\u0119camy. `use` b\u0119dzie pierwszym i jedynym hookiem, kt\u00f3ry mo\u017ce by\u0107 u\u017cywany wewn\u0105trz instrukcji if czy p\u0119tli for.&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">function Note({id, shouldIncludeAuthor}) {\n  const note = use(fetchNote(id));\n\n  let byLine = null;\n  if (shouldIncludeAuthor) {\n    const author = use(fetchNoteAuthor(note.authorId));\n    byLine = &lt;h2&gt;{author.displayName}&lt;\/h2&gt;;\n  }\n\n  return (\n    &lt;div&gt;\n      &lt;h1&gt;{note.title}&lt;\/h1&gt;\n      {byLine}\n      &lt;section&gt;{note.body}&lt;\/section&gt;\n    &lt;\/div&gt;\n  );\n}<\/code><\/pre>\n\n\n\n<p>W przysz\u0142o\u015bci planowane jest r\u00f3wnie\u017c dodanie interfejsu Usable, kt\u00f3ry pozwoli wpakowa\u0107 do hooka co nam si\u0119 \u017cywnie podoba. Autorzy RFC jako przyk\u0142ad podaj\u0105 kontekst. Je\u015bli ich plany wejd\u0105 w \u017cycie, to w API znajdziemy zar\u00f3wno use(Context) jak i useContext(Context). Tego pierwszego b\u0119dzie mo\u017cna u\u017cywa\u0107 wewn\u0105trz instrukcji warunkowych, ale tego drugiego ju\u017c nie.&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">\/\/ \u2705 This will work fine\nfunction Author({display}) {\n  if (display) {\n    const authors = use(AuthorsContext);\n    return &lt;h2&gt;{authors[note.authorId]}&lt;\/h2&gt;;\n  } else {\n    return null\n  }\n\n\/\/ \ud83d\uded1 This will not work\nfunction Author({display}) {\n  if (display) {\n    const authors = useContext(AuthorsContext);\n    return &lt;h2&gt;{authors[note.authorId]}&lt;\/h2&gt;;\n  } else {\n    return null\n  }\n}<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-22.jpeg\" alt=\"\" class=\"wp-image-11410\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-22.jpeg 640w, https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-22-300x225.jpeg 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Komponenty renderowane po stronie serwera<\/h3>\n\n\n\n<p>Druga zaprezentowana w RFC nowo\u015b\u0107 dotyczy React Server Component. Z racji tego, \u017ce p\u00f3ki co s\u0105 one eksperymentaln\u0105 cz\u0119\u015bci\u0105 biblioteki zatrzymajmy si\u0119 na chwil\u0119, \u017ceby przypomnie\u0107 sobie czym w\u0142a\u015bciwie s\u0105.&nbsp;<\/p>\n\n\n\n<p>Koncepcja ta po raz pierwszy zaprezentowana zosta\u0142a pod koniec 2020 roku. Server Components umo\u017cliwiaj\u0105 wyrenderowanie cz\u0119\u015bci drzewa komponent\u00f3w po stronie klienta i cz\u0119\u015b\u0107 po stronie serwera. Komponenty wyrenderowane po stronie serwera przesy\u0142ane s\u0105 jako strumie\u0144 HTML, co pozwala odchudzi\u0107 paczk\u0119 wys\u0142an\u0105 do klienta. Taka architektura pozwala te\u017c dobra\u0107 si\u0119 do typowo serwerowych funkcji (na przyk\u0142ad do bazy danych, czy systemu plik\u00f3w) bezpo\u015brednio z poziomu kodu komponentu.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">import fs from &#039;react-fs&#039;;\nimport db from &#039;db.server&#039;;\n\nfunction FileNote({id}) {\n  const note = JSON.parse(fs.readFile(`${id}.json`));\n  return &lt;NoteWithMarkdown note={note} \/&gt;;\n}\n\nfunction DatabaseNote({id}) {\n  const note = db.notes.get(id);\n  return &lt;NoteWithMarkdown note={note} \/&gt;;\n}<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"559\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/6xl7is.jpeg\" alt=\"\" class=\"wp-image-11412\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/6xl7is.jpeg 500w, https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/6xl7is-268x300.jpeg 268w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure><\/div>\n\n\n<p>Je\u015bli szukacie materia\u0142\u00f3w, kt\u00f3re pozwol\u0105 Wam lepiej zrozumie\u0107 koncepcj\u0119 Server Components, to nieustannie rekomenduj\u0119 <a href=\"https:\/\/www.youtube.com\/watch?v=TQQPAU21ZUw\">oryginaln\u0105 prezentacj\u0119 z 2020 roku<\/a>. Wszystkich bardziej zdeterminowanych odsy\u0142am natomiast do <a href=\"https:\/\/github.com\/josephsavona\/rfcs\/blob\/server-components\/text\/0000-server-components.md\">d\u0142ugiego i obszernego RFC<\/a>.<\/p>\n\n\n\n<p>Sporym brakiem Server Components by\u0142a do tej pory przyjazna obs\u0142uga asynchronicznych akcji, tak typowych dla serwerowych operacji. Nowo zaprezentowane RFC adresuje ten problem umo\u017cliwiaj\u0105c korzystanie z natywnej sk\u0142adni async\/await. Jedynym zastrze\u017ceniem jest fakt, \u017ce komponenty u\u017cywaj\u0105ce async\/await nie mog\u0105 wykorzystywa\u0107 hook\u00f3w.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">async function Note({id, isEditing}) {\n  const note = await db.posts.get(id);\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    &lt;\/div&gt;\n  );\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Niezale\u017cnie od tego, czy zaproponowane zmiany przypad\u0142y Wam do gustu, czy nie pami\u0119tajmy, \u017ce nie nale\u017cy popada\u0107 w skrajne emocje. Zanim RFC zostanie wdro\u017cone najprawdopodobniej up\u0142ynie sporo czasu i raczej mo\u017cemy spodziewa\u0107 si\u0119 kilku zmian w specyfikacji. Odrzuca\u0107 nie mo\u017cemy r\u00f3wnie\u017c scenariusza, w kt\u00f3rym `use` podzieli los `useEvent` i pomimo pocz\u0105tkowego optymizmu nigdy nie ujrzy \u015bwiat\u0142a dziennego w opisanej tu dzisiaj postaci.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a<\/h3>\n\n\n\n<p><a href=\"https:\/\/github.com\/reactjs\/rfcs\/pull\/229\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/reactjs\/rfcs\/pull\/229<\/a><br><a href=\"https:\/\/github.com\/acdlite\/rfcs\/blob\/first-class-promises\/text\/0000-first-class-support-for-promises.md\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/acdlite\/rfcs\/blob\/first-class-promises\/text\/0000-first-class-support-for-promises.md<\/a><br><a href=\"https:\/\/www.youtube.com\/watch?v=ytXM05PVcFU\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.youtube.com\/watch?v=ytXM05PVcFU<\/a><\/p>\n\n\n\n<h2 id=\"2-lerna-wstaje-z-martwych\" data-num=2>2. Lerna wstaje z martwych<\/h2>\n\n\n\n<p>Lerna to rozwi\u0105zanie do zarz\u0105dzania monorepo, kt\u00f3re przez by\u0142o monopolist\u0105 w kategorii JavaScript. Na przestrzeni kilku ostatnich lat projekt napotka\u0142 jednak spore turbulencje. W po\u0142owie 2020 roku w repozytorium lerny pojawi\u0142o si\u0119 Issue m\u00f3wi\u0105ce, \u017ce narz\u0119dzie nie jest ju\u017c aktywnie wspierane. Patrz\u0105c na histori\u0119 commit\u00f3w ci\u0119\u017cko nie zgodzi\u0107 \u2013 wi\u0119kszo\u015b\u0107 zmian dotyczy aktualizacji zale\u017cno\u015bci oraz napraw krytycznych podatno\u015bci. W efekcie d\u0142ugich dyskusji do readme trafi\u0142 zapis informuj\u0105cy o ko\u0144cu wsparcia dla projektu.&nbsp;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"888\" height=\"499\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-24.jpeg\" alt=\"\" class=\"wp-image-11414\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-24.jpeg 888w, https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-24-300x169.jpeg 300w, https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-24-768x432.jpeg 768w\" sizes=\"auto, (max-width: 888px) 100vw, 888px\" \/><\/figure><\/div>\n\n\n<p>Przez ostatnie dwa lata na miejscu Lerny wyrasta\u0107 zacz\u0119\u0142y nowe alternatywy. Zar\u00f3wno yarn jak i npm przygotowa\u0142y natywne wsparcie dla monorepo w postaci workspaces. Nie zabrak\u0142o te\u017c narz\u0119dzi oferuj\u0105cych obs\u0142ug\u0119 bardziej zaawansowanych funkcjonalno\u015bci w postaci Nx i TurboRepo. Ten pierwszy zreszt\u0105 w kwietniu tego roku wyprzedzi\u0142 Lern\u0119 pod wzgl\u0119dem pobra\u0144 z npm. Chwil\u0119 po tym fakcie zdarzy\u0142o si\u0119 co\u015b zupe\u0142nie niespodziewanego &#8211; firma stoj\u0105ca za rozwojem Nx og\u0142osi\u0142a, \u017ce zamierza zaj\u0105\u0107 si\u0119 r\u00f3wnie\u017c rozwojem Lerny.&nbsp;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"480\" height=\"268\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/giphy-9.gif\" alt=\"\" class=\"wp-image-11416\"\/><\/figure><\/div>\n\n\n<p>Od czasu og\u0142oszenia przej\u0119cia projektu w nasze r\u0119ce trafi\u0142y ju\u017c dwie du\u017ce wersje narz\u0119dzia. Pierwsza, jeszcze w maju tego roku, podbi\u0142a kluczowe dependencje i usuwa\u0142a fa\u0142szywe ostrze\u017cenia rzucane w konsoli. Druga opublikowana w zesz\u0142ym tygodniu jest pierwsz\u0105 wersj\u0105 od ponad dw\u00f3ch lat, kt\u00f3ra wprowadza nowe funkcjonalno\u015bci. W\u015br\u00f3d nich znajdziemy<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>W\u0142\u0105czenie obs\u0142ugi cachowania&nbsp; paczek przy pomocy nx domy\u015blnie dla wszystkich modu\u0142\u00f3w<\/li><li>Dodanie obs\u0142ugi zdalnego cache na wz\u00f3r tego znanego z nx<\/li><li>Mo\u017cliwo\u015b\u0107 definiowania zale\u017cno\u015bci mi\u0119dzy modu\u0142ami, przy pomocy konfiguracji umieszczonej w&nbsp; pliku `nx.json`<\/li><li>Wsparcie dla pnpm<\/li><li>Dynamiczne wyj\u015bcie terminala na wz\u00f3r tego z nx<\/li><li>Dedykowane VSCode extension, mocno przypominaj\u0105ce to znane z nx<\/li><\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"559\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-23.jpeg\" alt=\"\" class=\"wp-image-11418\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-23.jpeg 500w, https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-23-268x300.jpeg 268w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure><\/div>\n\n\n<p>Jak widzicie, sporo z nowych funkcjonalno\u015bci tworzona jest na wz\u00f3r nx lub wr\u0119cz dodaje integracj\u0119 z nx. Nie ma w tym nic z\u0142ego, ale ja osobi\u015bcie troch\u0119 \u017ca\u0142uj\u0119, \u017ce Lerna nie rozwija nowych funkcjonalno\u015bci r\u00f3wnolegle do nx. W ko\u0144cu wi\u0119ksza r\u00f3\u017cnorodno\u015b\u0107 od zawsze nap\u0119dzaj\u0105 innowacje. Na szcz\u0119\u015bcie na rynku mamy jeszcze TurboRepo, wi\u0119c stagnacji w obszarze monorepo na razie nie musimy si\u0119 obawia\u0107.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a:<\/h3>\n\n\n\n<p><a href=\"https:\/\/blog.nrwl.io\/lerna-reborn-whats-new-in-v6-10aec6e9091c\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/blog.nrwl.io\/lerna-reborn-whats-new-in-v6-10aec6e9091c<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zesp\u00f3\u0142 stoj\u0105cy za Reactem zaprezentowa\u0142 nowy hook o nazwie `use`. Ten niepozorny tw\u00f3r mo\u017ce na zawsze mo\u017ce zmieni\u0107 spos\u00f3b w jaki pobieramy dane do naszych aplikacji.<\/p>\n","protected":false},"author":12,"featured_media":11422,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[273],"tags":[403,405,389],"class_list":["post-11405","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-frontend-pl","tag-lerna-pl","tag-nx-pl","tag-react-pl"],"acf":{"feature_image_visible":false,"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/Frame-1.png","feature_image_blog":{"ID":11420,"id":11420,"title":"pexels-tobias-schwebs-12957329-min","filename":"pexels-tobias-schwebs-12957329-min-scaled.jpg","filesize":469653,"url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/pexels-tobias-schwebs-12957329-min-scaled.jpg","link":"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/pexels-tobias-schwebs-12957329-min\/","alt":"","author":"12","description":"","caption":"","name":"pexels-tobias-schwebs-12957329-min","status":"inherit","uploaded_to":11405,"date":"2022-10-20 08:51:38","modified":"2022-10-20 08:51:38","menu_order":0,"mime_type":"image\/jpeg","type":"image","subtype":"jpeg","icon":"https:\/\/vived.io\/wp-includes\/images\/media\/default.png","width":2560,"height":1707,"sizes":{"thumbnail":"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/pexels-tobias-schwebs-12957329-min-150x150.jpg","thumbnail-width":150,"thumbnail-height":150,"medium":"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/pexels-tobias-schwebs-12957329-min-300x200.jpg","medium-width":300,"medium-height":200,"medium_large":"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/pexels-tobias-schwebs-12957329-min-768x512.jpg","medium_large-width":768,"medium_large-height":512,"large":"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/pexels-tobias-schwebs-12957329-min-1024x683.jpg","large-width":1024,"large-height":683,"1536x1536":"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/pexels-tobias-schwebs-12957329-min-1536x1024.jpg","1536x1536-width":1536,"1536x1536-height":1024,"2048x2048":"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/pexels-tobias-schwebs-12957329-min-2048x1365.jpg","2048x2048-width":2048,"2048x2048-height":1365,"gform-image-choice-sm":"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/pexels-tobias-schwebs-12957329-min-scaled.jpg","gform-image-choice-sm-width":300,"gform-image-choice-sm-height":200,"gform-image-choice-md":"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/pexels-tobias-schwebs-12957329-min-scaled.jpg","gform-image-choice-md-width":400,"gform-image-choice-md-height":267,"gform-image-choice-lg":"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/pexels-tobias-schwebs-12957329-min-scaled.jpg","gform-image-choice-lg-width":600,"gform-image-choice-lg-height":400}},"estimated_reading_time":"7"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Pobieranie danych w React ju\u017c nigdy nie b\u0119dzie takie samo - Frontend Weekly vol. 109 - 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\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pobieranie danych w React ju\u017c nigdy nie b\u0119dzie takie samo - Frontend Weekly vol. 109 - Vived\" \/>\n<meta property=\"og:description\" content=\"Zesp\u00f3\u0142 stoj\u0105cy za Reactem zaprezentowa\u0142 nowy hook o nazwie `use`. Ten niepozorny tw\u00f3r mo\u017ce na zawsze mo\u017ce zmieni\u0107 spos\u00f3b w jaki pobieramy dane do naszych aplikacji.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2022-10-20T10:37:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-10-20T10:37:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/Frame-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\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/\"},\"author\":{\"name\":\"Tomasz Borowicz\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb\"},\"headline\":\"Pobieranie danych w React ju\u017c nigdy nie b\u0119dzie takie samo &#8211; Frontend Weekly vol. 109\",\"datePublished\":\"2022-10-20T10:37:20+00:00\",\"dateModified\":\"2022-10-20T10:37:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/\"},\"wordCount\":1132,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/Frame-1.png\",\"keywords\":[\"Lerna\",\"Nx\",\"react\"],\"articleSection\":[\"Frontend\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/\",\"url\":\"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/\",\"name\":\"Pobieranie danych w React ju\u017c nigdy nie b\u0119dzie takie samo - Frontend Weekly vol. 109 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/Frame-1.png\",\"datePublished\":\"2022-10-20T10:37:20+00:00\",\"dateModified\":\"2022-10-20T10:37:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/Frame-1.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/Frame-1.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Pobieranie danych w React ju\u017c nigdy nie b\u0119dzie takie samo &#8211; Frontend Weekly vol. 109\"}]},{\"@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":"Pobieranie danych w React ju\u017c nigdy nie b\u0119dzie takie samo - Frontend Weekly vol. 109 - 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\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/","og_locale":"pl_PL","og_type":"article","og_title":"Pobieranie danych w React ju\u017c nigdy nie b\u0119dzie takie samo - Frontend Weekly vol. 109 - Vived","og_description":"Zesp\u00f3\u0142 stoj\u0105cy za Reactem zaprezentowa\u0142 nowy hook o nazwie `use`. Ten niepozorny tw\u00f3r mo\u017ce na zawsze mo\u017ce zmieni\u0107 spos\u00f3b w jaki pobieramy dane do naszych aplikacji.","og_url":"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/","og_site_name":"Vived","article_published_time":"2022-10-20T10:37:20+00:00","article_modified_time":"2022-10-20T10:37:22+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/Frame-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\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/"},"author":{"name":"Tomasz Borowicz","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb"},"headline":"Pobieranie danych w React ju\u017c nigdy nie b\u0119dzie takie samo &#8211; Frontend Weekly vol. 109","datePublished":"2022-10-20T10:37:20+00:00","dateModified":"2022-10-20T10:37:22+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/"},"wordCount":1132,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/Frame-1.png","keywords":["Lerna","Nx","react"],"articleSection":["Frontend"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/","url":"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/","name":"Pobieranie danych w React ju\u017c nigdy nie b\u0119dzie takie samo - Frontend Weekly vol. 109 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/Frame-1.png","datePublished":"2022-10-20T10:37:20+00:00","dateModified":"2022-10-20T10:37:22+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/Frame-1.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/Frame-1.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/pobieranie-danych-w-react-juz-nigdy-nie-bedzie-takie-samo-frontend-weekly-vol-109\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Pobieranie danych w React ju\u017c nigdy nie b\u0119dzie takie samo &#8211; Frontend Weekly vol. 109"}]},{"@type":"WebSite","@id":"https:\/\/vived.io\/pl\/#website","url":"https:\/\/vived.io\/pl\/","name":"Vived","description":"platform empowering IT people and technology companies to synergic growth","publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vived.io\/pl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/vived.io\/pl\/#organization","name":"Vived","url":"https:\/\/vived.io\/pl\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/","url":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","width":136,"height":45,"caption":"Vived"},"image":{"@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb","name":"Tomasz Borowicz","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/804536d2672538508d43f60ad2108e5aaea76c192653eaf95d4c3934b7d1dbb6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/804536d2672538508d43f60ad2108e5aaea76c192653eaf95d4c3934b7d1dbb6?s=96&d=mm&r=g","caption":"Tomasz Borowicz"}}]}},"blocks_vived":[{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>1. React z natywnym wsparciem dla Promise<\/h2>\n","innerContent":["\n<h2>1. React z natywnym wsparciem dla Promise<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Kolejne RFC (Request For Comments) zwyczajowo ju\u017c wzbudzaj\u0105 du\u017ce zainteresowanie w sieci. Nie inaczej by\u0142o i tym razem, bo nowo opublikowane RFC wprowadza do biblioteki natywne wsparcie dla Promis\u00f3w. Dla jednych zaproponowane rozwi\u0105zanie jest przekompilowane i niepotrzebne. Inni natomiast gloryfikuj\u0105 RFC do poziomu \u201costatniej brakuj\u0105cej funkcjonalno\u015bci Reacta\u201d. Jak to zwykle bywa prawda jest gdzie\u015b po\u015brodku, a my dzisiaj bli\u017cej przyjrzymy si\u0119 zaproponowanym nowo\u015bciom.<\/p>\n","innerContent":["\n<p>Kolejne RFC (Request For Comments) zwyczajowo ju\u017c wzbudzaj\u0105 du\u017ce zainteresowanie w sieci. Nie inaczej by\u0142o i tym razem, bo nowo opublikowane RFC wprowadza do biblioteki natywne wsparcie dla Promis\u00f3w. Dla jednych zaproponowane rozwi\u0105zanie jest przekompilowane i niepotrzebne. Inni natomiast gloryfikuj\u0105 RFC do poziomu \u201costatniej brakuj\u0105cej funkcjonalno\u015bci Reacta\u201d. Jak to zwykle bywa prawda jest gdzie\u015b po\u015brodku, a my dzisiaj bli\u017cej przyjrzymy si\u0119 zaproponowanym nowo\u015bciom.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Komponenty renderowane po stronie klienta<\/h3>\n","innerContent":["\n<h3>Komponenty renderowane po stronie klienta<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Widz\u0105c tytu\u0142 nowego RFC mo\u017cecie si\u0119 zastanawia\u0107 o co tak naprawd\u0119 chodzi. W ko\u0144cu React jest w pe\u0142ni kompatybilny z Promisami i zapewne wi\u0119kszo\u015b\u0107 z Was mia\u0142a przyjemno\u015b\u0107 napisa\u0107 kod podobny do tego:<\/p>\n","innerContent":["\n<p>Widz\u0105c tytu\u0142 nowego RFC mo\u017cecie si\u0119 zastanawia\u0107 o co tak naprawd\u0119 chodzi. W ko\u0144cu React jest w pe\u0142ni kompatybilny z Promisami i zapewne wi\u0119kszo\u015b\u0107 z Was mia\u0142a przyjemno\u015b\u0107 napisa\u0107 kod podobny do tego:<\/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\">async function fetchNote(id) {\n  const data = await fetchNoteFromBackend(id);\n  return data.json();\n}\n\nfunction Note({id}) {\n  const [note, setNote] = useState(null);\n  \n  useEffect(() => {\n    fetchNote(id).then(it => setNote(it))\n  }, [id])\n\n  if(note === null) {\n    return &lt;h1> Loading... &lt;\/h1>\n  } \n\n  return (     \n    &lt;div>\n      &lt;h1>{note.title}&lt;\/h1>\n      &lt;section>{note.body}&lt;\/section>\n    &lt;\/div>\n    );\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">async function fetchNote(id) {\n  const data = await fetchNoteFromBackend(id);\n  return data.json();\n}\n\nfunction Note({id}) {\n  const [note, setNote] = useState(null);\n  \n  useEffect(() => {\n    fetchNote(id).then(it => setNote(it))\n  }, [id])\n\n  if(note === null) {\n    return &lt;h1> Loading... &lt;\/h1>\n  } \n\n  return (     \n    &lt;div>\n      &lt;h1>{note.title}&lt;\/h1>\n      &lt;section>{note.body}&lt;\/section>\n    &lt;\/div>\n    );\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":11406,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-20.jpeg\" alt=\"\" class=\"wp-image-11406\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-20.jpeg\" alt=\"\" class=\"wp-image-11406\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Biblioteki takie jak React Query dostarczaj\u0105 odrobin\u0119 przyjemniejsze API, ale wci\u0105\u017c manualnie obs\u0142u\u017cy\u0107 musimy poszczeg\u00f3lne mo\u017cliwe stany Promsie<\/p>\n","innerContent":["\n<p>Biblioteki takie jak React Query dostarczaj\u0105 odrobin\u0119 przyjemniejsze API, ale wci\u0105\u017c manualnie obs\u0142u\u017cy\u0107 musimy poszczeg\u00f3lne mo\u017cliwe stany Promsie<\/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\">async function fetchNote(id) {\n  const data = await fetchNoteFromBackend(id);\n  return data.json();\n}\n\nfunction Note({id}) {\n     const query = useQuery(`note-{id}`, fetchNote)\n    \n     if(query.isLoading) {\n       return (&lt;h1> Loading... &lt;\/h1>);\n     }\n\n    return (\n      &lt;div>\n        &lt;h1>{query.data..title}&lt;\/h1>\n        &lt;section>{query.data.body}&lt;\/section>\n      &lt;\/div>\n    );\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">async function fetchNote(id) {\n  const data = await fetchNoteFromBackend(id);\n  return data.json();\n}\n\nfunction Note({id}) {\n     const query = useQuery(`note-{id}`, fetchNote)\n    \n     if(query.isLoading) {\n       return (&lt;h1> Loading... &lt;\/h1>);\n     }\n\n    return (\n      &lt;div>\n        &lt;h1>{query.data..title}&lt;\/h1>\n        &lt;section>{query.data.body}&lt;\/section>\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>Rozwi\u0105zanie, kt\u00f3re proponuje zesp\u00f3\u0142 stoj\u0105cy za Reactem, to wprowadzenie nowego hooka o nazwie `use`. Przy jego pomocy mo\u017cliwe jest odczytanie warto\u015bci fulfilled Promise, a obs\u0142uga b\u0142\u0119d\u00f3w i \u0142adowania oddelegowana zostanie do najbli\u017cszego Suspense. Taka architektura pozwala grupowa\u0107 komponenty w konteksty, kt\u00f3re s\u0105 gotowe do wyrenderowania dopiero kiedy wszystkie komponenty za\u0142aduj\u0105 dane.<\/p>\n","innerContent":["\n<p>Rozwi\u0105zanie, kt\u00f3re proponuje zesp\u00f3\u0142 stoj\u0105cy za Reactem, to wprowadzenie nowego hooka o nazwie `use`. Przy jego pomocy mo\u017cliwe jest odczytanie warto\u015bci fulfilled Promise, a obs\u0142uga b\u0142\u0119d\u00f3w i \u0142adowania oddelegowana zostanie do najbli\u017cszego Suspense. Taka architektura pozwala grupowa\u0107 komponenty w konteksty, kt\u00f3re s\u0105 gotowe do wyrenderowania dopiero kiedy wszystkie komponenty za\u0142aduj\u0105 dane.<\/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\">async function fetchNote(id) {\n  const data = await fetchNoteFromBackend(id, { useCache: true});\n  return data.json();\n}\n\nfunction Note({id}) {\n  const note = use(fetchNote(id));\n  return (\n    &lt;div>\n      &lt;h1>{note.title}&lt;\/h1>\n      &lt;section>{note.body}&lt;\/section>\n    &lt;\/div>\n  );\n}\n\nfunction App() {\n  return (\n    {\/* Loading will be displayed until all Notes fetch necessary data *\/}\n    &lt;Suspense fallback={&lt;h1>Loading\u2026&lt;\/h1>}>\n      &lt;Note id=\u201d1\u201d \/>\n      &lt;Note id=\u201d2\u201d \/>\n      &lt;Note id=\u201d3\u201d \/>\n    &lt;\/Suspense>\n  );\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">async function fetchNote(id) {\n  const data = await fetchNoteFromBackend(id, { useCache: true});\n  return data.json();\n}\n\nfunction Note({id}) {\n  const note = use(fetchNote(id));\n  return (\n    &lt;div>\n      &lt;h1>{note.title}&lt;\/h1>\n      &lt;section>{note.body}&lt;\/section>\n    &lt;\/div>\n  );\n}\n\nfunction App() {\n  return (\n    {\/* Loading will be displayed until all Notes fetch necessary data *\/}\n    &lt;Suspense fallback={&lt;h1>Loading\u2026&lt;\/h1>}>\n      &lt;Note id=\u201d1\u201d \/>\n      &lt;Note id=\u201d2\u201d \/>\n      &lt;Note id=\u201d3\u201d \/>\n    &lt;\/Suspense>\n  );\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":11408,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-19.jpeg\" alt=\"\" class=\"wp-image-11408\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-19.jpeg\" alt=\"\" class=\"wp-image-11408\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Warto zauwa\u017cy\u0107, \u017ce je\u015bli referencja do Promise zmieni si\u0119 mi\u0119dzy renderami, to ponownie wy\u015bwietlony zostanie fallback z komponentu Suspense. Jedynym wyj\u0105tkiem od tej regu\u0142y, jest przekazanie do `use` fulfilled Promise. W takiej sytuacji React od razu wy\u015bwietli wyrenderowany komponent. To oznacza, \u017ce aby unikn\u0105\u0107 niechcianego \u201cmrugania\u201d, niezb\u0119dne jest dodanie obs\u0142ugi cache. Mo\u017cemy w tej kwestii albo polega\u0107 na zewn\u0119trznych bibliotekach, albo po prostu&nbsp; skorzysta\u0107 `useMemo`. Na szcz\u0119\u015bcie zesp\u00f3\u0142 stoj\u0105cy za RFC obiecuj\u0119, \u017ce nied\u0142ugo zaprezentuje r\u00f3wnie\u017c API dedykowane temu \u0142atwiejszej obs\u0142ugi cache.<\/p>\n","innerContent":["\n<p>Warto zauwa\u017cy\u0107, \u017ce je\u015bli referencja do Promise zmieni si\u0119 mi\u0119dzy renderami, to ponownie wy\u015bwietlony zostanie fallback z komponentu Suspense. Jedynym wyj\u0105tkiem od tej regu\u0142y, jest przekazanie do `use` fulfilled Promise. W takiej sytuacji React od razu wy\u015bwietli wyrenderowany komponent. To oznacza, \u017ce aby unikn\u0105\u0107 niechcianego \u201cmrugania\u201d, niezb\u0119dne jest dodanie obs\u0142ugi cache. Mo\u017cemy w tej kwestii albo polega\u0107 na zewn\u0119trznych bibliotekach, albo po prostu&nbsp; skorzysta\u0107 `useMemo`. Na szcz\u0119\u015bcie zesp\u00f3\u0142 stoj\u0105cy za RFC obiecuj\u0119, \u017ce nied\u0142ugo zaprezentuje r\u00f3wnie\u017c API dedykowane temu \u0142atwiejszej obs\u0142ugi cache.<\/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\">async function fetchNote(id) {\n  const data = await fetchNoteFromBackend(id);\n  return data.json();\n}\n\nfunction Note({id}) {\n  const promise = useMemo(() => fetchNote(id), [id]);\n  const note = use(promise);\n  return (\n    &lt;div>\n      &lt;h1>{note.title}&lt;\/h1>\n      &lt;section>{note.body}&lt;\/section>\n    &lt;\/div>\n  );\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">async function fetchNote(id) {\n  const data = await fetchNoteFromBackend(id);\n  return data.json();\n}\n\nfunction Note({id}) {\n  const promise = useMemo(() => fetchNote(id), [id]);\n  const note = use(promise);\n  return (\n    &lt;div>\n      &lt;h1>{note.title}&lt;\/h1>\n      &lt;section>{note.body}&lt;\/section>\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>Je\u015bli my\u015blicie, \u017ce zrobi\u0142o si\u0119 skomplikowanie, to dopiero si\u0119 rozkr\u0119camy. `use` b\u0119dzie pierwszym i jedynym hookiem, kt\u00f3ry mo\u017ce by\u0107 u\u017cywany wewn\u0105trz instrukcji if czy p\u0119tli for.&nbsp;<\/p>\n","innerContent":["\n<p>Je\u015bli my\u015blicie, \u017ce zrobi\u0142o si\u0119 skomplikowanie, to dopiero si\u0119 rozkr\u0119camy. `use` b\u0119dzie pierwszym i jedynym hookiem, kt\u00f3ry mo\u017ce by\u0107 u\u017cywany wewn\u0105trz instrukcji if czy p\u0119tli for.&nbsp;<\/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\">function Note({id, shouldIncludeAuthor}) {\n  const note = use(fetchNote(id));\n\n  let byLine = null;\n  if (shouldIncludeAuthor) {\n    const author = use(fetchNoteAuthor(note.authorId));\n    byLine = &lt;h2>{author.displayName}&lt;\/h2>;\n  }\n\n  return (\n    &lt;div>\n      &lt;h1>{note.title}&lt;\/h1>\n      {byLine}\n      &lt;section>{note.body}&lt;\/section>\n    &lt;\/div>\n  );\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">function Note({id, shouldIncludeAuthor}) {\n  const note = use(fetchNote(id));\n\n  let byLine = null;\n  if (shouldIncludeAuthor) {\n    const author = use(fetchNoteAuthor(note.authorId));\n    byLine = &lt;h2>{author.displayName}&lt;\/h2>;\n  }\n\n  return (\n    &lt;div>\n      &lt;h1>{note.title}&lt;\/h1>\n      {byLine}\n      &lt;section>{note.body}&lt;\/section>\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>W przysz\u0142o\u015bci planowane jest r\u00f3wnie\u017c dodanie interfejsu Usable, kt\u00f3ry pozwoli wpakowa\u0107 do hooka co nam si\u0119 \u017cywnie podoba. Autorzy RFC jako przyk\u0142ad podaj\u0105 kontekst. Je\u015bli ich plany wejd\u0105 w \u017cycie, to w API znajdziemy zar\u00f3wno use(Context) jak i useContext(Context). Tego pierwszego b\u0119dzie mo\u017cna u\u017cywa\u0107 wewn\u0105trz instrukcji warunkowych, ale tego drugiego ju\u017c nie.&nbsp;<\/p>\n","innerContent":["\n<p>W przysz\u0142o\u015bci planowane jest r\u00f3wnie\u017c dodanie interfejsu Usable, kt\u00f3ry pozwoli wpakowa\u0107 do hooka co nam si\u0119 \u017cywnie podoba. Autorzy RFC jako przyk\u0142ad podaj\u0105 kontekst. Je\u015bli ich plany wejd\u0105 w \u017cycie, to w API znajdziemy zar\u00f3wno use(Context) jak i useContext(Context). Tego pierwszego b\u0119dzie mo\u017cna u\u017cywa\u0107 wewn\u0105trz instrukcji warunkowych, ale tego drugiego ju\u017c nie.&nbsp;<\/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\">\/\/ \u2705 This will work fine\nfunction Author({display}) {\n  if (display) {\n    const authors = use(AuthorsContext);\n    return &lt;h2>{authors[note.authorId]}&lt;\/h2>;\n  } else {\n    return null\n  }\n\n\/\/ \ud83d\uded1 This will not work\nfunction Author({display}) {\n  if (display) {\n    const authors = useContext(AuthorsContext);\n    return &lt;h2>{authors[note.authorId]}&lt;\/h2>;\n  } else {\n    return null\n  }\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">\/\/ \u2705 This will work fine\nfunction Author({display}) {\n  if (display) {\n    const authors = use(AuthorsContext);\n    return &lt;h2>{authors[note.authorId]}&lt;\/h2>;\n  } else {\n    return null\n  }\n\n\/\/ \ud83d\uded1 This will not work\nfunction Author({display}) {\n  if (display) {\n    const authors = useContext(AuthorsContext);\n    return &lt;h2>{authors[note.authorId]}&lt;\/h2>;\n  } else {\n    return null\n  }\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":11410,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-22.jpeg\" alt=\"\" class=\"wp-image-11410\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-22.jpeg\" alt=\"\" class=\"wp-image-11410\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Komponenty renderowane po stronie serwera<\/h3>\n","innerContent":["\n<h3>Komponenty renderowane po stronie serwera<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Druga zaprezentowana w RFC nowo\u015b\u0107 dotyczy React Server Component. Z racji tego, \u017ce p\u00f3ki co s\u0105 one eksperymentaln\u0105 cz\u0119\u015bci\u0105 biblioteki zatrzymajmy si\u0119 na chwil\u0119, \u017ceby przypomnie\u0107 sobie czym w\u0142a\u015bciwie s\u0105.&nbsp;<\/p>\n","innerContent":["\n<p>Druga zaprezentowana w RFC nowo\u015b\u0107 dotyczy React Server Component. Z racji tego, \u017ce p\u00f3ki co s\u0105 one eksperymentaln\u0105 cz\u0119\u015bci\u0105 biblioteki zatrzymajmy si\u0119 na chwil\u0119, \u017ceby przypomnie\u0107 sobie czym w\u0142a\u015bciwie s\u0105.&nbsp;<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Koncepcja ta po raz pierwszy zaprezentowana zosta\u0142a pod koniec 2020 roku. Server Components umo\u017cliwiaj\u0105 wyrenderowanie cz\u0119\u015bci drzewa komponent\u00f3w po stronie klienta i cz\u0119\u015b\u0107 po stronie serwera. Komponenty wyrenderowane po stronie serwera przesy\u0142ane s\u0105 jako strumie\u0144 HTML, co pozwala odchudzi\u0107 paczk\u0119 wys\u0142an\u0105 do klienta. Taka architektura pozwala te\u017c dobra\u0107 si\u0119 do typowo serwerowych funkcji (na przyk\u0142ad do bazy danych, czy systemu plik\u00f3w) bezpo\u015brednio z poziomu kodu komponentu.<\/p>\n","innerContent":["\n<p>Koncepcja ta po raz pierwszy zaprezentowana zosta\u0142a pod koniec 2020 roku. Server Components umo\u017cliwiaj\u0105 wyrenderowanie cz\u0119\u015bci drzewa komponent\u00f3w po stronie klienta i cz\u0119\u015b\u0107 po stronie serwera. Komponenty wyrenderowane po stronie serwera przesy\u0142ane s\u0105 jako strumie\u0144 HTML, co pozwala odchudzi\u0107 paczk\u0119 wys\u0142an\u0105 do klienta. Taka architektura pozwala te\u017c dobra\u0107 si\u0119 do typowo serwerowych funkcji (na przyk\u0142ad do bazy danych, czy systemu plik\u00f3w) bezpo\u015brednio z poziomu kodu komponentu.<\/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 fs from 'react-fs';\nimport db from 'db.server';\n\nfunction FileNote({id}) {\n  const note = JSON.parse(fs.readFile(`${id}.json`));\n  return &lt;NoteWithMarkdown note={note} \/>;\n}\n\nfunction DatabaseNote({id}) {\n  const note = db.notes.get(id);\n  return &lt;NoteWithMarkdown note={note} \/>;\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">import fs from 'react-fs';\nimport db from 'db.server';\n\nfunction FileNote({id}) {\n  const note = JSON.parse(fs.readFile(`${id}.json`));\n  return &lt;NoteWithMarkdown note={note} \/>;\n}\n\nfunction DatabaseNote({id}) {\n  const note = db.notes.get(id);\n  return &lt;NoteWithMarkdown note={note} \/>;\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":11412,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/6xl7is.jpeg\" alt=\"\" class=\"wp-image-11412\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/6xl7is.jpeg\" alt=\"\" class=\"wp-image-11412\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli szukacie materia\u0142\u00f3w, kt\u00f3re pozwol\u0105 Wam lepiej zrozumie\u0107 koncepcj\u0119 Server Components, to nieustannie rekomenduj\u0119 <a href=\"https:\/\/www.youtube.com\/watch?v=TQQPAU21ZUw\">oryginaln\u0105 prezentacj\u0119 z 2020 roku<\/a>. Wszystkich bardziej zdeterminowanych odsy\u0142am natomiast do <a href=\"https:\/\/github.com\/josephsavona\/rfcs\/blob\/server-components\/text\/0000-server-components.md\">d\u0142ugiego i obszernego RFC<\/a>.<\/p>\n","innerContent":["\n<p>Je\u015bli szukacie materia\u0142\u00f3w, kt\u00f3re pozwol\u0105 Wam lepiej zrozumie\u0107 koncepcj\u0119 Server Components, to nieustannie rekomenduj\u0119 <a href=\"https:\/\/www.youtube.com\/watch?v=TQQPAU21ZUw\">oryginaln\u0105 prezentacj\u0119 z 2020 roku<\/a>. Wszystkich bardziej zdeterminowanych odsy\u0142am natomiast do <a href=\"https:\/\/github.com\/josephsavona\/rfcs\/blob\/server-components\/text\/0000-server-components.md\">d\u0142ugiego i obszernego RFC<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Sporym brakiem Server Components by\u0142a do tej pory przyjazna obs\u0142uga asynchronicznych akcji, tak typowych dla serwerowych operacji. Nowo zaprezentowane RFC adresuje ten problem umo\u017cliwiaj\u0105c korzystanie z natywnej sk\u0142adni async\/await. Jedynym zastrze\u017ceniem jest fakt, \u017ce komponenty u\u017cywaj\u0105ce async\/await nie mog\u0105 wykorzystywa\u0107 hook\u00f3w.<\/p>\n","innerContent":["\n<p>Sporym brakiem Server Components by\u0142a do tej pory przyjazna obs\u0142uga asynchronicznych akcji, tak typowych dla serwerowych operacji. Nowo zaprezentowane RFC adresuje ten problem umo\u017cliwiaj\u0105c korzystanie z natywnej sk\u0142adni async\/await. Jedynym zastrze\u017ceniem jest fakt, \u017ce komponenty u\u017cywaj\u0105ce async\/await nie mog\u0105 wykorzystywa\u0107 hook\u00f3w.<\/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\">async function Note({id, isEditing}) {\n  const note = await db.posts.get(id);\n  return (\n    &lt;div>\n      &lt;h1>{note.title}&lt;\/h1>\n      &lt;section>{note.body}&lt;\/section>\n    &lt;\/div>\n  );\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">async function Note({id, isEditing}) {\n  const note = await db.posts.get(id);\n  return (\n    &lt;div>\n      &lt;h1>{note.title}&lt;\/h1>\n      &lt;section>{note.body}&lt;\/section>\n    &lt;\/div>\n  );\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Niezale\u017cnie od tego, czy zaproponowane zmiany przypad\u0142y Wam do gustu, czy nie pami\u0119tajmy, \u017ce nie nale\u017cy popada\u0107 w skrajne emocje. Zanim RFC zostanie wdro\u017cone najprawdopodobniej up\u0142ynie sporo czasu i raczej mo\u017cemy spodziewa\u0107 si\u0119 kilku zmian w specyfikacji. Odrzuca\u0107 nie mo\u017cemy r\u00f3wnie\u017c scenariusza, w kt\u00f3rym `use` podzieli los `useEvent` i pomimo pocz\u0105tkowego optymizmu nigdy nie ujrzy \u015bwiat\u0142a dziennego w opisanej tu dzisiaj postaci.<\/p>\n","innerContent":["\n<p>Niezale\u017cnie od tego, czy zaproponowane zmiany przypad\u0142y Wam do gustu, czy nie pami\u0119tajmy, \u017ce nie nale\u017cy popada\u0107 w skrajne emocje. Zanim RFC zostanie wdro\u017cone najprawdopodobniej up\u0142ynie sporo czasu i raczej mo\u017cemy spodziewa\u0107 si\u0119 kilku zmian w specyfikacji. Odrzuca\u0107 nie mo\u017cemy r\u00f3wnie\u017c scenariusza, w kt\u00f3rym `use` podzieli los `useEvent` i pomimo pocz\u0105tkowego optymizmu nigdy nie ujrzy \u015bwiat\u0142a dziennego w opisanej tu dzisiaj postaci.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/github.com\/reactjs\/rfcs\/pull\/229\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/reactjs\/rfcs\/pull\/229<\/a><br><a href=\"https:\/\/github.com\/acdlite\/rfcs\/blob\/first-class-promises\/text\/0000-first-class-support-for-promises.md\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/acdlite\/rfcs\/blob\/first-class-promises\/text\/0000-first-class-support-for-promises.md<\/a><br><a href=\"https:\/\/www.youtube.com\/watch?v=ytXM05PVcFU\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.youtube.com\/watch?v=ytXM05PVcFU<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/github.com\/reactjs\/rfcs\/pull\/229\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/reactjs\/rfcs\/pull\/229<\/a><br><a href=\"https:\/\/github.com\/acdlite\/rfcs\/blob\/first-class-promises\/text\/0000-first-class-support-for-promises.md\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/acdlite\/rfcs\/blob\/first-class-promises\/text\/0000-first-class-support-for-promises.md<\/a><br><a href=\"https:\/\/www.youtube.com\/watch?v=ytXM05PVcFU\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.youtube.com\/watch?v=ytXM05PVcFU<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>2. Lerna wstaje z martwych<\/h2>\n","innerContent":["\n<h2>2. Lerna wstaje z martwych<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Lerna to rozwi\u0105zanie do zarz\u0105dzania monorepo, kt\u00f3re przez by\u0142o monopolist\u0105 w kategorii JavaScript. Na przestrzeni kilku ostatnich lat projekt napotka\u0142 jednak spore turbulencje. W po\u0142owie 2020 roku w repozytorium lerny pojawi\u0142o si\u0119 Issue m\u00f3wi\u0105ce, \u017ce narz\u0119dzie nie jest ju\u017c aktywnie wspierane. Patrz\u0105c na histori\u0119 commit\u00f3w ci\u0119\u017cko nie zgodzi\u0107 \u2013 wi\u0119kszo\u015b\u0107 zmian dotyczy aktualizacji zale\u017cno\u015bci oraz napraw krytycznych podatno\u015bci. W efekcie d\u0142ugich dyskusji do readme trafi\u0142 zapis informuj\u0105cy o ko\u0144cu wsparcia dla projektu.&nbsp;<\/p>\n","innerContent":["\n<p>Lerna to rozwi\u0105zanie do zarz\u0105dzania monorepo, kt\u00f3re przez by\u0142o monopolist\u0105 w kategorii JavaScript. Na przestrzeni kilku ostatnich lat projekt napotka\u0142 jednak spore turbulencje. W po\u0142owie 2020 roku w repozytorium lerny pojawi\u0142o si\u0119 Issue m\u00f3wi\u0105ce, \u017ce narz\u0119dzie nie jest ju\u017c aktywnie wspierane. Patrz\u0105c na histori\u0119 commit\u00f3w ci\u0119\u017cko nie zgodzi\u0107 \u2013 wi\u0119kszo\u015b\u0107 zmian dotyczy aktualizacji zale\u017cno\u015bci oraz napraw krytycznych podatno\u015bci. W efekcie d\u0142ugich dyskusji do readme trafi\u0142 zapis informuj\u0105cy o ko\u0144cu wsparcia dla projektu.&nbsp;<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":11414,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-24.jpeg\" alt=\"\" class=\"wp-image-11414\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-24.jpeg\" alt=\"\" class=\"wp-image-11414\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Przez ostatnie dwa lata na miejscu Lerny wyrasta\u0107 zacz\u0119\u0142y nowe alternatywy. Zar\u00f3wno yarn jak i npm przygotowa\u0142y natywne wsparcie dla monorepo w postaci workspaces. Nie zabrak\u0142o te\u017c narz\u0119dzi oferuj\u0105cych obs\u0142ug\u0119 bardziej zaawansowanych funkcjonalno\u015bci w postaci Nx i TurboRepo. Ten pierwszy zreszt\u0105 w kwietniu tego roku wyprzedzi\u0142 Lern\u0119 pod wzgl\u0119dem pobra\u0144 z npm. Chwil\u0119 po tym fakcie zdarzy\u0142o si\u0119 co\u015b zupe\u0142nie niespodziewanego - firma stoj\u0105ca za rozwojem Nx og\u0142osi\u0142a, \u017ce zamierza zaj\u0105\u0107 si\u0119 r\u00f3wnie\u017c rozwojem Lerny.&nbsp;<\/p>\n","innerContent":["\n<p>Przez ostatnie dwa lata na miejscu Lerny wyrasta\u0107 zacz\u0119\u0142y nowe alternatywy. Zar\u00f3wno yarn jak i npm przygotowa\u0142y natywne wsparcie dla monorepo w postaci workspaces. Nie zabrak\u0142o te\u017c narz\u0119dzi oferuj\u0105cych obs\u0142ug\u0119 bardziej zaawansowanych funkcjonalno\u015bci w postaci Nx i TurboRepo. Ten pierwszy zreszt\u0105 w kwietniu tego roku wyprzedzi\u0142 Lern\u0119 pod wzgl\u0119dem pobra\u0144 z npm. Chwil\u0119 po tym fakcie zdarzy\u0142o si\u0119 co\u015b zupe\u0142nie niespodziewanego - firma stoj\u0105ca za rozwojem Nx og\u0142osi\u0142a, \u017ce zamierza zaj\u0105\u0107 si\u0119 r\u00f3wnie\u017c rozwojem Lerny.&nbsp;<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":11416,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/giphy-9.gif\" alt=\"\" class=\"wp-image-11416\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/giphy-9.gif\" alt=\"\" class=\"wp-image-11416\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Od czasu og\u0142oszenia przej\u0119cia projektu w nasze r\u0119ce trafi\u0142y ju\u017c dwie du\u017ce wersje narz\u0119dzia. Pierwsza, jeszcze w maju tego roku, podbi\u0142a kluczowe dependencje i usuwa\u0142a fa\u0142szywe ostrze\u017cenia rzucane w konsoli. Druga opublikowana w zesz\u0142ym tygodniu jest pierwsz\u0105 wersj\u0105 od ponad dw\u00f3ch lat, kt\u00f3ra wprowadza nowe funkcjonalno\u015bci. W\u015br\u00f3d nich znajdziemy<\/p>\n","innerContent":["\n<p>Od czasu og\u0142oszenia przej\u0119cia projektu w nasze r\u0119ce trafi\u0142y ju\u017c dwie du\u017ce wersje narz\u0119dzia. Pierwsza, jeszcze w maju tego roku, podbi\u0142a kluczowe dependencje i usuwa\u0142a fa\u0142szywe ostrze\u017cenia rzucane w konsoli. Druga opublikowana w zesz\u0142ym tygodniu jest pierwsz\u0105 wersj\u0105 od ponad dw\u00f3ch lat, kt\u00f3ra wprowadza nowe funkcjonalno\u015bci. W\u015br\u00f3d nich znajdziemy<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[],"innerHTML":"\n<ul><li>W\u0142\u0105czenie obs\u0142ugi cachowania&nbsp; paczek przy pomocy nx domy\u015blnie dla wszystkich modu\u0142\u00f3w<\/li><li>Dodanie obs\u0142ugi zdalnego cache na wz\u00f3r tego znanego z nx<\/li><li>Mo\u017cliwo\u015b\u0107 definiowania zale\u017cno\u015bci mi\u0119dzy modu\u0142ami, przy pomocy konfiguracji umieszczonej w&nbsp; pliku `nx.json`<\/li><li>Wsparcie dla pnpm<\/li><li>Dynamiczne wyj\u015bcie terminala na wz\u00f3r tego z nx<\/li><li>Dedykowane VSCode extension, mocno przypominaj\u0105ce to znane z nx<\/li><\/ul>\n","innerContent":["\n<ul><li>W\u0142\u0105czenie obs\u0142ugi cachowania&nbsp; paczek przy pomocy nx domy\u015blnie dla wszystkich modu\u0142\u00f3w<\/li><li>Dodanie obs\u0142ugi zdalnego cache na wz\u00f3r tego znanego z nx<\/li><li>Mo\u017cliwo\u015b\u0107 definiowania zale\u017cno\u015bci mi\u0119dzy modu\u0142ami, przy pomocy konfiguracji umieszczonej w&nbsp; pliku `nx.json`<\/li><li>Wsparcie dla pnpm<\/li><li>Dynamiczne wyj\u015bcie terminala na wz\u00f3r tego z nx<\/li><li>Dedykowane VSCode extension, mocno przypominaj\u0105ce to znane z nx<\/li><\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":11418,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-23.jpeg\" alt=\"\" class=\"wp-image-11418\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/10\/download-23.jpeg\" alt=\"\" class=\"wp-image-11418\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jak widzicie, sporo z nowych funkcjonalno\u015bci tworzona jest na wz\u00f3r nx lub wr\u0119cz dodaje integracj\u0119 z nx. Nie ma w tym nic z\u0142ego, ale ja osobi\u015bcie troch\u0119 \u017ca\u0142uj\u0119, \u017ce Lerna nie rozwija nowych funkcjonalno\u015bci r\u00f3wnolegle do nx. W ko\u0144cu wi\u0119ksza r\u00f3\u017cnorodno\u015b\u0107 od zawsze nap\u0119dzaj\u0105 innowacje. Na szcz\u0119\u015bcie na rynku mamy jeszcze TurboRepo, wi\u0119c stagnacji w obszarze monorepo na razie nie musimy si\u0119 obawia\u0107.<\/p>\n","innerContent":["\n<p>Jak widzicie, sporo z nowych funkcjonalno\u015bci tworzona jest na wz\u00f3r nx lub wr\u0119cz dodaje integracj\u0119 z nx. Nie ma w tym nic z\u0142ego, ale ja osobi\u015bcie troch\u0119 \u017ca\u0142uj\u0119, \u017ce Lerna nie rozwija nowych funkcjonalno\u015bci r\u00f3wnolegle do nx. W ko\u0144cu wi\u0119ksza r\u00f3\u017cnorodno\u015b\u0107 od zawsze nap\u0119dzaj\u0105 innowacje. Na szcz\u0119\u015bcie na rynku mamy jeszcze TurboRepo, wi\u0119c stagnacji w obszarze monorepo na razie nie musimy si\u0119 obawia\u0107.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/blog.nrwl.io\/lerna-reborn-whats-new-in-v6-10aec6e9091c\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/blog.nrwl.io\/lerna-reborn-whats-new-in-v6-10aec6e9091c<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/blog.nrwl.io\/lerna-reborn-whats-new-in-v6-10aec6e9091c\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/blog.nrwl.io\/lerna-reborn-whats-new-in-v6-10aec6e9091c<\/a><\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/11405","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=11405"}],"version-history":[{"count":9,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/11405\/revisions"}],"predecessor-version":[{"id":11447,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/11405\/revisions\/11447"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/11422"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=11405"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=11405"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=11405"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}