{"id":10148,"date":"2021-04-22T10:59:01","date_gmt":"2021-04-22T08:59:01","guid":{"rendered":"https:\/\/vived.io\/frontend-thursday-vol-34\/"},"modified":"2022-09-19T13:16:43","modified_gmt":"2022-09-19T11:16:43","slug":"frontend-thursday-vol-34","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/","title":{"rendered":"Frontend Thursday vol. 34"},"content":{"rendered":"<h1 id=\"1-rx-angular\">1. rx-angular<\/h1>\n<p>zone.js to biblioteka, kt\u00f3ra od pocz\u0105tku sta\u0142a u podstaw Angulara. Jej g\u0142\u00f3wnym zadaniem jest opakowanie przegl\u0105darkowych event\u00f3w w odpowiednie API, dzi\u0119ki kt\u00f3remu Angular mo\u017ce przy okazji ka\u017cdego zdarzenia, uruchomi\u0107 mechanizm wykrywania zmian. Proces ten pozwala przypisa\u0107 warto\u015b\u0107 do zmiennej w komponencie i zostanie ona automatycznie od\u015bwie\u017cona na interfejsie u\u017cytkownika. Problem jest jeden: programi\u015bci stracili kontrol\u0119 nad uruchomieniem mechanizmu wykrywania zmian, a co za tym idzie nad wydajno\u015bci\u0105 swoich aplikacji. Odpowiedzi\u0105 na ten problem jest zmiana ChangeDetectionStrategy na OnPush, co w sporym skr\u00f3cie wprowadza nast\u0119puj\u0105cy kontrakt: komponent zmienia sw\u00f3j stan tylko, kiedy zmieniaj\u0105 si\u0119 jego parametry wej\u015bciowe. Mo\u017ce si\u0119 wydawa\u0107, \u017ce w takim scenariuszu zone.js staje si\u0119 zb\u0119dny. Niestety sporo angularowych rozwi\u0105za\u0144 jest mocno powi\u0105zanych z zone.js (np. async pipe przestanie dzia\u0142a\u0107, je\u015bli pozbawi\u0107 go dost\u0119pu do tej biblioteki). rx-angular to zestaw narz\u0119dzi, kt\u00f3ry idzie o krok dalej i b\u0119dzie wspiera\u0107 programist\u00f3w w tworzeniu aplikacji ca\u0142kowicie pozbawionych zone.js.<\/p>\n<p>Na rx-angular sk\u0142adaj\u0105 si\u0119 trzy niezale\u017cne parkiety: @rx-angular\/cdk, @rx-angular\/state i @rx-angular\/template. Pierwszy z nich ma pomaga\u0107 w tworzeniu wydajnych komponent\u00f3w. Na ten moment dostarcza on przede wszystkim zestaw funkcji do sterowania zone.js, pozwalaj\u0105cych stopniowo go wy\u0142\u0105cza\u0107, aby ostatecznie pozby\u0107 si\u0119 go ca\u0142kowicie.<\/p>\n<p>Druga z wymienionych bibliotek pozwala na zarz\u0105dzanie stanem komponentu w reaktywny spos\u00f3b (i oczywi\u015bcie dzia\u0142a przy wy\u0142\u0105czonym zone.js). W pierwszej chwili bardzo skojarzy\u0142o mi si\u0119 to z reactowymi hookami i je\u015bli przyjrze\u0107 si\u0119 temu bli\u017cej, to rzeczywi\u015bcie dzia\u0142a to bardzo podobnie do useState.<\/p>\n<pre><code class=\"language-js\">@Component({\n\tselector: &#039;app-stateful&#039;,\n\ttemplate: ` &lt;div&gt;{{ title$ | async }}&lt;\/div&gt; `,\n\tproviders: [RxState],\n})\nexport class StatefulComponent {\n\treadonly title$ = this.state.select(&#039;title&#039;);\n\t@Input() set title(title: string) {\n\t\tthis.state.set({ title });\n\t}\n\tconstructor(private state: RxState&lt;{ title: string }&gt;) {}\n}<\/code><\/pre>\n<p>Na deser zostawi\u0142em sobie najciekawsz\u0105 z trzech paczek. @rx-angular\/template zawiera w sobie dwie nowe dyrektywy. Dyrektywa `push` jest odpowiedzi\u0105 na wspomniany w pierwszym akapicie problem z async. Pozwala ona wi\u0119c zasubskrybowa\u0107 si\u0119 do strumienia danych, ale nie wymaga do tego zone.js. Druga to rxLet, i jest s\u0142odzikiem syntaktycznym (uwielbiam to spolszczenie) na `*ngIf=\u201d(stream$ | async); let value\u201d`. <\/p>\n<pre><code class=\"language-html\">&lt;ng-container\n\t*rxLet=&quot;observableNumber$; let n; let e = $error, let c = $complete&quot;\n&gt;\n\t&lt;app-number [number]=&quot;n&quot; *ngIf=&quot;!e &amp;&amp; !c&quot;&gt;&lt;\/app-number&gt;\n\t&lt;ng-container *ngIf=&quot;e&quot;&gt; There is an error: {{ e }} &lt;\/ng-container&gt;\n\t&lt;ng-container *ngIf=&quot;c&quot;&gt; Observable completed: {{ c }} &lt;\/ng-container&gt;\n&lt;\/ng-container&gt;<\/code><\/pre>\n<pre><code class=\"language-html\">&lt;hero-search [term]=&quot;searchTerm$ | push&quot;&gt; &lt;\/hero-search&gt;\n&lt;hero-list-component [heroes]=&quot;heroes$ | push&quot;&gt; &lt;\/hero-list-component&gt;<\/code><\/pre>\n<p>To co jest tak naprawd\u0119 ciekawe w tym pakiecie to dodatkowy parametr, jaki mog\u0105 przyjmowa\u0107 te dyrektywy, czyli render strategy. Na ten moment dost\u0119pne s\u0105 tylko strategie znane z podstawowego Angulara, ale w planach jest implementacja strategii, kt\u00f3re pozwol\u0105 na priorytetyzacj\u0119 renderowania poszczeg\u00f3lnych komponent\u00f3w. Kiedy obiecane strategie zostan\u0105 dostarczone to my\u015bl\u0119, \u017ce pakiet ten stanie si\u0119 jednym z podstawowych narz\u0119dzi przy optymalizacji angularowych aplikacji.<\/p>\n<p>W tej beczce miodu jest te\u017c niestety \u0142y\u017cka dziegciu. rx-angular na razie dost\u0119pny jest w wersji beta i nie wiadomo, kiedy mo\u017cemy si\u0119 spodziewa\u0107 wypuszczenia stabilnej wersji.<\/p>\n<h3 id=\"%C5%BAr%C3%B3d%C5%82a\">\u0179r\u00f3d\u0142a:<\/h3>\n<p><a href=\"https:\/\/github.com\/rx-angular\/rx-angular\">https:\/\/github.com\/rx-angular\/rx-angular<\/a><\/p>\n<h1 id=\"2-por%C3%B3wnanie-narz%C4%99dzi-nowej-generacji-do-budowania-aplikacji\">2. Por\u00f3wnanie narz\u0119dzi nowej generacji do budowania aplikacji<\/h1>\n<p>Je\u015bli \u015bledzicie nasze frontendowe przegl\u0105dy od jakiego\u015b czasu, to pewnie wiecie, \u017ce z zapartym tchem \u015bledz\u0119 nowe narz\u0119dzia do budowania aplikacji (a esbuild absolutnie skrad\u0142 moje serce). W poprzednich edycjach stara\u0142em si\u0119 przemyci\u0107 Wam co nieco o Vite czy Snowpacku, ale z moj\u0105 skromn\u0105 wiedz\u0105 i ograniczeniami naszej formu\u0142y by\u0142y to raczej marne pr\u00f3by. Je\u015bli Was te\u017c interesuj\u0105 nast\u0119pcy Webpacka i Rollupa, to w \u017ar\u00f3d\u0142ach znajdziecie prawdziw\u0105 kopalni\u0119 wiedzy na ten temat. Gdybym mia\u0142 wybra\u0107 jeden artyku\u0142, kt\u00f3ry polecam w tym temacie, to by\u0142by to w\u0142a\u015bnie ten podlinkowany poni\u017cej. Przygotujcie tylko gigantyczny kubek kawy, bo nie jest to kr\u00f3tka lektura \u2615\ufe0f.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0ace92e07.gif\" class=\"kg-image\" alt loading=\"lazy\"><\/figure>\n<h3 id=\"%C5%BAr%C3%B3d%C5%82a-1\">\u0179r\u00f3d\u0142a:<\/h3>\n<p><a href=\"https:\/\/css-tricks.com\/comparing-the-new-generation-of-build-tools\/\">https:\/\/css-tricks.com\/comparing-the-new-generation-of-build-tools\/<\/a><\/p>\n<h1 id=\"3-nodejs-16-i-deno-19\">3. Node.js 16 i Deno 1.9<\/h1>\n<p>W\u015br\u00f3d frontendowych framework\u00f3w i bibliotek nie dzia\u0142o si\u0119 w tym tygodniu w\u0142a\u015bciwie nic ciekawego. W zwi\u0105zku z tym postanowi\u0142em rzuci\u0107 okiem na to co dzia\u0142o si\u0119 po backendowej stronie JavaScriptu. Nag\u0142\u00f3wki wygl\u0105da\u0142y obiecuj\u0105co, bo dw\u00f3ch najwi\u0119kszych graczy wypu\u015bci\u0142o du\u017ce aktualizacje do swoich \u015brodowisk uruchomieniowych. Kiedy wczyta\u0142em si\u0119 dok\u0142adniej w aktualizacje, bole\u015bnie przekona\u0142em si\u0119 o tym, \u017ce po drugiej stronie p\u0142otu trawa wcale nie jest bardziej zielona, a zmiany nie s\u0105 ani odrobin\u0119 bardziej dynamiczne ni\u017c te po frontendowej stronie.<\/p>\n<p>Nowa wersja Node to przede wszystkim podbicie wersji V8 z 8.6 na 9.0 i nowe funkcjonalno\u015bci z tym zwi\u0105zane. \u0141atk\u0119 stabilno\u015bci dosta\u0142a funkcja `setTimeout` z pakietu `promisify`. Node 16.0 b\u0119dzie te\u017c pierwsz\u0105 wersj\u0105 dostarczaj\u0105c\u0105 natywne wsparcie dla Apple Silicon.<\/p>\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0ad06f163.gif\" class=\"kg-image\" alt loading=\"lazy\"><figcaption>Je\u015bli m\u00f3wimy ju\u017c o M1 to jak podoba\u0142a wam si\u0119 ostatnia konferencja Apple? Kto\u015b z Was czeka\u0142 na iPad i iMac z M1?<\/figcaption><\/figure>\n<p>W nowej wersji Deno dzieje si\u0119 nieco wi\u0119cej, ale ci\u0119\u017cko m\u00f3wi\u0107 tutaj o prze\u0142omowych zmianach. Najwi\u0119ksz\u0105 nowo\u015bci\u0105 jest natywne wsparcie dla serwera HTTP\/2 i przy\u015bpieszenie komunikacji z dzia\u0142aj\u0105cym pod spodem Rustem. Ciekawie wygl\u0105da te\u017c wsparcie dla dynamicznego dopytywania o dost\u0119p zamiast definiowania ich upfront.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0b3679d31.gif\" class=\"kg-image\" alt loading=\"lazy\"><\/figure>\n<h3 id=\"%C5%BAr%C3%B3d%C5%82a-2\">\u0179r\u00f3d\u0142a:<\/h3>\n<p><a href=\"https:\/\/nodejs.medium.com\/node-js-16-available-now-7f5099a97e70\">https:\/\/nodejs.medium.com\/node-js-16-available-now-7f5099a97e70<\/a><br \/><a href=\"https:\/\/deno.com\/blog\/v1.9\">https:\/\/deno.com\/blog\/v1.9<\/a><\/p>\n<hr \/>\n<p>Pami\u0119tajcie, \u017ceby spr\u00f3bowa\u0107 Vived, je\u015bli chcesz otrzymywa\u0107 tego typu tre\u015bci spersonalizowane pod Ciebie!<\/p>\n<ul>\n<li><a href=\"https:\/\/apps.apple.com\/app\/apple-store\/id1460117345?pt=120039206&amp;ct=frontend-thursday&amp;mt=8\">App Store<\/a> <\/li>\n<li><a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.virtuslab.vived&amp;referrer=utm_source%3Dvived-blog%26utm_medium%3Dfrontend-thursday%26utm_campaign%3Dfrontend-thursday%26anid%3Dadmob\">Play Store<\/a> <\/li>\n<li><a href=\"https:\/\/app.vived.io\/\">Wersja PWA<\/a> <\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>1. rx-angular zone.js to biblioteka, kt\u00f3ra od pocz\u0105tku sta\u0142a u podstaw Angulara. Jej g\u0142\u00f3wnym zadaniem jest opakowanie przegl\u0105darkowych event\u00f3w w odpowiednie API, dzi\u0119ki kt\u00f3remu Angular mo\u017ce przy okazji ka\u017cdego zdarzenia, uruchomi\u0107 mechanizm wykrywania zmian. Proces ten pozwala przypisa\u0107 warto\u015b\u0107 do zmiennej w komponencie i zostanie ona automatycznie od\u015bwie\u017cona na interfejsie u\u017cytkownika. Problem jest jeden: programi\u015bci [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[273],"tags":[],"class_list":["post-10148","post","type-post","status-publish","format-standard","hentry","category-frontend-pl"],"acf":{"weekly_summary":true,"estimated_reading_time":"4"},"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. 34 - 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-34\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Frontend Thursday vol. 34 - Vived\" \/>\n<meta property=\"og:description\" content=\"1. rx-angular zone.js to biblioteka, kt\u00f3ra od pocz\u0105tku sta\u0142a u podstaw Angulara. Jej g\u0142\u00f3wnym zadaniem jest opakowanie przegl\u0105darkowych event\u00f3w w odpowiednie API, dzi\u0119ki kt\u00f3remu Angular mo\u017ce przy okazji ka\u017cdego zdarzenia, uruchomi\u0107 mechanizm wykrywania zmian. Proces ten pozwala przypisa\u0107 warto\u015b\u0107 do zmiennej w komponencie i zostanie ona automatycznie od\u015bwie\u017cona na interfejsie u\u017cytkownika. Problem jest jeden: programi\u015bci [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2021-04-22T08:59:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-09-19T11:16:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0ace92e07.gif\" \/>\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-34\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/\"},\"author\":{\"name\":\"Tomasz Borowicz\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb\"},\"headline\":\"Frontend Thursday vol. 34\",\"datePublished\":\"2021-04-22T08:59:01+00:00\",\"dateModified\":\"2022-09-19T11:16:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/\"},\"wordCount\":865,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0ace92e07.gif\",\"articleSection\":[\"Frontend\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/\",\"url\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/\",\"name\":\"Frontend Thursday vol. 34 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0ace92e07.gif\",\"datePublished\":\"2021-04-22T08:59:01+00:00\",\"dateModified\":\"2022-09-19T11:16:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0ace92e07.gif\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0ace92e07.gif\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Frontend Thursday vol. 34\"}]},{\"@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. 34 - 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-34\/","og_locale":"pl_PL","og_type":"article","og_title":"Frontend Thursday vol. 34 - Vived","og_description":"1. rx-angular zone.js to biblioteka, kt\u00f3ra od pocz\u0105tku sta\u0142a u podstaw Angulara. Jej g\u0142\u00f3wnym zadaniem jest opakowanie przegl\u0105darkowych event\u00f3w w odpowiednie API, dzi\u0119ki kt\u00f3remu Angular mo\u017ce przy okazji ka\u017cdego zdarzenia, uruchomi\u0107 mechanizm wykrywania zmian. Proces ten pozwala przypisa\u0107 warto\u015b\u0107 do zmiennej w komponencie i zostanie ona automatycznie od\u015bwie\u017cona na interfejsie u\u017cytkownika. Problem jest jeden: programi\u015bci [&hellip;]","og_url":"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/","og_site_name":"Vived","article_published_time":"2021-04-22T08:59:01+00:00","article_modified_time":"2022-09-19T11:16:43+00:00","og_image":[{"url":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0ace92e07.gif","type":"","width":"","height":""}],"author":"Tomasz Borowicz","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/"},"author":{"name":"Tomasz Borowicz","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb"},"headline":"Frontend Thursday vol. 34","datePublished":"2021-04-22T08:59:01+00:00","dateModified":"2022-09-19T11:16:43+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/"},"wordCount":865,"commentCount":0,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0ace92e07.gif","articleSection":["Frontend"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/","url":"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/","name":"Frontend Thursday vol. 34 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0ace92e07.gif","datePublished":"2021-04-22T08:59:01+00:00","dateModified":"2022-09-19T11:16:43+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0ace92e07.gif","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0ace92e07.gif"},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-34\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Frontend Thursday vol. 34"}]},{"@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":null,"attrs":[],"innerBlocks":[],"innerHTML":"<h1 id=\"1-rx-angular\">1. rx-angular<\/h1><p>zone.js to biblioteka, kt\u00f3ra od pocz\u0105tku sta\u0142a u podstaw Angulara. Jej g\u0142\u00f3wnym zadaniem jest opakowanie przegl\u0105darkowych event\u00f3w w odpowiednie API, dzi\u0119ki kt\u00f3remu Angular mo\u017ce przy okazji ka\u017cdego zdarzenia, uruchomi\u0107 mechanizm wykrywania zmian. Proces ten pozwala przypisa\u0107 warto\u015b\u0107 do zmiennej w komponencie i zostanie ona automatycznie od\u015bwie\u017cona na interfejsie u\u017cytkownika. Problem jest jeden: programi\u015bci stracili kontrol\u0119 nad uruchomieniem mechanizmu wykrywania zmian, a co za tym idzie nad wydajno\u015bci\u0105 swoich aplikacji. Odpowiedzi\u0105 na ten problem jest zmiana ChangeDetectionStrategy na OnPush, co w sporym skr\u00f3cie wprowadza nast\u0119puj\u0105cy kontrakt: komponent zmienia sw\u00f3j stan tylko, kiedy zmieniaj\u0105 si\u0119 jego parametry wej\u015bciowe. Mo\u017ce si\u0119 wydawa\u0107, \u017ce w takim scenariuszu zone.js staje si\u0119 zb\u0119dny. Niestety sporo angularowych rozwi\u0105za\u0144 jest mocno powi\u0105zanych z zone.js (np. async pipe przestanie dzia\u0142a\u0107, je\u015bli pozbawi\u0107 go dost\u0119pu do tej biblioteki). rx-angular to zestaw narz\u0119dzi, kt\u00f3ry idzie o krok dalej i b\u0119dzie wspiera\u0107 programist\u00f3w w tworzeniu aplikacji ca\u0142kowicie pozbawionych zone.js.<\/p><p>Na rx-angular sk\u0142adaj\u0105 si\u0119 trzy niezale\u017cne parkiety: @rx-angular\/cdk, @rx-angular\/state i @rx-angular\/template. Pierwszy z nich ma pomaga\u0107 w tworzeniu wydajnych komponent\u00f3w. Na ten moment dostarcza on przede wszystkim zestaw funkcji do sterowania zone.js, pozwalaj\u0105cych stopniowo go wy\u0142\u0105cza\u0107, aby ostatecznie pozby\u0107 si\u0119 go ca\u0142kowicie.<\/p><p>Druga z wymienionych bibliotek pozwala na zarz\u0105dzanie stanem komponentu w reaktywny spos\u00f3b (i oczywi\u015bcie dzia\u0142a przy wy\u0142\u0105czonym zone.js). W pierwszej chwili bardzo skojarzy\u0142o mi si\u0119 to z reactowymi hookami i je\u015bli przyjrze\u0107 si\u0119 temu bli\u017cej, to rzeczywi\u015bcie dzia\u0142a to bardzo podobnie do useState.<\/p><pre><code class=\"language-js\">@Component({\n\tselector: 'app-stateful',\n\ttemplate: ` &lt;div&gt;{{ title$ | async }}&lt;\/div&gt; `,\n\tproviders: [RxState],\n})\nexport class StatefulComponent {\n\treadonly title$ = this.state.select('title');\n\t@Input() set title(title: string) {\n\t\tthis.state.set({ title });\n\t}\n\tconstructor(private state: RxState&lt;{ title: string }&gt;) {}\n}<\/code><\/pre><p>Na deser zostawi\u0142em sobie najciekawsz\u0105 z trzech paczek. @rx-angular\/template zawiera w sobie dwie nowe dyrektywy. Dyrektywa `push` jest odpowiedzi\u0105 na wspomniany w pierwszym akapicie problem z async. Pozwala ona wi\u0119c zasubskrybowa\u0107 si\u0119 do strumienia danych, ale nie wymaga do tego zone.js. Druga to rxLet, i jest s\u0142odzikiem syntaktycznym (uwielbiam to spolszczenie) na `*ngIf=\u201d(stream$ | async); let value\u201d`. <\/p><pre><code class=\"language-html\">&lt;ng-container\n\t*rxLet=\"observableNumber$; let n; let e = $error, let c = $complete\"\n&gt;\n\t&lt;app-number [number]=\"n\" *ngIf=\"!e &amp;&amp; !c\"&gt;&lt;\/app-number&gt;\n\t&lt;ng-container *ngIf=\"e\"&gt; There is an error: {{ e }} &lt;\/ng-container&gt;\n\t&lt;ng-container *ngIf=\"c\"&gt; Observable completed: {{ c }} &lt;\/ng-container&gt;\n&lt;\/ng-container&gt;<\/code><\/pre><pre><code class=\"language-html\">&lt;hero-search [term]=\"searchTerm$ | push\"&gt; &lt;\/hero-search&gt;\n&lt;hero-list-component [heroes]=\"heroes$ | push\"&gt; &lt;\/hero-list-component&gt;<\/code><\/pre><p>To co jest tak naprawd\u0119 ciekawe w tym pakiecie to dodatkowy parametr, jaki mog\u0105 przyjmowa\u0107 te dyrektywy, czyli render strategy. Na ten moment dost\u0119pne s\u0105 tylko strategie znane z podstawowego Angulara, ale w planach jest implementacja strategii, kt\u00f3re pozwol\u0105 na priorytetyzacj\u0119 renderowania poszczeg\u00f3lnych komponent\u00f3w. Kiedy obiecane strategie zostan\u0105 dostarczone to my\u015bl\u0119, \u017ce pakiet ten stanie si\u0119 jednym z podstawowych narz\u0119dzi przy optymalizacji angularowych aplikacji.<\/p><p>W tej beczce miodu jest te\u017c niestety \u0142y\u017cka dziegciu. rx-angular na razie dost\u0119pny jest w wersji beta i nie wiadomo, kiedy mo\u017cemy si\u0119 spodziewa\u0107 wypuszczenia stabilnej wersji.<\/p><h3 id=\"%C5%BAr%C3%B3d%C5%82a\">\u0179r\u00f3d\u0142a:<\/h3><p><a href=\"https:\/\/github.com\/rx-angular\/rx-angular\">https:\/\/github.com\/rx-angular\/rx-angular<\/a><\/p><h1 id=\"2-por%C3%B3wnanie-narz%C4%99dzi-nowej-generacji-do-budowania-aplikacji\">2. Por\u00f3wnanie narz\u0119dzi nowej generacji do budowania aplikacji<\/h1><p>Je\u015bli \u015bledzicie nasze frontendowe przegl\u0105dy od jakiego\u015b czasu, to pewnie wiecie, \u017ce z zapartym tchem \u015bledz\u0119 nowe narz\u0119dzia do budowania aplikacji (a esbuild absolutnie skrad\u0142 moje serce). W poprzednich edycjach stara\u0142em si\u0119 przemyci\u0107 Wam co nieco o Vite czy Snowpacku, ale z moj\u0105 skromn\u0105 wiedz\u0105 i ograniczeniami naszej formu\u0142y by\u0142y to raczej marne pr\u00f3by. Je\u015bli Was te\u017c interesuj\u0105 nast\u0119pcy Webpacka i Rollupa, to w \u017ar\u00f3d\u0142ach znajdziecie prawdziw\u0105 kopalni\u0119 wiedzy na ten temat. Gdybym mia\u0142 wybra\u0107 jeden artyku\u0142, kt\u00f3ry polecam w tym temacie, to by\u0142by to w\u0142a\u015bnie ten podlinkowany poni\u017cej. Przygotujcie tylko gigantyczny kubek kawy, bo nie jest to kr\u00f3tka lektura \u2615\ufe0f.<\/p><figure class=\"kg-card kg-image-card\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0ace92e07.gif\" class=\"kg-image\" alt loading=\"lazy\"><\/figure><h3 id=\"%C5%BAr%C3%B3d%C5%82a-1\">\u0179r\u00f3d\u0142a:<\/h3><p><a href=\"https:\/\/css-tricks.com\/comparing-the-new-generation-of-build-tools\/\">https:\/\/css-tricks.com\/comparing-the-new-generation-of-build-tools\/<\/a><\/p><h1 id=\"3-nodejs-16-i-deno-19\">3. Node.js 16 i Deno 1.9<\/h1><p>W\u015br\u00f3d frontendowych framework\u00f3w i bibliotek nie dzia\u0142o si\u0119 w tym tygodniu w\u0142a\u015bciwie nic ciekawego. W zwi\u0105zku z tym postanowi\u0142em rzuci\u0107 okiem na to co dzia\u0142o si\u0119 po backendowej stronie JavaScriptu. Nag\u0142\u00f3wki wygl\u0105da\u0142y obiecuj\u0105co, bo dw\u00f3ch najwi\u0119kszych graczy wypu\u015bci\u0142o du\u017ce aktualizacje do swoich \u015brodowisk uruchomieniowych. Kiedy wczyta\u0142em si\u0119 dok\u0142adniej w aktualizacje, bole\u015bnie przekona\u0142em si\u0119 o tym, \u017ce po drugiej stronie p\u0142otu trawa wcale nie jest bardziej zielona, a zmiany nie s\u0105 ani odrobin\u0119 bardziej dynamiczne ni\u017c te po frontendowej stronie.<\/p><p>Nowa wersja Node to przede wszystkim podbicie wersji V8 z 8.6 na 9.0 i nowe funkcjonalno\u015bci z tym zwi\u0105zane. \u0141atk\u0119 stabilno\u015bci dosta\u0142a funkcja `setTimeout` z pakietu `promisify`. Node 16.0 b\u0119dzie te\u017c pierwsz\u0105 wersj\u0105 dostarczaj\u0105c\u0105 natywne wsparcie dla Apple Silicon.<\/p><figure class=\"kg-card kg-image-card kg-card-hascaption\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0ad06f163.gif\" class=\"kg-image\" alt loading=\"lazy\"><figcaption>Je\u015bli m\u00f3wimy ju\u017c o M1 to jak podoba\u0142a wam si\u0119 ostatnia konferencja Apple? Kto\u015b z Was czeka\u0142 na iPad i iMac z M1?<\/figcaption><\/figure><p>W nowej wersji Deno dzieje si\u0119 nieco wi\u0119cej, ale ci\u0119\u017cko m\u00f3wi\u0107 tutaj o prze\u0142omowych zmianach. Najwi\u0119ksz\u0105 nowo\u015bci\u0105 jest natywne wsparcie dla serwera HTTP\/2 i przy\u015bpieszenie komunikacji z dzia\u0142aj\u0105cym pod spodem Rustem. Ciekawie wygl\u0105da te\u017c wsparcie dla dynamicznego dopytywania o dost\u0119p zamiast definiowania ich upfront.<\/p><figure class=\"kg-card kg-image-card\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0b3679d31.gif\" class=\"kg-image\" alt loading=\"lazy\"><\/figure><h3 id=\"%C5%BAr%C3%B3d%C5%82a-2\">\u0179r\u00f3d\u0142a:<\/h3><p><a href=\"https:\/\/nodejs.medium.com\/node-js-16-available-now-7f5099a97e70\">https:\/\/nodejs.medium.com\/node-js-16-available-now-7f5099a97e70<\/a><br \/><a href=\"https:\/\/deno.com\/blog\/v1.9\">https:\/\/deno.com\/blog\/v1.9<\/a><\/p><hr \/><p>Pami\u0119tajcie, \u017ceby spr\u00f3bowa\u0107 Vived, je\u015bli chcesz otrzymywa\u0107 tego typu tre\u015bci spersonalizowane pod Ciebie!<\/p><ul><li><a href=\"https:\/\/apps.apple.com\/app\/apple-store\/id1460117345?pt=120039206&amp;ct=frontend-thursday&amp;mt=8\">App Store<\/a> <\/li><li><a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.virtuslab.vived&amp;referrer=utm_source%3Dvived-blog%26utm_medium%3Dfrontend-thursday%26utm_campaign%3Dfrontend-thursday%26anid%3Dadmob\">Play Store<\/a> <\/li><li><a href=\"https:\/\/app.vived.io\/\">Wersja PWA<\/a> <\/li><\/ul>","innerContent":["<h1 id=\"1-rx-angular\">1. rx-angular<\/h1><p>zone.js to biblioteka, kt\u00f3ra od pocz\u0105tku sta\u0142a u podstaw Angulara. Jej g\u0142\u00f3wnym zadaniem jest opakowanie przegl\u0105darkowych event\u00f3w w odpowiednie API, dzi\u0119ki kt\u00f3remu Angular mo\u017ce przy okazji ka\u017cdego zdarzenia, uruchomi\u0107 mechanizm wykrywania zmian. Proces ten pozwala przypisa\u0107 warto\u015b\u0107 do zmiennej w komponencie i zostanie ona automatycznie od\u015bwie\u017cona na interfejsie u\u017cytkownika. Problem jest jeden: programi\u015bci stracili kontrol\u0119 nad uruchomieniem mechanizmu wykrywania zmian, a co za tym idzie nad wydajno\u015bci\u0105 swoich aplikacji. Odpowiedzi\u0105 na ten problem jest zmiana ChangeDetectionStrategy na OnPush, co w sporym skr\u00f3cie wprowadza nast\u0119puj\u0105cy kontrakt: komponent zmienia sw\u00f3j stan tylko, kiedy zmieniaj\u0105 si\u0119 jego parametry wej\u015bciowe. Mo\u017ce si\u0119 wydawa\u0107, \u017ce w takim scenariuszu zone.js staje si\u0119 zb\u0119dny. Niestety sporo angularowych rozwi\u0105za\u0144 jest mocno powi\u0105zanych z zone.js (np. async pipe przestanie dzia\u0142a\u0107, je\u015bli pozbawi\u0107 go dost\u0119pu do tej biblioteki). rx-angular to zestaw narz\u0119dzi, kt\u00f3ry idzie o krok dalej i b\u0119dzie wspiera\u0107 programist\u00f3w w tworzeniu aplikacji ca\u0142kowicie pozbawionych zone.js.<\/p><p>Na rx-angular sk\u0142adaj\u0105 si\u0119 trzy niezale\u017cne parkiety: @rx-angular\/cdk, @rx-angular\/state i @rx-angular\/template. Pierwszy z nich ma pomaga\u0107 w tworzeniu wydajnych komponent\u00f3w. Na ten moment dostarcza on przede wszystkim zestaw funkcji do sterowania zone.js, pozwalaj\u0105cych stopniowo go wy\u0142\u0105cza\u0107, aby ostatecznie pozby\u0107 si\u0119 go ca\u0142kowicie.<\/p><p>Druga z wymienionych bibliotek pozwala na zarz\u0105dzanie stanem komponentu w reaktywny spos\u00f3b (i oczywi\u015bcie dzia\u0142a przy wy\u0142\u0105czonym zone.js). W pierwszej chwili bardzo skojarzy\u0142o mi si\u0119 to z reactowymi hookami i je\u015bli przyjrze\u0107 si\u0119 temu bli\u017cej, to rzeczywi\u015bcie dzia\u0142a to bardzo podobnie do useState.<\/p><pre><code class=\"language-js\">@Component({\n\tselector: 'app-stateful',\n\ttemplate: ` &lt;div&gt;{{ title$ | async }}&lt;\/div&gt; `,\n\tproviders: [RxState],\n})\nexport class StatefulComponent {\n\treadonly title$ = this.state.select('title');\n\t@Input() set title(title: string) {\n\t\tthis.state.set({ title });\n\t}\n\tconstructor(private state: RxState&lt;{ title: string }&gt;) {}\n}<\/code><\/pre><p>Na deser zostawi\u0142em sobie najciekawsz\u0105 z trzech paczek. @rx-angular\/template zawiera w sobie dwie nowe dyrektywy. Dyrektywa `push` jest odpowiedzi\u0105 na wspomniany w pierwszym akapicie problem z async. Pozwala ona wi\u0119c zasubskrybowa\u0107 si\u0119 do strumienia danych, ale nie wymaga do tego zone.js. Druga to rxLet, i jest s\u0142odzikiem syntaktycznym (uwielbiam to spolszczenie) na `*ngIf=\u201d(stream$ | async); let value\u201d`. <\/p><pre><code class=\"language-html\">&lt;ng-container\n\t*rxLet=\"observableNumber$; let n; let e = $error, let c = $complete\"\n&gt;\n\t&lt;app-number [number]=\"n\" *ngIf=\"!e &amp;&amp; !c\"&gt;&lt;\/app-number&gt;\n\t&lt;ng-container *ngIf=\"e\"&gt; There is an error: {{ e }} &lt;\/ng-container&gt;\n\t&lt;ng-container *ngIf=\"c\"&gt; Observable completed: {{ c }} &lt;\/ng-container&gt;\n&lt;\/ng-container&gt;<\/code><\/pre><pre><code class=\"language-html\">&lt;hero-search [term]=\"searchTerm$ | push\"&gt; &lt;\/hero-search&gt;\n&lt;hero-list-component [heroes]=\"heroes$ | push\"&gt; &lt;\/hero-list-component&gt;<\/code><\/pre><p>To co jest tak naprawd\u0119 ciekawe w tym pakiecie to dodatkowy parametr, jaki mog\u0105 przyjmowa\u0107 te dyrektywy, czyli render strategy. Na ten moment dost\u0119pne s\u0105 tylko strategie znane z podstawowego Angulara, ale w planach jest implementacja strategii, kt\u00f3re pozwol\u0105 na priorytetyzacj\u0119 renderowania poszczeg\u00f3lnych komponent\u00f3w. Kiedy obiecane strategie zostan\u0105 dostarczone to my\u015bl\u0119, \u017ce pakiet ten stanie si\u0119 jednym z podstawowych narz\u0119dzi przy optymalizacji angularowych aplikacji.<\/p><p>W tej beczce miodu jest te\u017c niestety \u0142y\u017cka dziegciu. rx-angular na razie dost\u0119pny jest w wersji beta i nie wiadomo, kiedy mo\u017cemy si\u0119 spodziewa\u0107 wypuszczenia stabilnej wersji.<\/p><h3 id=\"%C5%BAr%C3%B3d%C5%82a\">\u0179r\u00f3d\u0142a:<\/h3><p><a href=\"https:\/\/github.com\/rx-angular\/rx-angular\">https:\/\/github.com\/rx-angular\/rx-angular<\/a><\/p><h1 id=\"2-por%C3%B3wnanie-narz%C4%99dzi-nowej-generacji-do-budowania-aplikacji\">2. Por\u00f3wnanie narz\u0119dzi nowej generacji do budowania aplikacji<\/h1><p>Je\u015bli \u015bledzicie nasze frontendowe przegl\u0105dy od jakiego\u015b czasu, to pewnie wiecie, \u017ce z zapartym tchem \u015bledz\u0119 nowe narz\u0119dzia do budowania aplikacji (a esbuild absolutnie skrad\u0142 moje serce). W poprzednich edycjach stara\u0142em si\u0119 przemyci\u0107 Wam co nieco o Vite czy Snowpacku, ale z moj\u0105 skromn\u0105 wiedz\u0105 i ograniczeniami naszej formu\u0142y by\u0142y to raczej marne pr\u00f3by. Je\u015bli Was te\u017c interesuj\u0105 nast\u0119pcy Webpacka i Rollupa, to w \u017ar\u00f3d\u0142ach znajdziecie prawdziw\u0105 kopalni\u0119 wiedzy na ten temat. Gdybym mia\u0142 wybra\u0107 jeden artyku\u0142, kt\u00f3ry polecam w tym temacie, to by\u0142by to w\u0142a\u015bnie ten podlinkowany poni\u017cej. Przygotujcie tylko gigantyczny kubek kawy, bo nie jest to kr\u00f3tka lektura \u2615\ufe0f.<\/p><figure class=\"kg-card kg-image-card\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0ace92e07.gif\" class=\"kg-image\" alt loading=\"lazy\"><\/figure><h3 id=\"%C5%BAr%C3%B3d%C5%82a-1\">\u0179r\u00f3d\u0142a:<\/h3><p><a href=\"https:\/\/css-tricks.com\/comparing-the-new-generation-of-build-tools\/\">https:\/\/css-tricks.com\/comparing-the-new-generation-of-build-tools\/<\/a><\/p><h1 id=\"3-nodejs-16-i-deno-19\">3. Node.js 16 i Deno 1.9<\/h1><p>W\u015br\u00f3d frontendowych framework\u00f3w i bibliotek nie dzia\u0142o si\u0119 w tym tygodniu w\u0142a\u015bciwie nic ciekawego. W zwi\u0105zku z tym postanowi\u0142em rzuci\u0107 okiem na to co dzia\u0142o si\u0119 po backendowej stronie JavaScriptu. Nag\u0142\u00f3wki wygl\u0105da\u0142y obiecuj\u0105co, bo dw\u00f3ch najwi\u0119kszych graczy wypu\u015bci\u0142o du\u017ce aktualizacje do swoich \u015brodowisk uruchomieniowych. Kiedy wczyta\u0142em si\u0119 dok\u0142adniej w aktualizacje, bole\u015bnie przekona\u0142em si\u0119 o tym, \u017ce po drugiej stronie p\u0142otu trawa wcale nie jest bardziej zielona, a zmiany nie s\u0105 ani odrobin\u0119 bardziej dynamiczne ni\u017c te po frontendowej stronie.<\/p><p>Nowa wersja Node to przede wszystkim podbicie wersji V8 z 8.6 na 9.0 i nowe funkcjonalno\u015bci z tym zwi\u0105zane. \u0141atk\u0119 stabilno\u015bci dosta\u0142a funkcja `setTimeout` z pakietu `promisify`. Node 16.0 b\u0119dzie te\u017c pierwsz\u0105 wersj\u0105 dostarczaj\u0105c\u0105 natywne wsparcie dla Apple Silicon.<\/p><figure class=\"kg-card kg-image-card kg-card-hascaption\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0ad06f163.gif\" class=\"kg-image\" alt loading=\"lazy\"><figcaption>Je\u015bli m\u00f3wimy ju\u017c o M1 to jak podoba\u0142a wam si\u0119 ostatnia konferencja Apple? Kto\u015b z Was czeka\u0142 na iPad i iMac z M1?<\/figcaption><\/figure><p>W nowej wersji Deno dzieje si\u0119 nieco wi\u0119cej, ale ci\u0119\u017cko m\u00f3wi\u0107 tutaj o prze\u0142omowych zmianach. Najwi\u0119ksz\u0105 nowo\u015bci\u0105 jest natywne wsparcie dla serwera HTTP\/2 i przy\u015bpieszenie komunikacji z dzia\u0142aj\u0105cym pod spodem Rustem. Ciekawie wygl\u0105da te\u017c wsparcie dla dynamicznego dopytywania o dost\u0119p zamiast definiowania ich upfront.<\/p><figure class=\"kg-card kg-image-card\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d0b3679d31.gif\" class=\"kg-image\" alt loading=\"lazy\"><\/figure><h3 id=\"%C5%BAr%C3%B3d%C5%82a-2\">\u0179r\u00f3d\u0142a:<\/h3><p><a href=\"https:\/\/nodejs.medium.com\/node-js-16-available-now-7f5099a97e70\">https:\/\/nodejs.medium.com\/node-js-16-available-now-7f5099a97e70<\/a><br \/><a href=\"https:\/\/deno.com\/blog\/v1.9\">https:\/\/deno.com\/blog\/v1.9<\/a><\/p><hr \/><p>Pami\u0119tajcie, \u017ceby spr\u00f3bowa\u0107 Vived, je\u015bli chcesz otrzymywa\u0107 tego typu tre\u015bci spersonalizowane pod Ciebie!<\/p><ul><li><a href=\"https:\/\/apps.apple.com\/app\/apple-store\/id1460117345?pt=120039206&amp;ct=frontend-thursday&amp;mt=8\">App Store<\/a> <\/li><li><a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.virtuslab.vived&amp;referrer=utm_source%3Dvived-blog%26utm_medium%3Dfrontend-thursday%26utm_campaign%3Dfrontend-thursday%26anid%3Dadmob\">Play Store<\/a> <\/li><li><a href=\"https:\/\/app.vived.io\/\">Wersja PWA<\/a> <\/li><\/ul>"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10148","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=10148"}],"version-history":[{"count":1,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10148\/revisions"}],"predecessor-version":[{"id":10643,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10148\/revisions\/10643"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=10148"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=10148"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=10148"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}