{"id":9965,"date":"2022-05-26T17:46:47","date_gmt":"2022-05-26T15:46:47","guid":{"rendered":"https:\/\/vived.io\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/"},"modified":"2022-09-19T13:16:28","modified_gmt":"2022-09-19T11:16:28","slug":"frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/","title":{"rendered":"Frontend Thursday vol. 89 &#8211; koniec monopolu WebKit na iOS, Lerna wraca do \u017cywych, TypeScript 4.7"},"content":{"rendered":"\n<h2 id=\"1-koniec-monopolu-webkit-na-ios\" data-num=1>1. Koniec monopolu WebKit na iOS<\/h2>\n\n\n\n<p>Nie od dzi\u015b wiadomo, \u017ce Safari to nowy Internet Explorer. Web deweloperzy nieustannie narzekaj\u0105 na to, \u017ce przegl\u0105darka od Apple jest mocno w tyle &#8211; zar\u00f3wno je\u015bli chodzi o nowe funkcjonalno\u015bci jak i ilo\u015b\u0107 drobnych b\u0142\u0119d\u00f3w i glitchy. Skutkuje to oczywi\u015bcie regularnymi problemami z dzia\u0142aniem niekt\u00f3rych aplikacji na Safari (kto pr\u00f3bowa\u0142 korzysta\u0107 na niej z Google Meet ten wie).&nbsp;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e5456dd.jpg\" alt=\"\"\/><\/figure><\/div>\n\n\n<p>O ile na komputerach nie jest to krytyczny problem (bo zawsze mo\u017cna odpali\u0107 inn\u0105 przegl\u0105dark\u0119), o tyle na telefonach z jab\u0142uszkiem sytuacja nie wygl\u0105da ju\u017c tak kolorowo. Zgodnie z regulaminem App Store, wszystkie przegl\u0105darki zmuszone s\u0105 do wykorzystywania silnika WebKit przygotowanego przez Apple. Do tej pory jako deweloperom nie pozosta\u0142o nam nic innego jak przyk\u0142ada\u0107 szczeg\u00f3ln\u0105 uwag\u0119 do tej przegl\u0105darki, a jako u\u017cytkownicy pozostawali\u015bmy bezbronni. W zesz\u0142ym tygodniu do gry wkroczy\u0142a Unia Europejska i by\u0107 mo\u017ce czeka nas spora zmiana sytuacji na rynku.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e5967ff.jpg\" alt=\"\" width=\"-163\" height=\"-91\"\/><\/figure><\/div>\n\n\n<p>W r\u0119ce portalu \u201cThe Register\u201d trafi\u0142a nie upubliczniona wersja Digital Markets Act (DMA). Wed\u0142ug portalu najnowsza wersja tego przygotowanego przez Uni\u0119 Europejsk\u0105 prawodawstwa zawiera zapis zmuszaj\u0105cy Apple do zaakceptowania na systemie iOS autorskich silnik\u00f3w przegl\u0105darek.&nbsp;<\/p>\n\n\n\n<p>Jakie konsekwencje mia\u0142oby wej\u015bcie w \u017cycie takiego prawodawstwa? Przede wszystkim zyskamy mo\u017cliwo\u015b\u0107 ucieczki z podbramkowych sytuacji, kiedy kolejna aplikacja odmawia nam wsp\u00f3\u0142pracy. Poza tym na iPhone zawita w ko\u0144cu wiele od dawna wyczekiwanych funkcjonalno\u015bci jak chocia\u017cby push notyfikacje. Po\u015brednio, w zwi\u0105zku z pojawieniem si\u0119 konkurencji, mo\u017ce to zmusi\u0107 Apple do szybszego iterowania nad swoj\u0105 przegl\u0105dark\u0105. Innymi s\u0142owy &#8211; jako u\u017cytkownicy i deweloperzy definitywnie wygrywamy.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e5f17fb.jpg\" alt=\"\"\/><\/figure><\/div>\n\n\n<p>Zanim przejdziemy do szczeg\u00f3\u0142\u00f3w dotycz\u0105cych szans wej\u015bcia przepis\u00f3w w \u017cycie, om\u00f3wmy sobie czym w\u0142a\u015bciwie jest DMA. Cytuj\u0105c za wikipedi\u0105 jest to \u201cpropozycja legislacyjna Komisji Europejskiej, kt\u00f3ra ma na celu zwi\u0119kszenie konkurencji na europejskich rynkach cyfrowych, poprzez uniemo\u017cliwienie du\u017cym firmom nadu\u017cywania ich si\u0142y rynkowej i umo\u017cliwienie nowym graczom wej\u015bcia na rynek\u201d. Je\u015bli o wasze uszy obi\u0142y si\u0119 plotki takie jak iPhone z z\u0142\u0105czem USB-C, czy dodanie do Androida mo\u017cliwo\u015bci usuwania pre-instalowanych aplikacji, to wywodzi\u0142y si\u0119 one w\u0142a\u015bnie z zapis\u00f3w w DMA.<\/p>\n\n\n\n<p>Prace nad DMA trwaj\u0105 ju\u017c od 2020 roku i od samego pocz\u0105tku towarzyszy im niesamowity lobbing ze strony technologicznych gigant\u00f3w. Ponownie cytuj\u0105c za wikipedi\u0105, Google zarezerwowa\u0142 na ten cel 8M$, a Apple 2M$. Warto nadmieni\u0107, \u017ce nie jest to gra z jasno ustalonymi dru\u017cynami: Big Tech vs Unia Europejska. Dla przyk\u0142adu Facebook z ustaw\u0105 wi\u0105\u017ce du\u017ce nadzieje na wyj\u015bcie z impasu zabraniaj\u0105cego im w celach reklamowych zbiera\u0107 dane o u\u017cytkownikach na iOS, ale r\u00f3wnocze\u015bnie nie odpowiadaj\u0105 mu inne zapisy w ustawie. Mo\u017cna wi\u0119c powiedzie\u0107, \u017ce mamy tutaj do czynienia z gr\u0105 ka\u017cdy na ka\u017cdego.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e675b93.jpg\" alt=\"\"\/><\/figure><\/div>\n\n\n<p>Po d\u0142ugich negocjacjach w marcu tego roku wreszcie uda\u0142o si\u0119 ustali\u0107 ostateczn\u0105 posta\u0107 legislacji, a 22 maja upubliczniono przygotowane dokumenty. Przecieki jakie otrzyma\u0142 portal \u201cThe Register\u201d dotycz\u0105 poprawek do opublikowanych kilka dni temu dokument\u00f3w i do tej pory nie zosta\u0142y jeszcze potwierdzone. Aby legislacje DMA wesz\u0142y w \u017cycie musz\u0105 zosta\u0107 zatwierdzone zar\u00f3wno przez Rad\u0119 Unii Europejskiej jak i Parlament Europejski. Spekuluje si\u0119, \u017ce najwcze\u015bniej nast\u0105pi to pocz\u0105tkiem 2023 roku.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e6c60f0.jpg\" alt=\"\"\/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a:<\/h3>\n\n\n\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Digital_Markets_Act\">https:\/\/en.wikipedia.org\/wiki\/Digital_Markets_Act<\/a><br><a href=\"https:\/\/pl.wikipedia.org\/wiki\/Digital_Markets_Act\">https:\/\/pl.wikipedia.org\/wiki\/Digital_Markets_Act<\/a><br><a href=\"https:\/\/www.theregister.com\/2022\/04\/26\/apple_ios_browser\/\">https:\/\/www.theregister.com\/2022\/04\/26\/apple_ios_browser\/<\/a><\/p>\n\n\n\n<h2 id=\"2-lerna-wraca-do-zywych\" data-num=2>2. Lerna wraca do \u017cywych<\/h2>\n\n\n\n<p>Lerna to rozwi\u0105zanie do zarz\u0105dzania monorepo, kt\u00f3re przez lata by\u0142o bardzo popularne w \u015bwiecie JavaScript. Na przestrzeni kilku ostatnich lat projekt napotka\u0142 spore turbulencje. W po\u0142owie 2020 roku w repozytorium lerny pojawi\u0142o si\u0119 Issue sugeruj\u0105ce, \u017ce narz\u0119dzie nie jest ju\u017c aktywnie wspierane. Patrz\u0105c na histori\u0119 commit\u00f3w ci\u0119\u017cko nie zgodzi\u0107 &#8211; 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\n<p>Przez ostatnie dwa lata na miejscu Lerny wyrasta\u0107 zacz\u0119\u0142y nowe alternatywy. Cz\u0119\u015b\u0107 u\u017cytkownik\u00f3w postanowi\u0142a przerzuci\u0107 si\u0119 na rozwi\u0105zania oferowane przez managery paczek, czyli odpowiednio `npm workspaces` i `yarn workspaces`. U\u017cytkownicy szukaj\u0105cy bardziej zaawansowanych funkcjonalno\u015bci zacz\u0119li natomiast powoli odp\u0142ywa\u0107 w stron\u0119 Nx, kt\u00f3ry powoli z narz\u0119dzia dedykowanego dla Angulara zmienia\u0142 si\u0119 w narz\u0119dzie niezale\u017cne od frameworku. W kwietniu tego roku Nx w ko\u0144cu wyprzedzi\u0142 Lern\u0119 w ilo\u015bci pobra\u0144 z npm i sta\u0142 si\u0119 najpopularniejszym narz\u0119dziem do zarz\u0105dzania JavaScriptowym monorepo.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e72a909.png\" alt=\"\" width=\"644\" height=\"364\"\/><\/figure><\/div>\n\n\n<p>Dla formalno\u015bci nadmienie jeszcze, \u017ce ostatnio w grze pojawi\u0142 si\u0119 nowy gracz w postaci TurboRepo. Projekt zosta\u0142 zakupiony w zesz\u0142ym roku przez Vercela, co wi\u0105za\u0142o si\u0119 zapewne ze sporym zastrzykiem got\u00f3wki. Nie zmienia to jednak faktu, \u017ce projekt wci\u0105\u017c znajduje si\u0119 na dosy\u0107 wczesnym etapie rozwoju i nie rozwin\u0105\u0142 jeszcze w ca\u0142o\u015bci swoich mo\u017cliwo\u015bci.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e882c76.jpg\" alt=\"\"\/><\/figure><\/div>\n\n\n<p>Wr\u00f3\u0107my jednak do tematu Lerny. Po prawie dw\u00f3ch latach stagnacji, wydarzy\u0142o si\u0119 niespodziewane &#8211; projekt wr\u00f3ci\u0142 do \u017cycia. Co jeszcze dziwniejsze zosta\u0142 on wskrzeszony przez firm\u0119 Nrwl, czyli autor\u00f3w uzyskuj\u0105cego obecnie na popularno\u015bci Nx\u2019a. Oznacza to, \u017ce dwa najpopularniejsze narz\u0119dzie do zarz\u0105dzania monorepo s\u0105 obecnie w r\u0119kach jednej firmy.&nbsp;<\/p>\n\n\n\n<p>Jak wynika z notatki dotycz\u0105cej przej\u0119cia lerny, ma by\u0107 ona aktywnie rozwijana. Kr\u00f3tkoterminowo firma zamierza skupi\u0107 si\u0119 na naprawieniu krytycznych b\u0142\u0119d\u00f3w i podatno\u015bci, natomiast d\u0142ugoterminowo wprowadzane b\u0119d\u0105 funkcjonalno\u015bci, kt\u00f3re umo\u017cliwi\u0105 bezproblemow\u0105 integracj\u0119 mi\u0119dzy Lern\u0105 i Nx\u2019em. Jeszcze nie wiadomo co to dok\u0142adnie oznacza, ale na m\u00f3j \u201cch\u0142opski rozum\u201d&nbsp; mo\u017cemy spodziewa\u0107 si\u0119, \u017ce migracja do Nx stanie si\u0119 jeszcze prostsza, a Lerna b\u0119dzie raczej utrzymywana ni\u017c rozwijana.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e8dcf1c.jpg\" alt=\"\"\/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a:<\/h3>\n\n\n\n<p><a href=\"https:\/\/blog.nrwl.io\/lerna-is-dead-long-live-lerna-61259f97dbd9\">https:\/\/blog.nrwl.io\/lerna-is-dead-long-live-lerna-61259f97dbd9<\/a><br><a href=\"https:\/\/www.npmtrends.com\/lerna-vs-nx\">https:\/\/www.npmtrends.com\/lerna-vs-nx<\/a><br><a href=\"https:\/\/github.com\/lerna\/lerna\/issues\/2703\">https:\/\/github.com\/lerna\/lerna\/issues\/2703<\/a><\/p>\n\n\n\n<h2 id=\"3-nowy-system-renderowania-zmierza-do-next-js\" data-num=3>3. Nowy system renderowania zmierza do Next.js<\/h2>\n\n\n\n<p>W minionym tygodniu zaprezentowane zosta\u0142o RFC nowej funkcjonalno\u015bci w Next.js &#8211;&nbsp; Layouts. Ma ona umo\u017cliwi\u0107 \u0142atwiejsze budowanie aplikacji z zagnie\u017cd\u017conymi \u015bcie\u017ckami.&nbsp;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e948829.gif\" alt=\"\"\/><figcaption>Nowe funkcjonalno\u015bci Next.js rosn\u0105 jak na dro\u017cd\u017cach. Nic dziwnego je\u015bli firma matka projektu w ostatniej rundzie finansowania zgarn\u0119\u0142a 150M$<\/figcaption><\/figure><\/div>\n\n\n<p>Do tej pory routing w Next.js oparty by\u0142 o struktur\u0119 katalog\u00f3w. Aby wyrenderowa\u0107 stron\u0119 `\/home\/about` nale\u017ca\u0142o w katalogu `\/home\/about` umie\u015bci\u0107 plik index.js, kt\u00f3ry eksportowa\u0142 reactowy komponent. Architektura taka by\u0142a bardzo wygodna, ale wymaga\u0142a sporej dozy powtarzalno\u015bci (ka\u017cdy komponent musia\u0142 importowa\u0107 predefiniowany layout).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e9bd174.png\" alt=\"\" width=\"835\" height=\"281\"\/><\/figure><\/div>\n\n\n<p>Nowe RFC proponuje rozwi\u0105zanie powy\u017cszego problemu. Zamiast plik\u00f3w index.js, nowa architektura zak\u0142ada istnienie plik\u00f3w layout.js i page.js. Pierwszy z nich odpowiedzialny b\u0119dzie za renderowanie \u201cskorupy\u201d strony, natomiast drugi za renderowanie \u201cw\u0142a\u015bciwej tre\u015bci\u201d. Jest to wi\u0119c rozwi\u0105zanie do z\u0142udzenia przypominaj\u0105ce Angularowy `&lt;router-outlet&gt;` i Reactowy `&lt;Outlet \/&gt;`.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889eaa2ca6.png\" alt=\"\" width=\"767\" height=\"355\"\/><\/figure><\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889ec52be1.png\" alt=\"\" width=\"632\" height=\"240\"\/><\/figure><\/div>\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">\/\/ Root layout (app\/layout.js)\n\/\/ - Applies to all routes\nexport default function RootLayout({ children }) {\n  return (\n    &lt;html&gt;\n      &lt;body&gt;\n        &lt;Header \/&gt;\n        {children}\n        &lt;Footer \/&gt;\n      &lt;\/body&gt;\n    &lt;\/html&gt;\n  )\n}\n\n\/\/ Regular layout (app\/dashboard\/layout.js)\n\/\/ - Applies to route segments in app\/dashboard\/*\nexport default function DashboardLayout({ children }) {\n  return (\n    &lt;&gt;\n      &lt;DashboardSidebar \/&gt;\n      {children}\n    &lt;\/&gt;\n  )\n}\n\n\/\/ Page Component (app\/dashboard\/analytics\/page.js)\n\/\/ - The UI for the `app\/dashboard\/analytics` segment\n\/\/ - Matches the `acme.com\/dashboard\/analytics` URL path\nexport default function AnalyticsPage() {\n  return (\n    &lt;main&gt;...&lt;\/main&gt;\n  )\n}<\/code><\/pre>\n\n\n\n<p>Co wa\u017cne, ka\u017cdy z plik\u00f3w layout.js b\u0119dzie m\u00f3g\u0142 asynchronicznie \u0142adowa\u0107 swoje dane, tak aby mo\u017cliwa by\u0142a na przyk\u0142ad dynamiczna zmiana zawarto\u015bci menu na podstawie preferencji u\u017cytkownika. Next.js planuje wykorzysta\u0107 funkcjonalno\u015bci ze \u015bwie\u017cego React 18, aby umo\u017cliwi\u0107 zar\u00f3wno wsp\u00f3\u0142bie\u017cne renderowanie jak i pobieranie danych.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889ed894af.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>To jeszcze nie koniec zmian, bo Vercel zapowiedzia\u0142 wkr\u00f3tce opublikowanie kolejnej cz\u0119\u015bci RFC. Ja czekam z niecierpliwo\u015bci\u0105, bo zawiera\u0107 ma ona mi\u0119dzy innymi mo\u017cliwo\u015b\u0107 pre-renderowania stron, na kt\u00f3re mo\u017ce wej\u015b\u0107 u\u017cytkownik.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a:<\/h3>\n\n\n\n<p><a href=\"https:\/\/nextjs.org\/blog\/layouts-rfc\">https:\/\/nextjs.org\/blog\/layouts-rfc<\/a><\/p>\n\n\n\n<h2 id=\"4-typescript-4-7\" data-num=4>4. Typescript 4.7<\/h2>\n\n\n\n<p>Pami\u0119tacie te stare dobre czasy, kiedy du\u017ce wydania popularnych j\u0119zyk\u00f3w wychodzi\u0142y raz na kilka lat? O Javie 8 pisa\u0142o si\u0119 latami i w mojej g\u0142owie to nadal \u201cta nowa\u201d wersja Javy. Od tego czasu jako bran\u017ca wiele si\u0119 nauczyli\u015bmy i do tworzenia j\u0119zyk\u00f3w podchodzimy du\u017co bardziej inkrementalnie. Wsiadaj\u0105c do poci\u0105gu wyda\u0144 (wolne t\u0142umaczenie \u201cRelease Train\u201d) zyskali\u015bmy prostsze aktualizacje i szybsz\u0105 p\u0119tl\u0119 zwrotn\u0105, ale gdzie\u015b po drodze ca\u0142kowicie zatracili\u015bmy rado\u015b\u0107 z odkrywania nowych wyda\u0144 naszych ukochanych j\u0119zyk\u00f3w.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"329\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/giphy-1.gif\" alt=\"\" class=\"wp-image-4540\"\/><figcaption>Tak wygl\u0105da m\u00f3j entuzjazm na wie\u015b\u0107 o kolejnej wersji TypeScript<\/figcaption><\/figure><\/div>\n\n\n<p>Nie popadajmy jednak w marazm i sp\u00f3jrzmy na nowo\u015bci, jakie przynosi wydany w tym tygodniu TypeScript 4.7. Najwi\u0119ksz\u0105 ze wszystkich jest wsparcie dla ECMAScript Module w Node.js. Modu\u0142y w JavaScript to prawdziwa g\u00f3ra lodowa, dlatego wszystkim, kt\u00f3rzy nie s\u0105 zaznajomieni z tematem polecam film od Przeprogramowanych po\u015bwi\u0119cony w ca\u0142o\u015bci temu zagadnieniu.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889eea22c7.jpg\" alt=\"\"\/><\/figure><\/div>\n\n\n<p>Co sk\u0142ada si\u0119 na wsparcie dla ECMAScript Modules? Przede wszystkim do tsconfig.json i package.json trafiaj\u0105 nowe pola, kt\u00f3re decydowa\u0107 b\u0119d\u0105 o tym w jaki spos\u00f3b traktowane s\u0105 importy w danym module. Do tego dochodzi wsparcie dla plik\u00f3w `.mts` i `.cts`, kt\u00f3re kompilowane b\u0119d\u0105 odpowiednio do plik\u00f3w `.mjs` i \u2018.cjs`. Oczywi\u015bcie jak zawsze w przypadku modu\u0142\u00f3w, temat jest du\u017co bardziej z\u0142o\u017cony, dlatego wszystkich zainteresowanych szczeg\u00f3\u0142ami odsy\u0142am do notki Microsoftu.<\/p>\n\n\n\n<p>Nowa edycja TypeScript jak zwykle przynosi r\u00f3wnie\u017c drobne usprawnienia inferencji typ\u00f3w. Wersja 4.7 b\u0119dzie lepiej radzi\u0107 sobie z analiz\u0105 przep\u0142ywu kodu, dzi\u0119ki czemu w wielu przypadkach b\u0119dzie w stanie zaw\u0119zi\u0107 inferowane typy. Usprawniona zosta\u0142a r\u00f3wnie\u017c inferencja typ\u00f3w metod w obiektach.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">declare function f&lt;T&gt;(arg: {\n    produce: (n: string) =&gt; T,\n    consume: (x: T) =&gt; void }\n): void;\n\n\/\/ Works\nf({\n    produce: () =&gt; &quot;hello&quot;,\n    consume: x =&gt; x.toLowerCase()\n});\n\n\/\/ Works\nf({\n    produce: (n: string) =&gt; n,\n    consume: x =&gt; x.toLowerCase(),\n});\n\n\/\/ Was an error, now works.\nf({\n    produce: n =&gt; n,\n    consume: x =&gt; x.toLowerCase(),\n});\n\n\/\/ Was an error, now works.\nf({\n    produce: function () { return &quot;hello&quot;; },\n    consume: x =&gt; x.toLowerCase(),\n});\n\n\/\/ Was an error, now works.\nf({\n    produce() { return &quot;hello&quot; },\n    consume: x =&gt; x.toLowerCase(),\n});\n<\/code><\/pre>\n\n\n\n<p>Kolejn\u0105 nowo\u015bci\u0105 jest wprowadzenie Instantiation Expressions, kt\u00f3re w zwi\u0119z\u0142y spos\u00f3b pozwalaj\u0105 zaw\u0119zi\u0107 typ danej funkcji, czy klasy. Ci\u0119\u017cko to wyt\u0142umaczy\u0107, wi\u0119c po prostu zerknijcie na przyk\u0142ad poni\u017cej:<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">interface Box&lt;T&gt; {  value: T; }\n\nfunction makeBox&lt;T&gt;(value: T) {\n    return { value };\n}\n\n\/\/ In TypeScript 4.6\nconst makeStringBox: (string: string) =&gt; Box&lt;string&gt; = makeBox;\n\n\/\/ In TypeScript 4.7\nconst makeStringBox = makeBox&lt;string&gt;;\n\nmakeStringBos(42); \/\/ TypeScript correctly rejects this.<\/code><\/pre>\n\n\n\n<p>Na koniec zostawi\u0142em sobie prawdziw\u0105 bomb\u0119: wariancja typ\u00f3w. Nie wchodz\u0105c w szczeg\u00f3\u0142y, wariancja w przypadku generycznych typ\u00f3w pozwala okre\u015bli\u0107 czy dane typy mog\u0105 zosta\u0107 do siebie przypisane na podstawie struktury dziedziczenia ich generycznych parametr\u00f3w. Dog\u0142\u0119bne wyt\u0142umaczenie jak dzia\u0142a wariancja zdecydowanie nie mie\u015bci si\u0119 w formule naszych przegl\u0105d\u00f3w, dlatego zainteresowanych odsy\u0142am do dokumentacji Kotlina, kt\u00f3ry zdecydowa\u0142 si\u0119 na tak\u0105 sam\u0105 nomenklatur\u0119 jak TypeScript (czyli s\u0142owa kluczowe in i out). Po co nam wariancja w strukturalnie typowanym j\u0119zyku? Na \u201cch\u0142opski rozum\u201d, wszystkie typy mo\u017cna rozwin\u0105\u0107 i por\u00f3wna\u0107. Jak si\u0119 okazuje, w przypadku skomplikowanych zagnie\u017cd\u017conych typ\u00f3w sprawdzenie wariancji b\u0119dzie znacznie szybsze ni\u017c ich rozwijanie.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">interface Animal {\n    animalStuff: any;\n}\n\ninterface Dog extends Animal {\n    dogStuff: any;\n}\n\ntype Getter&lt;out T&gt; = () =&gt; T;\ntype Setter&lt;in T&gt; = (value: T) =&gt; void;\n\nlet animalGetter: Getter&lt;Animal&gt;;\nlet dogGetter: Getter&lt;Dog&gt;;\nanimalGetter = dogGetter; \/\/ This will work\ndogGetter = animalGetter; \/\/ This will throw an error\n\nlet animalSetter: Setter&lt;Animal&gt;;\nlet dogSetter: Setter&lt;Dog&gt;;\nanimalSetter = dogSetter; \/\/ This will throw an error\ndogSetter = animalSetter; \/\/ This will work<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889ef041e0.jpg\" alt=\"\"\/><figcaption>Mam nadziej\u0119, \u017ce nie tylko m\u00f3j m\u00f3zg tak ma na kilka dni po tym jak przypominam sobie jak dzia\u0142a kowariancja.<\/figcaption><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a:<\/h3>\n\n\n\n<p><a href=\"https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-7\/\">https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-7\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>C\u00f3\u017c to by\u0142 za tydzie\u0144! Zacz\u0119li\u015bmy od plotek o nowych silnikach przegl\u0105darek na iOS, potem dostali\u015bmy TypeScript 4.7 i nowe RFC do Next.js, a tydzie\u0144 zamkneli\u015bmy og\u0142oszeniem wskrzeszenia Lerny. Du\u017co si\u0119 dzia\u0142o, wi\u0119c bez zb\u0119dnego przed\u0142u\u017cania zapraszamy do lektury!<\/p>\n","protected":false},"author":12,"featured_media":8115,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[273],"tags":[],"class_list":["post-9965","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-frontend-pl"],"acf":{"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/FRONTEND-4.png","feature_image_visible":false,"estimated_reading_time":"10","feature_image_blog":{"ID":8116,"id":8116,"title":"6hl4lx","filename":"6hl4lx.jpeg","filesize":62749,"url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/6hl4lx.jpeg","link":"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/6hl4lx-2\/","alt":"","author":"12","description":"","caption":"","name":"6hl4lx-2","status":"inherit","uploaded_to":9965,"date":"2022-05-26 15:41:35","modified":"2022-05-26 15:41:35","menu_order":0,"mime_type":"image\/jpeg","type":"image","subtype":"jpeg","icon":"https:\/\/vived.io\/wp-includes\/images\/media\/default.png","width":544,"height":500,"sizes":{"thumbnail":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/6hl4lx-150x150.jpeg","thumbnail-width":150,"thumbnail-height":150,"medium":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/6hl4lx-300x276.jpeg","medium-width":300,"medium-height":276,"medium_large":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/6hl4lx.jpeg","medium_large-width":544,"medium_large-height":500,"large":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/6hl4lx.jpeg","large-width":544,"large-height":500,"1536x1536":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/6hl4lx.jpeg","1536x1536-width":544,"1536x1536-height":500,"2048x2048":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/6hl4lx.jpeg","2048x2048-width":544,"2048x2048-height":500,"gform-image-choice-sm":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/6hl4lx.jpeg","gform-image-choice-sm-width":300,"gform-image-choice-sm-height":276,"gform-image-choice-md":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/6hl4lx.jpeg","gform-image-choice-md-width":400,"gform-image-choice-md-height":368,"gform-image-choice-lg":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/6hl4lx.jpeg","gform-image-choice-lg-width":544,"gform-image-choice-lg-height":500}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Frontend Thursday vol. 89 - koniec monopolu WebKit na iOS, Lerna wraca do \u017cywych, TypeScript 4.7 - 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\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Frontend Thursday vol. 89 - koniec monopolu WebKit na iOS, Lerna wraca do \u017cywych, TypeScript 4.7 - Vived\" \/>\n<meta property=\"og:description\" content=\"C\u00f3\u017c to by\u0142 za tydzie\u0144! Zacz\u0119li\u015bmy od plotek o nowych silnikach przegl\u0105darek na iOS, potem dostali\u015bmy TypeScript 4.7 i nowe RFC do Next.js, a tydzie\u0144 zamkneli\u015bmy og\u0142oszeniem wskrzeszenia Lerny. Du\u017co si\u0119 dzia\u0142o, wi\u0119c bez zb\u0119dnego przed\u0142u\u017cania zapraszamy do lektury!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2022-05-26T15:46:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-09-19T11:16:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/FRONTEND-4.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Tomasz Borowicz\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/\"},\"author\":{\"name\":\"Tomasz Borowicz\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb\"},\"headline\":\"Frontend Thursday vol. 89 &#8211; koniec monopolu WebKit na iOS, Lerna wraca do \u017cywych, TypeScript 4.7\",\"datePublished\":\"2022-05-26T15:46:47+00:00\",\"dateModified\":\"2022-09-19T11:16:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/\"},\"wordCount\":1830,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/FRONTEND-4.png\",\"articleSection\":[\"Frontend\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/\",\"url\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/\",\"name\":\"Frontend Thursday vol. 89 - koniec monopolu WebKit na iOS, Lerna wraca do \u017cywych, TypeScript 4.7 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/FRONTEND-4.png\",\"datePublished\":\"2022-05-26T15:46:47+00:00\",\"dateModified\":\"2022-09-19T11:16:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/FRONTEND-4.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/FRONTEND-4.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Frontend Thursday vol. 89 &#8211; koniec monopolu WebKit na iOS, Lerna wraca do \u017cywych, TypeScript 4.7\"}]},{\"@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":"Frontend Thursday vol. 89 - koniec monopolu WebKit na iOS, Lerna wraca do \u017cywych, TypeScript 4.7 - 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\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/","og_locale":"pl_PL","og_type":"article","og_title":"Frontend Thursday vol. 89 - koniec monopolu WebKit na iOS, Lerna wraca do \u017cywych, TypeScript 4.7 - Vived","og_description":"C\u00f3\u017c to by\u0142 za tydzie\u0144! Zacz\u0119li\u015bmy od plotek o nowych silnikach przegl\u0105darek na iOS, potem dostali\u015bmy TypeScript 4.7 i nowe RFC do Next.js, a tydzie\u0144 zamkneli\u015bmy og\u0142oszeniem wskrzeszenia Lerny. Du\u017co si\u0119 dzia\u0142o, wi\u0119c bez zb\u0119dnego przed\u0142u\u017cania zapraszamy do lektury!","og_url":"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/","og_site_name":"Vived","article_published_time":"2022-05-26T15:46:47+00:00","article_modified_time":"2022-09-19T11:16:28+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/FRONTEND-4.png","type":"image\/png"}],"author":"Tomasz Borowicz","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/"},"author":{"name":"Tomasz Borowicz","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb"},"headline":"Frontend Thursday vol. 89 &#8211; koniec monopolu WebKit na iOS, Lerna wraca do \u017cywych, TypeScript 4.7","datePublished":"2022-05-26T15:46:47+00:00","dateModified":"2022-09-19T11:16:28+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/"},"wordCount":1830,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/FRONTEND-4.png","articleSection":["Frontend"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/","url":"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/","name":"Frontend Thursday vol. 89 - koniec monopolu WebKit na iOS, Lerna wraca do \u017cywych, TypeScript 4.7 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/FRONTEND-4.png","datePublished":"2022-05-26T15:46:47+00:00","dateModified":"2022-09-19T11:16:28+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/FRONTEND-4.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/FRONTEND-4.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-89-koniec-monopolu-webkit-na-ios-lerna-wraca-do-zywych-typescript-4-7\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Frontend Thursday vol. 89 &#8211; koniec monopolu WebKit na iOS, Lerna wraca do \u017cywych, TypeScript 4.7"}]},{"@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. Koniec monopolu WebKit na iOS<\/h2>\n","innerContent":["\n<h2>1. Koniec monopolu WebKit na iOS<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nie od dzi\u015b wiadomo, \u017ce Safari to nowy Internet Explorer. Web deweloperzy nieustannie narzekaj\u0105 na to, \u017ce przegl\u0105darka od Apple jest mocno w tyle - zar\u00f3wno je\u015bli chodzi o nowe funkcjonalno\u015bci jak i ilo\u015b\u0107 drobnych b\u0142\u0119d\u00f3w i glitchy. Skutkuje to oczywi\u015bcie regularnymi problemami z dzia\u0142aniem niekt\u00f3rych aplikacji na Safari (kto pr\u00f3bowa\u0142 korzysta\u0107 na niej z Google Meet ten wie).&nbsp;<\/p>\n","innerContent":["\n<p>Nie od dzi\u015b wiadomo, \u017ce Safari to nowy Internet Explorer. Web deweloperzy nieustannie narzekaj\u0105 na to, \u017ce przegl\u0105darka od Apple jest mocno w tyle - zar\u00f3wno je\u015bli chodzi o nowe funkcjonalno\u015bci jak i ilo\u015b\u0107 drobnych b\u0142\u0119d\u00f3w i glitchy. Skutkuje to oczywi\u015bcie regularnymi problemami z dzia\u0142aniem niekt\u00f3rych aplikacji na Safari (kto pr\u00f3bowa\u0142 korzysta\u0107 na niej z Google Meet ten wie).&nbsp;<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e5456dd.jpg\" alt=\"\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e5456dd.jpg\" alt=\"\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>O ile na komputerach nie jest to krytyczny problem (bo zawsze mo\u017cna odpali\u0107 inn\u0105 przegl\u0105dark\u0119), o tyle na telefonach z jab\u0142uszkiem sytuacja nie wygl\u0105da ju\u017c tak kolorowo. Zgodnie z regulaminem App Store, wszystkie przegl\u0105darki zmuszone s\u0105 do wykorzystywania silnika WebKit przygotowanego przez Apple. Do tej pory jako deweloperom nie pozosta\u0142o nam nic innego jak przyk\u0142ada\u0107 szczeg\u00f3ln\u0105 uwag\u0119 do tej przegl\u0105darki, a jako u\u017cytkownicy pozostawali\u015bmy bezbronni. W zesz\u0142ym tygodniu do gry wkroczy\u0142a Unia Europejska i by\u0107 mo\u017ce czeka nas spora zmiana sytuacji na rynku.<\/p>\n","innerContent":["\n<p>O ile na komputerach nie jest to krytyczny problem (bo zawsze mo\u017cna odpali\u0107 inn\u0105 przegl\u0105dark\u0119), o tyle na telefonach z jab\u0142uszkiem sytuacja nie wygl\u0105da ju\u017c tak kolorowo. Zgodnie z regulaminem App Store, wszystkie przegl\u0105darki zmuszone s\u0105 do wykorzystywania silnika WebKit przygotowanego przez Apple. Do tej pory jako deweloperom nie pozosta\u0142o nam nic innego jak przyk\u0142ada\u0107 szczeg\u00f3ln\u0105 uwag\u0119 do tej przegl\u0105darki, a jako u\u017cytkownicy pozostawali\u015bmy bezbronni. W zesz\u0142ym tygodniu do gry wkroczy\u0142a Unia Europejska i by\u0107 mo\u017ce czeka nas spora zmiana sytuacji na rynku.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","width":-163,"height":-91},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e5967ff.jpg\" alt=\"\" width=\"-163\" height=\"-91\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e5967ff.jpg\" alt=\"\" width=\"-163\" height=\"-91\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>W r\u0119ce portalu \u201cThe Register\u201d trafi\u0142a nie upubliczniona wersja Digital Markets Act (DMA). Wed\u0142ug portalu najnowsza wersja tego przygotowanego przez Uni\u0119 Europejsk\u0105 prawodawstwa zawiera zapis zmuszaj\u0105cy Apple do zaakceptowania na systemie iOS autorskich silnik\u00f3w przegl\u0105darek.&nbsp;<\/p>\n","innerContent":["\n<p>W r\u0119ce portalu \u201cThe Register\u201d trafi\u0142a nie upubliczniona wersja Digital Markets Act (DMA). Wed\u0142ug portalu najnowsza wersja tego przygotowanego przez Uni\u0119 Europejsk\u0105 prawodawstwa zawiera zapis zmuszaj\u0105cy Apple do zaakceptowania na systemie iOS autorskich silnik\u00f3w przegl\u0105darek.&nbsp;<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jakie konsekwencje mia\u0142oby wej\u015bcie w \u017cycie takiego prawodawstwa? Przede wszystkim zyskamy mo\u017cliwo\u015b\u0107 ucieczki z podbramkowych sytuacji, kiedy kolejna aplikacja odmawia nam wsp\u00f3\u0142pracy. Poza tym na iPhone zawita w ko\u0144cu wiele od dawna wyczekiwanych funkcjonalno\u015bci jak chocia\u017cby push notyfikacje. Po\u015brednio, w zwi\u0105zku z pojawieniem si\u0119 konkurencji, mo\u017ce to zmusi\u0107 Apple do szybszego iterowania nad swoj\u0105 przegl\u0105dark\u0105. Innymi s\u0142owy - jako u\u017cytkownicy i deweloperzy definitywnie wygrywamy.<\/p>\n","innerContent":["\n<p>Jakie konsekwencje mia\u0142oby wej\u015bcie w \u017cycie takiego prawodawstwa? Przede wszystkim zyskamy mo\u017cliwo\u015b\u0107 ucieczki z podbramkowych sytuacji, kiedy kolejna aplikacja odmawia nam wsp\u00f3\u0142pracy. Poza tym na iPhone zawita w ko\u0144cu wiele od dawna wyczekiwanych funkcjonalno\u015bci jak chocia\u017cby push notyfikacje. Po\u015brednio, w zwi\u0105zku z pojawieniem si\u0119 konkurencji, mo\u017ce to zmusi\u0107 Apple do szybszego iterowania nad swoj\u0105 przegl\u0105dark\u0105. Innymi s\u0142owy - jako u\u017cytkownicy i deweloperzy definitywnie wygrywamy.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e5f17fb.jpg\" alt=\"\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e5f17fb.jpg\" alt=\"\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zanim przejdziemy do szczeg\u00f3\u0142\u00f3w dotycz\u0105cych szans wej\u015bcia przepis\u00f3w w \u017cycie, om\u00f3wmy sobie czym w\u0142a\u015bciwie jest DMA. Cytuj\u0105c za wikipedi\u0105 jest to \u201cpropozycja legislacyjna Komisji Europejskiej, kt\u00f3ra ma na celu zwi\u0119kszenie konkurencji na europejskich rynkach cyfrowych, poprzez uniemo\u017cliwienie du\u017cym firmom nadu\u017cywania ich si\u0142y rynkowej i umo\u017cliwienie nowym graczom wej\u015bcia na rynek\u201d. Je\u015bli o wasze uszy obi\u0142y si\u0119 plotki takie jak iPhone z z\u0142\u0105czem USB-C, czy dodanie do Androida mo\u017cliwo\u015bci usuwania pre-instalowanych aplikacji, to wywodzi\u0142y si\u0119 one w\u0142a\u015bnie z zapis\u00f3w w DMA.<\/p>\n","innerContent":["\n<p>Zanim przejdziemy do szczeg\u00f3\u0142\u00f3w dotycz\u0105cych szans wej\u015bcia przepis\u00f3w w \u017cycie, om\u00f3wmy sobie czym w\u0142a\u015bciwie jest DMA. Cytuj\u0105c za wikipedi\u0105 jest to \u201cpropozycja legislacyjna Komisji Europejskiej, kt\u00f3ra ma na celu zwi\u0119kszenie konkurencji na europejskich rynkach cyfrowych, poprzez uniemo\u017cliwienie du\u017cym firmom nadu\u017cywania ich si\u0142y rynkowej i umo\u017cliwienie nowym graczom wej\u015bcia na rynek\u201d. Je\u015bli o wasze uszy obi\u0142y si\u0119 plotki takie jak iPhone z z\u0142\u0105czem USB-C, czy dodanie do Androida mo\u017cliwo\u015bci usuwania pre-instalowanych aplikacji, to wywodzi\u0142y si\u0119 one w\u0142a\u015bnie z zapis\u00f3w w DMA.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Prace nad DMA trwaj\u0105 ju\u017c od 2020 roku i od samego pocz\u0105tku towarzyszy im niesamowity lobbing ze strony technologicznych gigant\u00f3w. Ponownie cytuj\u0105c za wikipedi\u0105, Google zarezerwowa\u0142 na ten cel 8M$, a Apple 2M$. Warto nadmieni\u0107, \u017ce nie jest to gra z jasno ustalonymi dru\u017cynami: Big Tech vs Unia Europejska. Dla przyk\u0142adu Facebook z ustaw\u0105 wi\u0105\u017ce du\u017ce nadzieje na wyj\u015bcie z impasu zabraniaj\u0105cego im w celach reklamowych zbiera\u0107 dane o u\u017cytkownikach na iOS, ale r\u00f3wnocze\u015bnie nie odpowiadaj\u0105 mu inne zapisy w ustawie. Mo\u017cna wi\u0119c powiedzie\u0107, \u017ce mamy tutaj do czynienia z gr\u0105 ka\u017cdy na ka\u017cdego.<\/p>\n","innerContent":["\n<p>Prace nad DMA trwaj\u0105 ju\u017c od 2020 roku i od samego pocz\u0105tku towarzyszy im niesamowity lobbing ze strony technologicznych gigant\u00f3w. Ponownie cytuj\u0105c za wikipedi\u0105, Google zarezerwowa\u0142 na ten cel 8M$, a Apple 2M$. Warto nadmieni\u0107, \u017ce nie jest to gra z jasno ustalonymi dru\u017cynami: Big Tech vs Unia Europejska. Dla przyk\u0142adu Facebook z ustaw\u0105 wi\u0105\u017ce du\u017ce nadzieje na wyj\u015bcie z impasu zabraniaj\u0105cego im w celach reklamowych zbiera\u0107 dane o u\u017cytkownikach na iOS, ale r\u00f3wnocze\u015bnie nie odpowiadaj\u0105 mu inne zapisy w ustawie. Mo\u017cna wi\u0119c powiedzie\u0107, \u017ce mamy tutaj do czynienia z gr\u0105 ka\u017cdy na ka\u017cdego.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e675b93.jpg\" alt=\"\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e675b93.jpg\" alt=\"\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Po d\u0142ugich negocjacjach w marcu tego roku wreszcie uda\u0142o si\u0119 ustali\u0107 ostateczn\u0105 posta\u0107 legislacji, a 22 maja upubliczniono przygotowane dokumenty. Przecieki jakie otrzyma\u0142 portal \u201cThe Register\u201d dotycz\u0105 poprawek do opublikowanych kilka dni temu dokument\u00f3w i do tej pory nie zosta\u0142y jeszcze potwierdzone. Aby legislacje DMA wesz\u0142y w \u017cycie musz\u0105 zosta\u0107 zatwierdzone zar\u00f3wno przez Rad\u0119 Unii Europejskiej jak i Parlament Europejski. Spekuluje si\u0119, \u017ce najwcze\u015bniej nast\u0105pi to pocz\u0105tkiem 2023 roku.<\/p>\n","innerContent":["\n<p>Po d\u0142ugich negocjacjach w marcu tego roku wreszcie uda\u0142o si\u0119 ustali\u0107 ostateczn\u0105 posta\u0107 legislacji, a 22 maja upubliczniono przygotowane dokumenty. Przecieki jakie otrzyma\u0142 portal \u201cThe Register\u201d dotycz\u0105 poprawek do opublikowanych kilka dni temu dokument\u00f3w i do tej pory nie zosta\u0142y jeszcze potwierdzone. Aby legislacje DMA wesz\u0142y w \u017cycie musz\u0105 zosta\u0107 zatwierdzone zar\u00f3wno przez Rad\u0119 Unii Europejskiej jak i Parlament Europejski. Spekuluje si\u0119, \u017ce najwcze\u015bniej nast\u0105pi to pocz\u0105tkiem 2023 roku.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e6c60f0.jpg\" alt=\"\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e6c60f0.jpg\" alt=\"\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Digital_Markets_Act\">https:\/\/en.wikipedia.org\/wiki\/Digital_Markets_Act<\/a><br><a href=\"https:\/\/pl.wikipedia.org\/wiki\/Digital_Markets_Act\">https:\/\/pl.wikipedia.org\/wiki\/Digital_Markets_Act<\/a><br><a href=\"https:\/\/www.theregister.com\/2022\/04\/26\/apple_ios_browser\/\">https:\/\/www.theregister.com\/2022\/04\/26\/apple_ios_browser\/<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Digital_Markets_Act\">https:\/\/en.wikipedia.org\/wiki\/Digital_Markets_Act<\/a><br><a href=\"https:\/\/pl.wikipedia.org\/wiki\/Digital_Markets_Act\">https:\/\/pl.wikipedia.org\/wiki\/Digital_Markets_Act<\/a><br><a href=\"https:\/\/www.theregister.com\/2022\/04\/26\/apple_ios_browser\/\">https:\/\/www.theregister.com\/2022\/04\/26\/apple_ios_browser\/<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>2. Lerna wraca do \u017cywych<\/h2>\n","innerContent":["\n<h2>2. Lerna wraca do \u017cywych<\/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 lata by\u0142o bardzo popularne w \u015bwiecie JavaScript. Na przestrzeni kilku ostatnich lat projekt napotka\u0142 spore turbulencje. W po\u0142owie 2020 roku w repozytorium lerny pojawi\u0142o si\u0119 Issue sugeruj\u0105ce, \u017ce narz\u0119dzie nie jest ju\u017c aktywnie wspierane. Patrz\u0105c na histori\u0119 commit\u00f3w ci\u0119\u017cko nie zgodzi\u0107 - 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 lata by\u0142o bardzo popularne w \u015bwiecie JavaScript. Na przestrzeni kilku ostatnich lat projekt napotka\u0142 spore turbulencje. W po\u0142owie 2020 roku w repozytorium lerny pojawi\u0142o si\u0119 Issue sugeruj\u0105ce, \u017ce narz\u0119dzie nie jest ju\u017c aktywnie wspierane. Patrz\u0105c na histori\u0119 commit\u00f3w ci\u0119\u017cko nie zgodzi\u0107 - 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\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Przez ostatnie dwa lata na miejscu Lerny wyrasta\u0107 zacz\u0119\u0142y nowe alternatywy. Cz\u0119\u015b\u0107 u\u017cytkownik\u00f3w postanowi\u0142a przerzuci\u0107 si\u0119 na rozwi\u0105zania oferowane przez managery paczek, czyli odpowiednio `npm workspaces` i `yarn workspaces`. U\u017cytkownicy szukaj\u0105cy bardziej zaawansowanych funkcjonalno\u015bci zacz\u0119li natomiast powoli odp\u0142ywa\u0107 w stron\u0119 Nx, kt\u00f3ry powoli z narz\u0119dzia dedykowanego dla Angulara zmienia\u0142 si\u0119 w narz\u0119dzie niezale\u017cne od frameworku. W kwietniu tego roku Nx w ko\u0144cu wyprzedzi\u0142 Lern\u0119 w ilo\u015bci pobra\u0144 z npm i sta\u0142 si\u0119 najpopularniejszym narz\u0119dziem do zarz\u0105dzania JavaScriptowym monorepo.<\/p>\n","innerContent":["\n<p>Przez ostatnie dwa lata na miejscu Lerny wyrasta\u0107 zacz\u0119\u0142y nowe alternatywy. Cz\u0119\u015b\u0107 u\u017cytkownik\u00f3w postanowi\u0142a przerzuci\u0107 si\u0119 na rozwi\u0105zania oferowane przez managery paczek, czyli odpowiednio `npm workspaces` i `yarn workspaces`. U\u017cytkownicy szukaj\u0105cy bardziej zaawansowanych funkcjonalno\u015bci zacz\u0119li natomiast powoli odp\u0142ywa\u0107 w stron\u0119 Nx, kt\u00f3ry powoli z narz\u0119dzia dedykowanego dla Angulara zmienia\u0142 si\u0119 w narz\u0119dzie niezale\u017cne od frameworku. W kwietniu tego roku Nx w ko\u0144cu wyprzedzi\u0142 Lern\u0119 w ilo\u015bci pobra\u0144 z npm i sta\u0142 si\u0119 najpopularniejszym narz\u0119dziem do zarz\u0105dzania JavaScriptowym monorepo.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","width":644,"height":364},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e72a909.png\" alt=\"\" width=\"644\" height=\"364\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e72a909.png\" alt=\"\" width=\"644\" height=\"364\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dla formalno\u015bci nadmienie jeszcze, \u017ce ostatnio w grze pojawi\u0142 si\u0119 nowy gracz w postaci TurboRepo. Projekt zosta\u0142 zakupiony w zesz\u0142ym roku przez Vercela, co wi\u0105za\u0142o si\u0119 zapewne ze sporym zastrzykiem got\u00f3wki. Nie zmienia to jednak faktu, \u017ce projekt wci\u0105\u017c znajduje si\u0119 na dosy\u0107 wczesnym etapie rozwoju i nie rozwin\u0105\u0142 jeszcze w ca\u0142o\u015bci swoich mo\u017cliwo\u015bci.<\/p>\n","innerContent":["\n<p>Dla formalno\u015bci nadmienie jeszcze, \u017ce ostatnio w grze pojawi\u0142 si\u0119 nowy gracz w postaci TurboRepo. Projekt zosta\u0142 zakupiony w zesz\u0142ym roku przez Vercela, co wi\u0105za\u0142o si\u0119 zapewne ze sporym zastrzykiem got\u00f3wki. Nie zmienia to jednak faktu, \u017ce projekt wci\u0105\u017c znajduje si\u0119 na dosy\u0107 wczesnym etapie rozwoju i nie rozwin\u0105\u0142 jeszcze w ca\u0142o\u015bci swoich mo\u017cliwo\u015bci.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e882c76.jpg\" alt=\"\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e882c76.jpg\" alt=\"\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wr\u00f3\u0107my jednak do tematu Lerny. Po prawie dw\u00f3ch latach stagnacji, wydarzy\u0142o si\u0119 niespodziewane - projekt wr\u00f3ci\u0142 do \u017cycia. Co jeszcze dziwniejsze zosta\u0142 on wskrzeszony przez firm\u0119 Nrwl, czyli autor\u00f3w uzyskuj\u0105cego obecnie na popularno\u015bci Nx\u2019a. Oznacza to, \u017ce dwa najpopularniejsze narz\u0119dzie do zarz\u0105dzania monorepo s\u0105 obecnie w r\u0119kach jednej firmy.&nbsp;<\/p>\n","innerContent":["\n<p>Wr\u00f3\u0107my jednak do tematu Lerny. Po prawie dw\u00f3ch latach stagnacji, wydarzy\u0142o si\u0119 niespodziewane - projekt wr\u00f3ci\u0142 do \u017cycia. Co jeszcze dziwniejsze zosta\u0142 on wskrzeszony przez firm\u0119 Nrwl, czyli autor\u00f3w uzyskuj\u0105cego obecnie na popularno\u015bci Nx\u2019a. Oznacza to, \u017ce dwa najpopularniejsze narz\u0119dzie do zarz\u0105dzania monorepo s\u0105 obecnie w r\u0119kach jednej firmy.&nbsp;<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jak wynika z notatki dotycz\u0105cej przej\u0119cia lerny, ma by\u0107 ona aktywnie rozwijana. Kr\u00f3tkoterminowo firma zamierza skupi\u0107 si\u0119 na naprawieniu krytycznych b\u0142\u0119d\u00f3w i podatno\u015bci, natomiast d\u0142ugoterminowo wprowadzane b\u0119d\u0105 funkcjonalno\u015bci, kt\u00f3re umo\u017cliwi\u0105 bezproblemow\u0105 integracj\u0119 mi\u0119dzy Lern\u0105 i Nx\u2019em. Jeszcze nie wiadomo co to dok\u0142adnie oznacza, ale na m\u00f3j \u201cch\u0142opski rozum\u201d&nbsp; mo\u017cemy spodziewa\u0107 si\u0119, \u017ce migracja do Nx stanie si\u0119 jeszcze prostsza, a Lerna b\u0119dzie raczej utrzymywana ni\u017c rozwijana.<\/p>\n","innerContent":["\n<p>Jak wynika z notatki dotycz\u0105cej przej\u0119cia lerny, ma by\u0107 ona aktywnie rozwijana. Kr\u00f3tkoterminowo firma zamierza skupi\u0107 si\u0119 na naprawieniu krytycznych b\u0142\u0119d\u00f3w i podatno\u015bci, natomiast d\u0142ugoterminowo wprowadzane b\u0119d\u0105 funkcjonalno\u015bci, kt\u00f3re umo\u017cliwi\u0105 bezproblemow\u0105 integracj\u0119 mi\u0119dzy Lern\u0105 i Nx\u2019em. Jeszcze nie wiadomo co to dok\u0142adnie oznacza, ale na m\u00f3j \u201cch\u0142opski rozum\u201d&nbsp; mo\u017cemy spodziewa\u0107 si\u0119, \u017ce migracja do Nx stanie si\u0119 jeszcze prostsza, a Lerna b\u0119dzie raczej utrzymywana ni\u017c rozwijana.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e8dcf1c.jpg\" alt=\"\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e8dcf1c.jpg\" alt=\"\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/blog.nrwl.io\/lerna-is-dead-long-live-lerna-61259f97dbd9\">https:\/\/blog.nrwl.io\/lerna-is-dead-long-live-lerna-61259f97dbd9<\/a><br><a href=\"https:\/\/www.npmtrends.com\/lerna-vs-nx\">https:\/\/www.npmtrends.com\/lerna-vs-nx<\/a><br><a href=\"https:\/\/github.com\/lerna\/lerna\/issues\/2703\">https:\/\/github.com\/lerna\/lerna\/issues\/2703<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/blog.nrwl.io\/lerna-is-dead-long-live-lerna-61259f97dbd9\">https:\/\/blog.nrwl.io\/lerna-is-dead-long-live-lerna-61259f97dbd9<\/a><br><a href=\"https:\/\/www.npmtrends.com\/lerna-vs-nx\">https:\/\/www.npmtrends.com\/lerna-vs-nx<\/a><br><a href=\"https:\/\/github.com\/lerna\/lerna\/issues\/2703\">https:\/\/github.com\/lerna\/lerna\/issues\/2703<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>3. Nowy system renderowania zmierza do Next.js<\/h2>\n","innerContent":["\n<h2>3. Nowy system renderowania zmierza do Next.js<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>W minionym tygodniu zaprezentowane zosta\u0142o RFC nowej funkcjonalno\u015bci w Next.js -&nbsp; Layouts. Ma ona umo\u017cliwi\u0107 \u0142atwiejsze budowanie aplikacji z zagnie\u017cd\u017conymi \u015bcie\u017ckami.&nbsp;<\/p>\n","innerContent":["\n<p>W minionym tygodniu zaprezentowane zosta\u0142o RFC nowej funkcjonalno\u015bci w Next.js -&nbsp; Layouts. Ma ona umo\u017cliwi\u0107 \u0142atwiejsze budowanie aplikacji z zagnie\u017cd\u017conymi \u015bcie\u017ckami.&nbsp;<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e948829.gif\" alt=\"\"\/><figcaption>Nowe funkcjonalno\u015bci Next.js rosn\u0105 jak na dro\u017cd\u017cach. Nic dziwnego je\u015bli firma matka projektu w ostatniej rundzie finansowania zgarn\u0119\u0142a 150M$<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e948829.gif\" alt=\"\"\/><figcaption>Nowe funkcjonalno\u015bci Next.js rosn\u0105 jak na dro\u017cd\u017cach. Nic dziwnego je\u015bli firma matka projektu w ostatniej rundzie finansowania zgarn\u0119\u0142a 150M$<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Do tej pory routing w Next.js oparty by\u0142 o struktur\u0119 katalog\u00f3w. Aby wyrenderowa\u0107 stron\u0119 `\/home\/about` nale\u017ca\u0142o w katalogu `\/home\/about` umie\u015bci\u0107 plik index.js, kt\u00f3ry eksportowa\u0142 reactowy komponent. Architektura taka by\u0142a bardzo wygodna, ale wymaga\u0142a sporej dozy powtarzalno\u015bci (ka\u017cdy komponent musia\u0142 importowa\u0107 predefiniowany layout).<\/p>\n","innerContent":["\n<p>Do tej pory routing w Next.js oparty by\u0142 o struktur\u0119 katalog\u00f3w. Aby wyrenderowa\u0107 stron\u0119 `\/home\/about` nale\u017ca\u0142o w katalogu `\/home\/about` umie\u015bci\u0107 plik index.js, kt\u00f3ry eksportowa\u0142 reactowy komponent. Architektura taka by\u0142a bardzo wygodna, ale wymaga\u0142a sporej dozy powtarzalno\u015bci (ka\u017cdy komponent musia\u0142 importowa\u0107 predefiniowany layout).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","width":835,"height":281},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e9bd174.png\" alt=\"\" width=\"835\" height=\"281\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889e9bd174.png\" alt=\"\" width=\"835\" height=\"281\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nowe RFC proponuje rozwi\u0105zanie powy\u017cszego problemu. Zamiast plik\u00f3w index.js, nowa architektura zak\u0142ada istnienie plik\u00f3w layout.js i page.js. Pierwszy z nich odpowiedzialny b\u0119dzie za renderowanie \u201cskorupy\u201d strony, natomiast drugi za renderowanie \u201cw\u0142a\u015bciwej tre\u015bci\u201d. Jest to wi\u0119c rozwi\u0105zanie do z\u0142udzenia przypominaj\u0105ce Angularowy `&lt;router-outlet&gt;` i Reactowy `&lt;Outlet \/&gt;`.<\/p>\n","innerContent":["\n<p>Nowe RFC proponuje rozwi\u0105zanie powy\u017cszego problemu. Zamiast plik\u00f3w index.js, nowa architektura zak\u0142ada istnienie plik\u00f3w layout.js i page.js. Pierwszy z nich odpowiedzialny b\u0119dzie za renderowanie \u201cskorupy\u201d strony, natomiast drugi za renderowanie \u201cw\u0142a\u015bciwej tre\u015bci\u201d. Jest to wi\u0119c rozwi\u0105zanie do z\u0142udzenia przypominaj\u0105ce Angularowy `&lt;router-outlet&gt;` i Reactowy `&lt;Outlet \/&gt;`.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","width":767,"height":355},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889eaa2ca6.png\" alt=\"\" width=\"767\" height=\"355\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889eaa2ca6.png\" alt=\"\" width=\"767\" height=\"355\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","width":632,"height":240},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889ec52be1.png\" alt=\"\" width=\"632\" height=\"240\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889ec52be1.png\" alt=\"\" width=\"632\" height=\"240\"\/><\/figure>\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\">\/\/ Root layout (app\/layout.js)\n\/\/ - Applies to all routes\nexport default function RootLayout({ children }) {\n  return (\n    &lt;html>\n      &lt;body>\n        &lt;Header \/>\n        {children}\n        &lt;Footer \/>\n      &lt;\/body>\n    &lt;\/html>\n  )\n}\n\n\/\/ Regular layout (app\/dashboard\/layout.js)\n\/\/ - Applies to route segments in app\/dashboard\/*\nexport default function DashboardLayout({ children }) {\n  return (\n    &lt;>\n      &lt;DashboardSidebar \/>\n      {children}\n    &lt;\/>\n  )\n}\n\n\/\/ Page Component (app\/dashboard\/analytics\/page.js)\n\/\/ - The UI for the `app\/dashboard\/analytics` segment\n\/\/ - Matches the `acme.com\/dashboard\/analytics` URL path\nexport default function AnalyticsPage() {\n  return (\n    &lt;main>...&lt;\/main>\n  )\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\">\/\/ Root layout (app\/layout.js)\n\/\/ - Applies to all routes\nexport default function RootLayout({ children }) {\n  return (\n    &lt;html>\n      &lt;body>\n        &lt;Header \/>\n        {children}\n        &lt;Footer \/>\n      &lt;\/body>\n    &lt;\/html>\n  )\n}\n\n\/\/ Regular layout (app\/dashboard\/layout.js)\n\/\/ - Applies to route segments in app\/dashboard\/*\nexport default function DashboardLayout({ children }) {\n  return (\n    &lt;>\n      &lt;DashboardSidebar \/>\n      {children}\n    &lt;\/>\n  )\n}\n\n\/\/ Page Component (app\/dashboard\/analytics\/page.js)\n\/\/ - The UI for the `app\/dashboard\/analytics` segment\n\/\/ - Matches the `acme.com\/dashboard\/analytics` URL path\nexport default function AnalyticsPage() {\n  return (\n    &lt;main>...&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>Co wa\u017cne, ka\u017cdy z plik\u00f3w layout.js b\u0119dzie m\u00f3g\u0142 asynchronicznie \u0142adowa\u0107 swoje dane, tak aby mo\u017cliwa by\u0142a na przyk\u0142ad dynamiczna zmiana zawarto\u015bci menu na podstawie preferencji u\u017cytkownika. Next.js planuje wykorzysta\u0107 funkcjonalno\u015bci ze \u015bwie\u017cego React 18, aby umo\u017cliwi\u0107 zar\u00f3wno wsp\u00f3\u0142bie\u017cne renderowanie jak i pobieranie danych.<\/p>\n","innerContent":["\n<p>Co wa\u017cne, ka\u017cdy z plik\u00f3w layout.js b\u0119dzie m\u00f3g\u0142 asynchronicznie \u0142adowa\u0107 swoje dane, tak aby mo\u017cliwa by\u0142a na przyk\u0142ad dynamiczna zmiana zawarto\u015bci menu na podstawie preferencji u\u017cytkownika. Next.js planuje wykorzysta\u0107 funkcjonalno\u015bci ze \u015bwie\u017cego React 18, aby umo\u017cliwi\u0107 zar\u00f3wno wsp\u00f3\u0142bie\u017cne renderowanie jak i pobieranie danych.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":[],"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889ed894af.png\" alt=\"\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889ed894af.png\" alt=\"\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>To jeszcze nie koniec zmian, bo Vercel zapowiedzia\u0142 wkr\u00f3tce opublikowanie kolejnej cz\u0119\u015bci RFC. Ja czekam z niecierpliwo\u015bci\u0105, bo zawiera\u0107 ma ona mi\u0119dzy innymi mo\u017cliwo\u015b\u0107 pre-renderowania stron, na kt\u00f3re mo\u017ce wej\u015b\u0107 u\u017cytkownik.<\/p>\n","innerContent":["\n<p>To jeszcze nie koniec zmian, bo Vercel zapowiedzia\u0142 wkr\u00f3tce opublikowanie kolejnej cz\u0119\u015bci RFC. Ja czekam z niecierpliwo\u015bci\u0105, bo zawiera\u0107 ma ona mi\u0119dzy innymi mo\u017cliwo\u015b\u0107 pre-renderowania stron, na kt\u00f3re mo\u017ce wej\u015b\u0107 u\u017cytkownik.<\/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:\/\/nextjs.org\/blog\/layouts-rfc\">https:\/\/nextjs.org\/blog\/layouts-rfc<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/nextjs.org\/blog\/layouts-rfc\">https:\/\/nextjs.org\/blog\/layouts-rfc<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>4. Typescript 4.7<\/h2>\n","innerContent":["\n<h2>4. Typescript 4.7<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Pami\u0119tacie te stare dobre czasy, kiedy du\u017ce wydania popularnych j\u0119zyk\u00f3w wychodzi\u0142y raz na kilka lat? O Javie 8 pisa\u0142o si\u0119 latami i w mojej g\u0142owie to nadal \u201cta nowa\u201d wersja Javy. Od tego czasu jako bran\u017ca wiele si\u0119 nauczyli\u015bmy i do tworzenia j\u0119zyk\u00f3w podchodzimy du\u017co bardziej inkrementalnie. Wsiadaj\u0105c do poci\u0105gu wyda\u0144 (wolne t\u0142umaczenie \u201cRelease Train\u201d) zyskali\u015bmy prostsze aktualizacje i szybsz\u0105 p\u0119tl\u0119 zwrotn\u0105, ale gdzie\u015b po drodze ca\u0142kowicie zatracili\u015bmy rado\u015b\u0107 z odkrywania nowych wyda\u0144 naszych ukochanych j\u0119zyk\u00f3w.<\/p>\n","innerContent":["\n<p>Pami\u0119tacie te stare dobre czasy, kiedy du\u017ce wydania popularnych j\u0119zyk\u00f3w wychodzi\u0142y raz na kilka lat? O Javie 8 pisa\u0142o si\u0119 latami i w mojej g\u0142owie to nadal \u201cta nowa\u201d wersja Javy. Od tego czasu jako bran\u017ca wiele si\u0119 nauczyli\u015bmy i do tworzenia j\u0119zyk\u00f3w podchodzimy du\u017co bardziej inkrementalnie. Wsiadaj\u0105c do poci\u0105gu wyda\u0144 (wolne t\u0142umaczenie \u201cRelease Train\u201d) zyskali\u015bmy prostsze aktualizacje i szybsz\u0105 p\u0119tl\u0119 zwrotn\u0105, ale gdzie\u015b po drodze ca\u0142kowicie zatracili\u015bmy rado\u015b\u0107 z odkrywania nowych wyda\u0144 naszych ukochanych j\u0119zyk\u00f3w.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":4540,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/giphy-1.gif\" alt=\"\" class=\"wp-image-4540\"\/><figcaption>Tak wygl\u0105da m\u00f3j entuzjazm na wie\u015b\u0107 o kolejnej wersji TypeScript<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/giphy-1.gif\" alt=\"\" class=\"wp-image-4540\"\/><figcaption>Tak wygl\u0105da m\u00f3j entuzjazm na wie\u015b\u0107 o kolejnej wersji TypeScript<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nie popadajmy jednak w marazm i sp\u00f3jrzmy na nowo\u015bci, jakie przynosi wydany w tym tygodniu TypeScript 4.7. Najwi\u0119ksz\u0105 ze wszystkich jest wsparcie dla ECMAScript Module w Node.js. Modu\u0142y w JavaScript to prawdziwa g\u00f3ra lodowa, dlatego wszystkim, kt\u00f3rzy nie s\u0105 zaznajomieni z tematem polecam film od Przeprogramowanych po\u015bwi\u0119cony w ca\u0142o\u015bci temu zagadnieniu.<\/p>\n","innerContent":["\n<p>Nie popadajmy jednak w marazm i sp\u00f3jrzmy na nowo\u015bci, jakie przynosi wydany w tym tygodniu TypeScript 4.7. Najwi\u0119ksz\u0105 ze wszystkich jest wsparcie dla ECMAScript Module w Node.js. Modu\u0142y w JavaScript to prawdziwa g\u00f3ra lodowa, dlatego wszystkim, kt\u00f3rzy nie s\u0105 zaznajomieni z tematem polecam film od Przeprogramowanych po\u015bwi\u0119cony w ca\u0142o\u015bci temu zagadnieniu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889eea22c7.jpg\" alt=\"\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889eea22c7.jpg\" alt=\"\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Co sk\u0142ada si\u0119 na wsparcie dla ECMAScript Modules? Przede wszystkim do tsconfig.json i package.json trafiaj\u0105 nowe pola, kt\u00f3re decydowa\u0107 b\u0119d\u0105 o tym w jaki spos\u00f3b traktowane s\u0105 importy w danym module. Do tego dochodzi wsparcie dla plik\u00f3w `.mts` i `.cts`, kt\u00f3re kompilowane b\u0119d\u0105 odpowiednio do plik\u00f3w `.mjs` i \u2018.cjs`. Oczywi\u015bcie jak zawsze w przypadku modu\u0142\u00f3w, temat jest du\u017co bardziej z\u0142o\u017cony, dlatego wszystkich zainteresowanych szczeg\u00f3\u0142ami odsy\u0142am do notki Microsoftu.<\/p>\n","innerContent":["\n<p>Co sk\u0142ada si\u0119 na wsparcie dla ECMAScript Modules? Przede wszystkim do tsconfig.json i package.json trafiaj\u0105 nowe pola, kt\u00f3re decydowa\u0107 b\u0119d\u0105 o tym w jaki spos\u00f3b traktowane s\u0105 importy w danym module. Do tego dochodzi wsparcie dla plik\u00f3w `.mts` i `.cts`, kt\u00f3re kompilowane b\u0119d\u0105 odpowiednio do plik\u00f3w `.mjs` i \u2018.cjs`. Oczywi\u015bcie jak zawsze w przypadku modu\u0142\u00f3w, temat jest du\u017co bardziej z\u0142o\u017cony, dlatego wszystkich zainteresowanych szczeg\u00f3\u0142ami odsy\u0142am do notki Microsoftu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nowa edycja TypeScript jak zwykle przynosi r\u00f3wnie\u017c drobne usprawnienia inferencji typ\u00f3w. Wersja 4.7 b\u0119dzie lepiej radzi\u0107 sobie z analiz\u0105 przep\u0142ywu kodu, dzi\u0119ki czemu w wielu przypadkach b\u0119dzie w stanie zaw\u0119zi\u0107 inferowane typy. Usprawniona zosta\u0142a r\u00f3wnie\u017c inferencja typ\u00f3w metod w obiektach.<\/p>\n","innerContent":["\n<p>Nowa edycja TypeScript jak zwykle przynosi r\u00f3wnie\u017c drobne usprawnienia inferencji typ\u00f3w. Wersja 4.7 b\u0119dzie lepiej radzi\u0107 sobie z analiz\u0105 przep\u0142ywu kodu, dzi\u0119ki czemu w wielu przypadkach b\u0119dzie w stanie zaw\u0119zi\u0107 inferowane typy. Usprawniona zosta\u0142a r\u00f3wnie\u017c inferencja typ\u00f3w metod w obiektach.<\/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\">declare function f&lt;T>(arg: {\n    produce: (n: string) => T,\n    consume: (x: T) => void }\n): void;\n\n\/\/ Works\nf({\n    produce: () => \"hello\",\n    consume: x => x.toLowerCase()\n});\n\n\/\/ Works\nf({\n    produce: (n: string) => n,\n    consume: x => x.toLowerCase(),\n});\n\n\/\/ Was an error, now works.\nf({\n    produce: n => n,\n    consume: x => x.toLowerCase(),\n});\n\n\/\/ Was an error, now works.\nf({\n    produce: function () { return \"hello\"; },\n    consume: x => x.toLowerCase(),\n});\n\n\/\/ Was an error, now works.\nf({\n    produce() { return \"hello\" },\n    consume: x => x.toLowerCase(),\n});\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">declare function f&lt;T>(arg: {\n    produce: (n: string) => T,\n    consume: (x: T) => void }\n): void;\n\n\/\/ Works\nf({\n    produce: () => \"hello\",\n    consume: x => x.toLowerCase()\n});\n\n\/\/ Works\nf({\n    produce: (n: string) => n,\n    consume: x => x.toLowerCase(),\n});\n\n\/\/ Was an error, now works.\nf({\n    produce: n => n,\n    consume: x => x.toLowerCase(),\n});\n\n\/\/ Was an error, now works.\nf({\n    produce: function () { return \"hello\"; },\n    consume: x => x.toLowerCase(),\n});\n\n\/\/ Was an error, now works.\nf({\n    produce() { return \"hello\" },\n    consume: x => x.toLowerCase(),\n});\n<\/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 jest wprowadzenie Instantiation Expressions, kt\u00f3re w zwi\u0119z\u0142y spos\u00f3b pozwalaj\u0105 zaw\u0119zi\u0107 typ danej funkcji, czy klasy. Ci\u0119\u017cko to wyt\u0142umaczy\u0107, wi\u0119c po prostu zerknijcie na przyk\u0142ad poni\u017cej:<\/p>\n","innerContent":["\n<p>Kolejn\u0105 nowo\u015bci\u0105 jest wprowadzenie Instantiation Expressions, kt\u00f3re w zwi\u0119z\u0142y spos\u00f3b pozwalaj\u0105 zaw\u0119zi\u0107 typ danej funkcji, czy klasy. Ci\u0119\u017cko to wyt\u0142umaczy\u0107, wi\u0119c po prostu zerknijcie na przyk\u0142ad poni\u017cej:<\/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\">interface Box&lt;T> {  value: T; }\n\nfunction makeBox&lt;T>(value: T) {\n    return { value };\n}\n\n\/\/ In TypeScript 4.6\nconst makeStringBox: (string: string) => Box&lt;string> = makeBox;\n\n\/\/ In TypeScript 4.7\nconst makeStringBox = makeBox&lt;string>;\n\nmakeStringBos(42); \/\/ TypeScript correctly rejects this.<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">interface Box&lt;T> {  value: T; }\n\nfunction makeBox&lt;T>(value: T) {\n    return { value };\n}\n\n\/\/ In TypeScript 4.6\nconst makeStringBox: (string: string) => Box&lt;string> = makeBox;\n\n\/\/ In TypeScript 4.7\nconst makeStringBox = makeBox&lt;string>;\n\nmakeStringBos(42); \/\/ TypeScript correctly rejects this.<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Na koniec zostawi\u0142em sobie prawdziw\u0105 bomb\u0119: wariancja typ\u00f3w. Nie wchodz\u0105c w szczeg\u00f3\u0142y, wariancja w przypadku generycznych typ\u00f3w pozwala okre\u015bli\u0107 czy dane typy mog\u0105 zosta\u0107 do siebie przypisane na podstawie struktury dziedziczenia ich generycznych parametr\u00f3w. Dog\u0142\u0119bne wyt\u0142umaczenie jak dzia\u0142a wariancja zdecydowanie nie mie\u015bci si\u0119 w formule naszych przegl\u0105d\u00f3w, dlatego zainteresowanych odsy\u0142am do dokumentacji Kotlina, kt\u00f3ry zdecydowa\u0142 si\u0119 na tak\u0105 sam\u0105 nomenklatur\u0119 jak TypeScript (czyli s\u0142owa kluczowe in i out). Po co nam wariancja w strukturalnie typowanym j\u0119zyku? Na \u201cch\u0142opski rozum\u201d, wszystkie typy mo\u017cna rozwin\u0105\u0107 i por\u00f3wna\u0107. Jak si\u0119 okazuje, w przypadku skomplikowanych zagnie\u017cd\u017conych typ\u00f3w sprawdzenie wariancji b\u0119dzie znacznie szybsze ni\u017c ich rozwijanie.<\/p>\n","innerContent":["\n<p>Na koniec zostawi\u0142em sobie prawdziw\u0105 bomb\u0119: wariancja typ\u00f3w. Nie wchodz\u0105c w szczeg\u00f3\u0142y, wariancja w przypadku generycznych typ\u00f3w pozwala okre\u015bli\u0107 czy dane typy mog\u0105 zosta\u0107 do siebie przypisane na podstawie struktury dziedziczenia ich generycznych parametr\u00f3w. Dog\u0142\u0119bne wyt\u0142umaczenie jak dzia\u0142a wariancja zdecydowanie nie mie\u015bci si\u0119 w formule naszych przegl\u0105d\u00f3w, dlatego zainteresowanych odsy\u0142am do dokumentacji Kotlina, kt\u00f3ry zdecydowa\u0142 si\u0119 na tak\u0105 sam\u0105 nomenklatur\u0119 jak TypeScript (czyli s\u0142owa kluczowe in i out). Po co nam wariancja w strukturalnie typowanym j\u0119zyku? Na \u201cch\u0142opski rozum\u201d, wszystkie typy mo\u017cna rozwin\u0105\u0107 i por\u00f3wna\u0107. Jak si\u0119 okazuje, w przypadku skomplikowanych zagnie\u017cd\u017conych typ\u00f3w sprawdzenie wariancji b\u0119dzie znacznie szybsze ni\u017c ich rozwijanie.<\/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\">interface Animal {\n    animalStuff: any;\n}\n\ninterface Dog extends Animal {\n    dogStuff: any;\n}\n\ntype Getter&lt;out T> = () => T;\ntype Setter&lt;in T> = (value: T) => void;\n\nlet animalGetter: Getter&lt;Animal>;\nlet dogGetter: Getter&lt;Dog>;\nanimalGetter = dogGetter; \/\/ This will work\ndogGetter = animalGetter; \/\/ This will throw an error\n\nlet animalSetter: Setter&lt;Animal>;\nlet dogSetter: Setter&lt;Dog>;\nanimalSetter = dogSetter; \/\/ This will throw an error\ndogSetter = animalSetter; \/\/ This will work<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">interface Animal {\n    animalStuff: any;\n}\n\ninterface Dog extends Animal {\n    dogStuff: any;\n}\n\ntype Getter&lt;out T> = () => T;\ntype Setter&lt;in T> = (value: T) => void;\n\nlet animalGetter: Getter&lt;Animal>;\nlet dogGetter: Getter&lt;Dog>;\nanimalGetter = dogGetter; \/\/ This will work\ndogGetter = animalGetter; \/\/ This will throw an error\n\nlet animalSetter: Setter&lt;Animal>;\nlet dogSetter: Setter&lt;Dog>;\nanimalSetter = dogSetter; \/\/ This will throw an error\ndogSetter = animalSetter; \/\/ This will work<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889ef041e0.jpg\" alt=\"\"\/><figcaption>Mam nadziej\u0119, \u017ce nie tylko m\u00f3j m\u00f3zg tak ma na kilka dni po tym jak przypominam sobie jak dzia\u0142a kowariancja.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889ef041e0.jpg\" alt=\"\"\/><figcaption>Mam nadziej\u0119, \u017ce nie tylko m\u00f3j m\u00f3zg tak ma na kilka dni po tym jak przypominam sobie jak dzia\u0142a kowariancja.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a:<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-7\/\">https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-7\/<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-7\/\">https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-4-7\/<\/a><\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/9965","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=9965"}],"version-history":[{"count":1,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/9965\/revisions"}],"predecessor-version":[{"id":10491,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/9965\/revisions\/10491"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/8115"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=9965"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=9965"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=9965"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}