{"id":10068,"date":"2021-10-14T15:53:33","date_gmt":"2021-10-14T13:53:33","guid":{"rendered":"https:\/\/vived.io\/frontend-thursday-vol-59\/"},"modified":"2022-09-19T13:16:36","modified_gmt":"2022-09-19T11:16:36","slug":"frontend-thursday-vol-59","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/","title":{"rendered":"Frontend Thursday vol. 59"},"content":{"rendered":"\n<h2 id=\"1-samodzielne-komponenty-i-dyrektywy-w-angularze\" data-num=1>1. Samodzielne komponenty i dyrektywy w Angularze<\/h2>\n\n\n\n<p>Je\u015bli nigdy nie mieli\u015bcie do czynienia z angularow\u0105 koncepcja modu\u0142\u00f3w, to na pierwszy rzut oka mo\u017ce ona by\u0107 mocno niezrozumia\u0142a. Szczeg\u00f3lnie bior\u0105c pod uwag\u0119, \u017ce maj\u0105 one niewiele wsp\u00f3lnego z modu\u0142ami znanym z JavaScriptu. Natywne modu\u0142y pozwalaj\u0105 podzieli\u0107 aplikacj\u0119 na wiele plik\u00f3w i zarz\u0105dza\u0107 API, jakie udost\u0119pniamy. Angularowe modu\u0142y maj\u0105 na celu zapewnia\u0107 konfiguracj\u0119 zale\u017cno\u015bci dla Dependency Injection. W Angularze ka\u017cdy komponent czy dyrektywa musi by\u0107 cz\u0119\u015bci\u0105 jakiego\u015b modu\u0142u, co czyni je najbardziej atomicznym elementem frameworku. Co ciekawe, modu\u0142y trafi\u0142y do Angulara dopiero w wersji 2.0.0-rc.5 i by\u0142y odpowiedzi\u0105 na problemy z publikowanie angularowych bibliotek w npm. Z racji, \u017ce framework by\u0142 ju\u017c na etapie Release Candidate, to ca\u0142e rozwi\u0105zanie powsta\u0142o w przy\u015bpieszonym tempie, i jak to bywa z takimi rozwi\u0105zaniami zosta\u0142o z nami na d\u0142u\u017cej.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">\/\/ JS Modules imports\nimport { BrowserModule } from &#039;@angular\/platform-browser&#039;;\nimport { NgModule } from &#039;@angular\/core&#039;;\n\nimport { AppComponent } from &#039;.\/app.component&#039;;\n\n\/\/ Angular Module declaration\n@NgModule({\n  declarations: [AppComponent],\n  \/\/ Angular Module import \n  imports: [BrowserModule],\n  providers: [],\n  bootstrap: [AppComponent]\n})\n\/\/ JS Module export\nexport class AppModule {}<\/code><\/pre>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"666\" height=\"500\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdvey.jpeg\" alt=\"\" class=\"wp-image-2796\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdvey.jpeg 666w, https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdvey-300x225.jpeg 300w\" sizes=\"auto, (max-width: 666px) 100vw, 666px\" \/><\/figure><\/div>\n\n\n\n<p>Angular jest chyba jedynym powa\u017cnym rozwi\u0105zaniem, w kt\u00f3rym najmniejszym atomem jest co\u015b innego ni\u017c pojedynczy komponent. Aby pod\u0105\u017ca\u0107 za dobrymi praktykami w ostatnich latach wytworzy\u0142 si\u0119 trend promuj\u0105cy tworzenie modu\u0142\u00f3w zawieraj\u0105cych pojedyncze komponenty. Taka architektura jest bardzo elastyczna i promuje DRY, ale nawet nie wiecie, ile czasu zmarnowa\u0142em w ostatnim roku na generowanie modu\u0142owego boilerplatu. Dobrze, \u017ce mamy `ng generate`, bo bez tego ju\u017c dawno postrada\u0142bym zmys\u0142y\u2026<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">\/\/ hello-world.component.ts\n@Component({\n  selector: &#039;hello-world&#039;,\n  template: &#039;&lt;h1&gt;Hello World&lt;\/h1&gt;&#039;\n  styles: [&#039;h1 { color: red; }&#039;]\n})\nexport class HelloWorldComponent { }\n\n\/\/ hello-world.module.ts\n@NgModule({\n  declarations: [HelloWorldComponent],\n  exports: [HelloWorldComponent]\n})\nexport class HelloWorldComponentModule {}\n<\/code><\/pre>\n\n\n\n<p>Zaprezentowany powy\u017cej schemat nazywany jest SCAM (od Single Component Angular Module). Je\u015bli chcecie dowiedzie\u0107 si\u0119 wi\u0119cej, to zapraszam <a href=\"https:\/\/marmicode.io\/blog\/your-angular-module-is-a-scam\">tutaj<\/a>.<\/p>\n\n\n\n<p>Zesp\u00f3\u0142 Angulara ju\u017c od jakiego\u015b czasu sugerowa\u0142, \u017ce zajmie si\u0119 tym tematem. W zesz\u0142ym tygodniu w ich repozytorium pojawi\u0142o si\u0119 obszerne RFC zawieraj\u0105ce propozycj\u0119 rozwi\u0105zania problemu. Prezentowana architektura nie pozbywa si\u0119 ca\u0142kowicie NgModules, ale sprawia, \u017ce staj\u0105 si\u0119 one opcjonalne. Jak zapewniaj\u0105 autorzy RFC, zmiany nie b\u0119d\u0105 mie\u0107 negatywnego wp\u0142ywu na performance, czy lazy loading i znacz\u0105co poprawi\u0105 Developer Experience.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"500\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpk3-1.jpeg\" alt=\"\" class=\"wp-image-2806\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpk3-1.jpeg 500w, https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpk3-1-300x300.jpeg 300w, https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpk3-1-150x150.jpeg 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure><\/div>\n\n\n\n<p>Je\u015bli chcemy oznaczy\u0107 komponent jako samodzielny, jego konfiguracj\u0119 nale\u017cy rozszerzy\u0107 o parametr `standalone: true`. RFC sugeruje, \u017ce `ng generate` b\u0119dzie mo\u017cna skonfigurowa\u0107 tak, aby domy\u015blnie generowa\u0142 adnotacje w taki w\u0142a\u015bnie spos\u00f3b. Z czasem mo\u017ce pojawi\u0107 si\u0119 r\u00f3wnie\u017c flaga konfiguracji, kt\u00f3ra sprawi, \u017ce parametr ten domy\u015blnie b\u0119dzie ustawiony na true. Warto wspomnie\u0107, \u017ce zadeklarowanie standalone komponentu wewn\u0105trz modu\u0142u b\u0119dzie powodowa\u0142o b\u0142\u0105d kompilacji. Adnotacja @Component zyska r\u00f3wnie\u017c dwa nowe parametry `imports` i `schemas`, kt\u00f3re pozwol\u0105 odpowiednio skonfigurowa\u0107 Dependency Injection. Warto wspomnie\u0107, \u017ce oba parametry b\u0119d\u0105 dost\u0119pne tylko je\u015bli oznaczymy komponent jako samodzielny.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">import { AnotherStandaloneComponent } from &#039;.\/another-standalone-component.component.ts&#039;;\nimport { CommonModule } from &#039;@angular\/common&#039;;\nimport { Component, CUSTOM_ELEMENTS_SCHEMA, Input  } from &#039;@angular\/core&#039;;\nimport { FormsModule } from &#039;@angular\/forms&#039;;\n\n@Component({\n  selector: &#039;app-standalone-component&#039;,\n  standalone: true,\n  imports: [AnotherStandaloneComponent, CommonModule,, FormsModule],\n  schemas: [ CUSTOM_ELEMENTS_SCHEMA ]\n  template: `\n    &lt;app-another-standalone-component *ngIf=&quot;flag&quot;&gt;&lt;\/app-another-standalone-component&gt;\n    &lt;custom-element&gt;&lt;\/custom-element&gt;\n    Forms work: &lt;input [(ngModel)]=&quot;name&quot; \/&gt; (name = {{ name }})\n  `\n})\nexport class MyComponent {\n  @Input() name: string = &#039;Vived&#039;;\n  @Input() flag: boolean = true;\n}<\/code><\/pre>\n\n\n\n<p>W ramach RFC rozwa\u017cana by\u0142a r\u00f3wnie\u017c jedna ciekawa zmiana: podzielenie CommonModule na wiele samodzielnych komponent\u00f3w. Je\u015bli nie u\u017cywacie Angulara, to wspomniany modu\u0142 zawiera zestaw podstawowych dyrektyw i transformator\u00f3w, takich jak *ngIf, czy *ngFor. Oznacza to, \u017ce w praktyce wi\u0119kszo\u015b\u0107 nietrywialnych komponent\u00f3w musi importowa\u0107 ten modu\u0142. Podzielenie tego podstawowego modu\u0142u na pojedyncze komponenty sprawi\u0142oby, \u017ce deklaracje import\u00f3w by\u0142yby czytelniejsze, ale te\u017c du\u017co trudniejsze w utrzymaniu. Co ciekawe rozwa\u017cano r\u00f3wnie\u017c automatyczne importowanie CommonModule, ale porzucono ten pomys\u0142 motywuj\u0105c decyzj\u0119 wprowadzeniem zbyt du\u017co magii dla programist\u00f3w.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">@Component({\n  selector: &#039;with-control-statments-component&#039;,\n  standalone: true,\n  \/\/Angular team could replace this:\n  \/\/imports: [CommonModule], \n  \/\/with this:\n  imports: [ NgIf, NgFor ],\n  template: `\n          &lt;ul *ngIf=&quot;show&quot;&gt;\n              &lt;li *ngFor=&quot;let item of items&quot;&gt;\n                  {{item}}\n              &lt;\/li&gt;\n          &lt;\/ul&gt;\n  `\n})\nexport class WithControlStatmentsComponent {  \n    items = [1,2,3];\n    \n    @Input() show = true;\n}<\/code><\/pre>\n\n\n\n<p>Jeszcze nie wiadomo kiedy faza RFC si\u0119 zako\u0144czy i kiedy mamy szans\u0119 zobaczy\u0107 now\u0105 architektur\u0119 w naszych aplikacjach. W tym momencie mo\u017cemy ju\u017c natomiast zobaczy\u0107 Proof Of Concept rozwi\u0105zania na StackBlitz udost\u0119pnionym <a href=\"https:\/\/stackblitz.com\/edit\/ng-standalone\">tutaj<\/a>. Trzymam kciuki, bo jest to jedna z rzeczy, na kt\u00f3r\u0105 czekam najbardziej na angularowej roadmapie.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"507\" height=\"500\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpol.jpeg\" alt=\"\" class=\"wp-image-2798\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpol.jpeg 507w, https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpol-300x296.jpeg 300w\" sizes=\"auto, (max-width: 507px) 100vw, 507px\" \/><\/figure><\/div>\n\n\n\n<p>PS. Dzisiaj opublikowany zosta\u0142 pierwszy Release Candidate Angulara 13 \ud83e\udd73<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a:<\/h3>\n\n\n\n<p><a href=\"https:\/\/twitter.com\/IgorMinar\/status\/1447593511981772802\">https:\/\/twitter.com\/IgorMinar\/status\/1447593511981772802<\/a><br><a href=\"https:\/\/github.com\/angular\/angular\/discussions\/43784\">https:\/\/github.com\/angular\/angular\/discussions\/43784<\/a><br><a href=\"https:\/\/docs.google.com\/document\/d\/1SBeMuko8_T15t511iJgCktyO9tnggFvBda-XLMeE9r8\/edit?resourcekey=0-fs2SACbxWCThdLyILtNNSA#heading=h.bb41yd99dqib\">https:\/\/docs.google.com\/document\/d\/1SBeMuko8_T15t511iJgCktyO9tnggFvBda-XLMeE9r8\/edit?resourcekey=0-fs2SACbxWCThdLyILtNNSA#heading=h.bb41yd99dqib<\/a><br><a href=\"https:\/\/stackblitz.com\/edit\/ng-standalone?file=app%2Fapp.module.ts\">https:\/\/stackblitz.com\/edit\/ng-standalone<\/a><br><a href=\"https:\/\/twitter.com\/IgorMinar\/status\/1447593478834188291\">https:\/\/twitter.com\/IgorMinar\/status\/1447593478834188291<\/a><br><a href=\"https:\/\/marmicode.io\/blog\/your-angular-module-is-a-scam\">https:\/\/marmicode.io\/blog\/your-angular-module-is-a-scam<\/a><\/p>\n\n\n\n<h2 id=\"2-storybook-trzykrotnie-przyspiesza\" data-num=2>2. Storybook trzykrotnie przyspiesza<\/h2>\n\n\n\n<p>Korzystacie w swoich projektach ze Storybooka? Je\u015bli tak, to pewnie zainteresuje Was fakt, \u017ce do najnowszej wersji 6.4 trafi\u0142a flaga `storyStoreV7`, kt\u00f3ra sprawia, \u017ce paczka jak\u0105 zwraca Webpack jest 50% mniejsza, a sam Storybook \u0142aduje si\u0119 trzykrotnie szybciej. Je\u015bli zastanawiacie si\u0119 nad jej tajemnicz\u0105 nazw\u0105, to potraktujcie j\u0105 jako preview technologii, kt\u00f3ra od Storybook 7.0 b\u0119dzie t\u0105 domy\u015bln\u0105.<\/p>\n\n\n\n<p>Je\u015bli Storybook, kt\u00f3ry utrzymujecie nie jest du\u017cy, by\u0107 mo\u017ce nie dostrzegli\u015bcie do tej pory problem\u00f3w z wydajno\u015bci\u0105. Tak jak to zwykle bywa, takie problemy objawiaj\u0105 si\u0119 przy osi\u0105gni\u0119ciu odpowiedniej skali, a tak\u0105 osi\u0105gn\u0105\u0142 mi\u0119dzy innymi Shopify. Ich Storybook liczy obecnie ponad tysi\u0105c Stories, wa\u017cy\u0142 16MB i \u0142adowa\u0142 si\u0119 ponad 1,5s. To w\u0142a\u015bnie Shopify wraz z Webpackiem i chromatic (firm\u0105 stoj\u0105ca za Storybookiem) przygotowa\u0142 t\u0105 optymalizacj\u0119. Jak osi\u0105gni\u0119to tak imponuj\u0105cy wynik? Do tej pory Storybook serwowany by\u0142 jako jedna ogromna paczka. Nowy flaga umo\u017cliwia podzielenie paczki na mniejsze kawa\u0142ki zawieraj\u0105ce pojedyncze story i ich lazy loading. Proste optymalizacje zawsze s\u0105 najlepsze.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"285\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/giphy-1.gif\" alt=\"\" class=\"wp-image-2801\"\/><figcaption>Deweloperzy po raz pierwszy otwieraj\u0105cy Storybook 7<\/figcaption><\/figure><\/div>\n\n\n\n<p>Dobrze s\u0142ysze\u0107, \u017ce narz\u0119dzia z kt\u00f3rych na co dzie\u0144 korzysta si\u0119 w projekcie staj\u0105 si\u0119 szybsze. Osobi\u015bcie czekam jednak na optymalizacje, kt\u00f3r\u0105 pod koniec notatki wspominaj\u0105 jej autorzy, czyli lazy compilation. Ta eksperymentalna funkcja Webpacka ma umo\u017cliwi\u0107 kompilowanie tylko tych zasob\u00f3w, o kt\u00f3re poprosi klient, co powinno znacz\u0105co przy\u015bpieszy\u0107 kompilacj\u0119 w trybie deweloperskim (je\u015bli obecnie pracujemy nad jednym story, wszystkie pozosta\u0142e nie b\u0119d\u0105 kompilowane).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a:<\/h3>\n\n\n\n<p><a href=\"https:\/\/storybook.js.org\/blog\/storybook-on-demand-architecture\/\">https:\/\/storybook.js.org\/blog\/storybook-on-demand-architecture\/<\/a><\/p>\n\n\n\n<h2 id=\"3-parcel-v2\" data-num=3>3. Parcel v2<\/h2>\n\n\n\n<p>Wy te\u017c my\u015bleli\u015bcie, \u017ce Parcel umar\u0142 \u015bmierci\u0105 naturaln\u0105 podczas ostatniego nap\u0142ywu modnych narz\u0119dzi do budowania aplikacji? Jak si\u0119 okazuje nic bardziej mylnego i w zesz\u0142ym tygodniu \u015bwiat\u0142o dzienne ujrza\u0142a wersja druga tego narz\u0119dzia<\/p>\n\n\n\n<p>Je\u015bli nie kojarzycie Parcela, to w telegraficznym skr\u00f3cie jest to narz\u0119dzie do budowania aplikacji, kt\u00f3re za zadanie postawi\u0142o sobie ograniczenie konfiguracji wymaganej do rozpocz\u0119cia pracy nad projektem do minimum. Z Parcela korzystaj\u0105 takie tuzy jak Atlassian, Adobe czy Microsoft.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"503\" height=\"496\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpq4.jpeg\" alt=\"\" class=\"wp-image-2799\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpq4.jpeg 503w, https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpq4-300x296.jpeg 300w\" sizes=\"auto, (max-width: 503px) 100vw, 503px\" \/><figcaption>Co interesuj\u0105ce alfa Parcela v2 ukaza\u0142a si\u0119 ju\u017c ponad dwa lata temu \ud83d\ude2e<\/figcaption><\/figure><\/div>\n\n\n\n<p>Z dokumentacji wynika, \u017ce je\u015bli nie polegacie zbytnio na zewn\u0119trznych wtyczkach to migracja powinna przebiec raczej bezbole\u015bnie. A migrowa\u0107 warto, bo lista zmian wygl\u0105da naprawd\u0119 imponuj\u0105co. Poni\u017cej znajdziecie jej skr\u00f3con\u0105 wersj\u0119, a po wi\u0119cej szczeg\u00f3\u0142\u00f3w jak zwykle odsy\u0142amy do \u017ar\u00f3de\u0142.<\/p>\n\n\n\n<p>Nowo\u015bci w Parcel v2:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Nowy system wtyczek (niestety nie jest on wstecznie kompatybilny, wi\u0119c wtyczki do Parcel 1 musz\u0105 zosta\u0107 przepisane od podstaw)<\/li><li>Domy\u015blnie w\u0142\u0105czony Tree Shaking<\/li><li>Domy\u015blnie w\u0142\u0105czony Differential Building (ES modules)<\/li><li>Automatyczne dzielenie kodu obs\u0142uguj\u0105ce wsp\u00f3\u0142dzielenie paczek i ich wsp\u00f3\u0142bie\u017cne \u0142adowanie<\/li><li>Optymalizacja wydajno\u015bci (Parcel do\u0142\u0105cza do grona frontendowych narz\u0119dzi napisanych w Rust!)<\/li><li>Konwersja i optymalizacja obraz\u00f3w (w\u0142\u0105czaj\u0105c takie formaty jak AVIF i WebP)<\/li><li>Usprawniony Hot Module Reloading (z wsparciem dla React Fast Refresh)<\/li><li>Lazy Development Module (ta funkcjonalno\u015b\u0107 w Webpacku 5 jest jeszcze w preview)<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"500\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpuw.jpeg\" alt=\"\" class=\"wp-image-2800\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpuw.jpeg 750w, https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpuw-300x200.jpeg 300w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><\/figure><\/div>\n\n\n\n<h2 id=\"zrodla\" data-num=4>\u0179r\u00f3d\u0142a:<\/h2>\n\n\n\n<p><a href=\"https:\/\/parceljs.org\/blog\/v2\/\">https:\/\/parceljs.org\/blog\/v2\/<\/a><br><a href=\"https:\/\/parceljs.org\/getting-started\/migration\/\">https:\/\/parceljs.org\/getting-started\/migration\/<\/a><br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W tym tygodniu w \u015bwiecie Angulara sporo si\u0119 dzia\u0142o, bo opublikowany zosta\u0142 od dawna wyczekiwany RFC Angular Standalone Components. Opr\u00f3cz tego \u015bwiat\u0142o dzienne ujrza\u0142 Storybook 6.4 (wprowadzaj\u0105cy trzykrotn\u0105 optymalizacj\u0119 czasu \u0142adowania!) i Parcel v2 (zawieraj\u0105cy ogrom od dawna wyczekiwanych nowo\u015bci). Przygotujcie gor\u0105c\u0105 herbat\u0119 \u2615\ufe0f i zapraszamy do lektury! \ud83d\udcda<\/p>\n","protected":false},"author":12,"featured_media":7734,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[273],"tags":[],"class_list":["post-10068","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-frontend-pl"],"acf":{"weekly_summary":true,"estimated_reading_time":"6"},"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. 59 - 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-59\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Frontend Thursday vol. 59 - Vived\" \/>\n<meta property=\"og:description\" content=\"W tym tygodniu w \u015bwiecie Angulara sporo si\u0119 dzia\u0142o, bo opublikowany zosta\u0142 od dawna wyczekiwany RFC Angular Standalone Components. Opr\u00f3cz tego \u015bwiat\u0142o dzienne ujrza\u0142 Storybook 6.4 (wprowadzaj\u0105cy trzykrotn\u0105 optymalizacj\u0119 czasu \u0142adowania!) i Parcel v2 (zawieraj\u0105cy ogrom od dawna wyczekiwanych nowo\u015bci). Przygotujcie gor\u0105c\u0105 herbat\u0119 \u2615\ufe0f i zapraszamy do lektury! \ud83d\udcda\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2021-10-14T13:53:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-09-19T11:16:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-14-at-15.37.32.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1919\" \/>\n\t<meta property=\"og:image:height\" content=\"1003\" \/>\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-59\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/\"},\"author\":{\"name\":\"Tomasz Borowicz\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb\"},\"headline\":\"Frontend Thursday vol. 59\",\"datePublished\":\"2021-10-14T13:53:33+00:00\",\"dateModified\":\"2022-09-19T11:16:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/\"},\"wordCount\":1208,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-14-at-15.37.32.png\",\"articleSection\":[\"Frontend\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/\",\"url\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/\",\"name\":\"Frontend Thursday vol. 59 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-14-at-15.37.32.png\",\"datePublished\":\"2021-10-14T13:53:33+00:00\",\"dateModified\":\"2022-09-19T11:16:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-14-at-15.37.32.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-14-at-15.37.32.png\",\"width\":1919,\"height\":1003},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Frontend Thursday vol. 59\"}]},{\"@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. 59 - 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-59\/","og_locale":"pl_PL","og_type":"article","og_title":"Frontend Thursday vol. 59 - Vived","og_description":"W tym tygodniu w \u015bwiecie Angulara sporo si\u0119 dzia\u0142o, bo opublikowany zosta\u0142 od dawna wyczekiwany RFC Angular Standalone Components. Opr\u00f3cz tego \u015bwiat\u0142o dzienne ujrza\u0142 Storybook 6.4 (wprowadzaj\u0105cy trzykrotn\u0105 optymalizacj\u0119 czasu \u0142adowania!) i Parcel v2 (zawieraj\u0105cy ogrom od dawna wyczekiwanych nowo\u015bci). Przygotujcie gor\u0105c\u0105 herbat\u0119 \u2615\ufe0f i zapraszamy do lektury! \ud83d\udcda","og_url":"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/","og_site_name":"Vived","article_published_time":"2021-10-14T13:53:33+00:00","article_modified_time":"2022-09-19T11:16:36+00:00","og_image":[{"width":1919,"height":1003,"url":"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-14-at-15.37.32.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-59\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/"},"author":{"name":"Tomasz Borowicz","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/9d2a72fe7d0dfbb4092675afbab742bb"},"headline":"Frontend Thursday vol. 59","datePublished":"2021-10-14T13:53:33+00:00","dateModified":"2022-09-19T11:16:36+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/"},"wordCount":1208,"commentCount":0,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-14-at-15.37.32.png","articleSection":["Frontend"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/","url":"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/","name":"Frontend Thursday vol. 59 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-14-at-15.37.32.png","datePublished":"2021-10-14T13:53:33+00:00","dateModified":"2022-09-19T11:16:36+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-14-at-15.37.32.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/Screenshot-2021-10-14-at-15.37.32.png","width":1919,"height":1003},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/frontend-thursday-vol-59\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Frontend Thursday vol. 59"}]},{"@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. Samodzielne komponenty i dyrektywy w Angularze<\/h2>\n","innerContent":["\n<h2>1. Samodzielne komponenty i dyrektywy w Angularze<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli nigdy nie mieli\u015bcie do czynienia z angularow\u0105 koncepcja modu\u0142\u00f3w, to na pierwszy rzut oka mo\u017ce ona by\u0107 mocno niezrozumia\u0142a. Szczeg\u00f3lnie bior\u0105c pod uwag\u0119, \u017ce maj\u0105 one niewiele wsp\u00f3lnego z modu\u0142ami znanym z JavaScriptu. Natywne modu\u0142y pozwalaj\u0105 podzieli\u0107 aplikacj\u0119 na wiele plik\u00f3w i zarz\u0105dza\u0107 API, jakie udost\u0119pniamy. Angularowe modu\u0142y maj\u0105 na celu zapewnia\u0107 konfiguracj\u0119 zale\u017cno\u015bci dla Dependency Injection. W Angularze ka\u017cdy komponent czy dyrektywa musi by\u0107 cz\u0119\u015bci\u0105 jakiego\u015b modu\u0142u, co czyni je najbardziej atomicznym elementem frameworku. Co ciekawe, modu\u0142y trafi\u0142y do Angulara dopiero w wersji 2.0.0-rc.5 i by\u0142y odpowiedzi\u0105 na problemy z publikowanie angularowych bibliotek w npm. Z racji, \u017ce framework by\u0142 ju\u017c na etapie Release Candidate, to ca\u0142e rozwi\u0105zanie powsta\u0142o w przy\u015bpieszonym tempie, i jak to bywa z takimi rozwi\u0105zaniami zosta\u0142o z nami na d\u0142u\u017cej.<\/p>\n","innerContent":["\n<p>Je\u015bli nigdy nie mieli\u015bcie do czynienia z angularow\u0105 koncepcja modu\u0142\u00f3w, to na pierwszy rzut oka mo\u017ce ona by\u0107 mocno niezrozumia\u0142a. Szczeg\u00f3lnie bior\u0105c pod uwag\u0119, \u017ce maj\u0105 one niewiele wsp\u00f3lnego z modu\u0142ami znanym z JavaScriptu. Natywne modu\u0142y pozwalaj\u0105 podzieli\u0107 aplikacj\u0119 na wiele plik\u00f3w i zarz\u0105dza\u0107 API, jakie udost\u0119pniamy. Angularowe modu\u0142y maj\u0105 na celu zapewnia\u0107 konfiguracj\u0119 zale\u017cno\u015bci dla Dependency Injection. W Angularze ka\u017cdy komponent czy dyrektywa musi by\u0107 cz\u0119\u015bci\u0105 jakiego\u015b modu\u0142u, co czyni je najbardziej atomicznym elementem frameworku. Co ciekawe, modu\u0142y trafi\u0142y do Angulara dopiero w wersji 2.0.0-rc.5 i by\u0142y odpowiedzi\u0105 na problemy z publikowanie angularowych bibliotek w npm. Z racji, \u017ce framework by\u0142 ju\u017c na etapie Release Candidate, to ca\u0142e rozwi\u0105zanie powsta\u0142o w przy\u015bpieszonym tempie, i jak to bywa z takimi rozwi\u0105zaniami zosta\u0142o z nami na d\u0142u\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\">\/\/ JS Modules imports\nimport { BrowserModule } from '@angular\/platform-browser';\nimport { NgModule } from '@angular\/core';\n\nimport { AppComponent } from '.\/app.component';\n\n\/\/ Angular Module declaration\n@NgModule({\n  declarations: [AppComponent],\n  \/\/ Angular Module import \n  imports: [BrowserModule],\n  providers: [],\n  bootstrap: [AppComponent]\n})\n\/\/ JS Module export\nexport class AppModule {}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">\/\/ JS Modules imports\nimport { BrowserModule } from '@angular\/platform-browser';\nimport { NgModule } from '@angular\/core';\n\nimport { AppComponent } from '.\/app.component';\n\n\/\/ Angular Module declaration\n@NgModule({\n  declarations: [AppComponent],\n  \/\/ Angular Module import \n  imports: [BrowserModule],\n  providers: [],\n  bootstrap: [AppComponent]\n})\n\/\/ JS Module export\nexport class AppModule {}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":2796,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdvey.jpeg\" alt=\"\" class=\"wp-image-2796\"\/><\/figure><\/div>\n","innerContent":["\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdvey.jpeg\" alt=\"\" class=\"wp-image-2796\"\/><\/figure><\/div>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Angular jest chyba jedynym powa\u017cnym rozwi\u0105zaniem, w kt\u00f3rym najmniejszym atomem jest co\u015b innego ni\u017c pojedynczy komponent. Aby pod\u0105\u017ca\u0107 za dobrymi praktykami w ostatnich latach wytworzy\u0142 si\u0119 trend promuj\u0105cy tworzenie modu\u0142\u00f3w zawieraj\u0105cych pojedyncze komponenty. Taka architektura jest bardzo elastyczna i promuje DRY, ale nawet nie wiecie, ile czasu zmarnowa\u0142em w ostatnim roku na generowanie modu\u0142owego boilerplatu. Dobrze, \u017ce mamy `ng generate`, bo bez tego ju\u017c dawno postrada\u0142bym zmys\u0142y\u2026<\/p>\n","innerContent":["\n<p>Angular jest chyba jedynym powa\u017cnym rozwi\u0105zaniem, w kt\u00f3rym najmniejszym atomem jest co\u015b innego ni\u017c pojedynczy komponent. Aby pod\u0105\u017ca\u0107 za dobrymi praktykami w ostatnich latach wytworzy\u0142 si\u0119 trend promuj\u0105cy tworzenie modu\u0142\u00f3w zawieraj\u0105cych pojedyncze komponenty. Taka architektura jest bardzo elastyczna i promuje DRY, ale nawet nie wiecie, ile czasu zmarnowa\u0142em w ostatnim roku na generowanie modu\u0142owego boilerplatu. Dobrze, \u017ce mamy `ng generate`, bo bez tego ju\u017c dawno postrada\u0142bym zmys\u0142y\u2026<\/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\">\/\/ hello-world.component.ts\n@Component({\n  selector: 'hello-world',\n  template: '&lt;h1>Hello World&lt;\/h1>'\n  styles: ['h1 { color: red; }']\n})\nexport class HelloWorldComponent { }\n\n\/\/ hello-world.module.ts\n@NgModule({\n  declarations: [HelloWorldComponent],\n  exports: [HelloWorldComponent]\n})\nexport class HelloWorldComponentModule {}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">\/\/ hello-world.component.ts\n@Component({\n  selector: 'hello-world',\n  template: '&lt;h1>Hello World&lt;\/h1>'\n  styles: ['h1 { color: red; }']\n})\nexport class HelloWorldComponent { }\n\n\/\/ hello-world.module.ts\n@NgModule({\n  declarations: [HelloWorldComponent],\n  exports: [HelloWorldComponent]\n})\nexport class HelloWorldComponentModule {}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zaprezentowany powy\u017cej schemat nazywany jest SCAM (od Single Component Angular Module). Je\u015bli chcecie dowiedzie\u0107 si\u0119 wi\u0119cej, to zapraszam <a href=\"https:\/\/marmicode.io\/blog\/your-angular-module-is-a-scam\">tutaj<\/a>.<\/p>\n","innerContent":["\n<p>Zaprezentowany powy\u017cej schemat nazywany jest SCAM (od Single Component Angular Module). Je\u015bli chcecie dowiedzie\u0107 si\u0119 wi\u0119cej, to zapraszam <a href=\"https:\/\/marmicode.io\/blog\/your-angular-module-is-a-scam\">tutaj<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zesp\u00f3\u0142 Angulara ju\u017c od jakiego\u015b czasu sugerowa\u0142, \u017ce zajmie si\u0119 tym tematem. W zesz\u0142ym tygodniu w ich repozytorium pojawi\u0142o si\u0119 obszerne RFC zawieraj\u0105ce propozycj\u0119 rozwi\u0105zania problemu. Prezentowana architektura nie pozbywa si\u0119 ca\u0142kowicie NgModules, ale sprawia, \u017ce staj\u0105 si\u0119 one opcjonalne. Jak zapewniaj\u0105 autorzy RFC, zmiany nie b\u0119d\u0105 mie\u0107 negatywnego wp\u0142ywu na performance, czy lazy loading i znacz\u0105co poprawi\u0105 Developer Experience.<\/p>\n","innerContent":["\n<p>Zesp\u00f3\u0142 Angulara ju\u017c od jakiego\u015b czasu sugerowa\u0142, \u017ce zajmie si\u0119 tym tematem. W zesz\u0142ym tygodniu w ich repozytorium pojawi\u0142o si\u0119 obszerne RFC zawieraj\u0105ce propozycj\u0119 rozwi\u0105zania problemu. Prezentowana architektura nie pozbywa si\u0119 ca\u0142kowicie NgModules, ale sprawia, \u017ce staj\u0105 si\u0119 one opcjonalne. Jak zapewniaj\u0105 autorzy RFC, zmiany nie b\u0119d\u0105 mie\u0107 negatywnego wp\u0142ywu na performance, czy lazy loading i znacz\u0105co poprawi\u0105 Developer Experience.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":2806,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpk3-1.jpeg\" alt=\"\" class=\"wp-image-2806\"\/><\/figure><\/div>\n","innerContent":["\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpk3-1.jpeg\" alt=\"\" class=\"wp-image-2806\"\/><\/figure><\/div>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli chcemy oznaczy\u0107 komponent jako samodzielny, jego konfiguracj\u0119 nale\u017cy rozszerzy\u0107 o parametr `standalone: true`. RFC sugeruje, \u017ce `ng generate` b\u0119dzie mo\u017cna skonfigurowa\u0107 tak, aby domy\u015blnie generowa\u0142 adnotacje w taki w\u0142a\u015bnie spos\u00f3b. Z czasem mo\u017ce pojawi\u0107 si\u0119 r\u00f3wnie\u017c flaga konfiguracji, kt\u00f3ra sprawi, \u017ce parametr ten domy\u015blnie b\u0119dzie ustawiony na true. Warto wspomnie\u0107, \u017ce zadeklarowanie standalone komponentu wewn\u0105trz modu\u0142u b\u0119dzie powodowa\u0142o b\u0142\u0105d kompilacji. Adnotacja @Component zyska r\u00f3wnie\u017c dwa nowe parametry `imports` i `schemas`, kt\u00f3re pozwol\u0105 odpowiednio skonfigurowa\u0107 Dependency Injection. Warto wspomnie\u0107, \u017ce oba parametry b\u0119d\u0105 dost\u0119pne tylko je\u015bli oznaczymy komponent jako samodzielny.<\/p>\n","innerContent":["\n<p>Je\u015bli chcemy oznaczy\u0107 komponent jako samodzielny, jego konfiguracj\u0119 nale\u017cy rozszerzy\u0107 o parametr `standalone: true`. RFC sugeruje, \u017ce `ng generate` b\u0119dzie mo\u017cna skonfigurowa\u0107 tak, aby domy\u015blnie generowa\u0142 adnotacje w taki w\u0142a\u015bnie spos\u00f3b. Z czasem mo\u017ce pojawi\u0107 si\u0119 r\u00f3wnie\u017c flaga konfiguracji, kt\u00f3ra sprawi, \u017ce parametr ten domy\u015blnie b\u0119dzie ustawiony na true. Warto wspomnie\u0107, \u017ce zadeklarowanie standalone komponentu wewn\u0105trz modu\u0142u b\u0119dzie powodowa\u0142o b\u0142\u0105d kompilacji. Adnotacja @Component zyska r\u00f3wnie\u017c dwa nowe parametry `imports` i `schemas`, kt\u00f3re pozwol\u0105 odpowiednio skonfigurowa\u0107 Dependency Injection. Warto wspomnie\u0107, \u017ce oba parametry b\u0119d\u0105 dost\u0119pne tylko je\u015bli oznaczymy komponent jako samodzielny.<\/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\">import { AnotherStandaloneComponent } from '.\/another-standalone-component.component.ts';\nimport { CommonModule } from '@angular\/common';\nimport { Component, CUSTOM_ELEMENTS_SCHEMA, Input  } from '@angular\/core';\nimport { FormsModule } from '@angular\/forms';\n\n@Component({\n  selector: 'app-standalone-component',\n  standalone: true,\n  imports: [AnotherStandaloneComponent, CommonModule,, FormsModule],\n  schemas: [ CUSTOM_ELEMENTS_SCHEMA ]\n  template: `\n    &lt;app-another-standalone-component *ngIf=\"flag\">&lt;\/app-another-standalone-component>\n    &lt;custom-element>&lt;\/custom-element>\n    Forms work: &lt;input [(ngModel)]=\"name\" \/> (name = {{ name }})\n  `\n})\nexport class MyComponent {\n  @Input() name: string = 'Vived';\n  @Input() flag: boolean = true;\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">import { AnotherStandaloneComponent } from '.\/another-standalone-component.component.ts';\nimport { CommonModule } from '@angular\/common';\nimport { Component, CUSTOM_ELEMENTS_SCHEMA, Input  } from '@angular\/core';\nimport { FormsModule } from '@angular\/forms';\n\n@Component({\n  selector: 'app-standalone-component',\n  standalone: true,\n  imports: [AnotherStandaloneComponent, CommonModule,, FormsModule],\n  schemas: [ CUSTOM_ELEMENTS_SCHEMA ]\n  template: `\n    &lt;app-another-standalone-component *ngIf=\"flag\">&lt;\/app-another-standalone-component>\n    &lt;custom-element>&lt;\/custom-element>\n    Forms work: &lt;input [(ngModel)]=\"name\" \/> (name = {{ name }})\n  `\n})\nexport class MyComponent {\n  @Input() name: string = 'Vived';\n  @Input() flag: boolean = true;\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>W ramach RFC rozwa\u017cana by\u0142a r\u00f3wnie\u017c jedna ciekawa zmiana: podzielenie CommonModule na wiele samodzielnych komponent\u00f3w. Je\u015bli nie u\u017cywacie Angulara, to wspomniany modu\u0142 zawiera zestaw podstawowych dyrektyw i transformator\u00f3w, takich jak *ngIf, czy *ngFor. Oznacza to, \u017ce w praktyce wi\u0119kszo\u015b\u0107 nietrywialnych komponent\u00f3w musi importowa\u0107 ten modu\u0142. Podzielenie tego podstawowego modu\u0142u na pojedyncze komponenty sprawi\u0142oby, \u017ce deklaracje import\u00f3w by\u0142yby czytelniejsze, ale te\u017c du\u017co trudniejsze w utrzymaniu. Co ciekawe rozwa\u017cano r\u00f3wnie\u017c automatyczne importowanie CommonModule, ale porzucono ten pomys\u0142 motywuj\u0105c decyzj\u0119 wprowadzeniem zbyt du\u017co magii dla programist\u00f3w.<\/p>\n","innerContent":["\n<p>W ramach RFC rozwa\u017cana by\u0142a r\u00f3wnie\u017c jedna ciekawa zmiana: podzielenie CommonModule na wiele samodzielnych komponent\u00f3w. Je\u015bli nie u\u017cywacie Angulara, to wspomniany modu\u0142 zawiera zestaw podstawowych dyrektyw i transformator\u00f3w, takich jak *ngIf, czy *ngFor. Oznacza to, \u017ce w praktyce wi\u0119kszo\u015b\u0107 nietrywialnych komponent\u00f3w musi importowa\u0107 ten modu\u0142. Podzielenie tego podstawowego modu\u0142u na pojedyncze komponenty sprawi\u0142oby, \u017ce deklaracje import\u00f3w by\u0142yby czytelniejsze, ale te\u017c du\u017co trudniejsze w utrzymaniu. Co ciekawe rozwa\u017cano r\u00f3wnie\u017c automatyczne importowanie CommonModule, ale porzucono ten pomys\u0142 motywuj\u0105c decyzj\u0119 wprowadzeniem zbyt du\u017co magii dla programist\u00f3w.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"prismatic\/blocks","attrs":{"language":"typescript"},"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">@Component({\n  selector: 'with-control-statments-component',\n  standalone: true,\n  \/\/Angular team could replace this:\n  \/\/imports: [CommonModule], \n  \/\/with this:\n  imports: [ NgIf, NgFor ],\n  template: `\n          &lt;ul *ngIf=\"show\">\n              &lt;li *ngFor=\"let item of items\">\n                  {{item}}\n              &lt;\/li>\n          &lt;\/ul>\n  `\n})\nexport class WithControlStatmentsComponent {  \n    items = [1,2,3];\n    \n    @Input() show = true;\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-typescript\">@Component({\n  selector: 'with-control-statments-component',\n  standalone: true,\n  \/\/Angular team could replace this:\n  \/\/imports: [CommonModule], \n  \/\/with this:\n  imports: [ NgIf, NgFor ],\n  template: `\n          &lt;ul *ngIf=\"show\">\n              &lt;li *ngFor=\"let item of items\">\n                  {{item}}\n              &lt;\/li>\n          &lt;\/ul>\n  `\n})\nexport class WithControlStatmentsComponent {  \n    items = [1,2,3];\n    \n    @Input() show = true;\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jeszcze nie wiadomo kiedy faza RFC si\u0119 zako\u0144czy i kiedy mamy szans\u0119 zobaczy\u0107 now\u0105 architektur\u0119 w naszych aplikacjach. W tym momencie mo\u017cemy ju\u017c natomiast zobaczy\u0107 Proof Of Concept rozwi\u0105zania na StackBlitz udost\u0119pnionym <a href=\"https:\/\/stackblitz.com\/edit\/ng-standalone\">tutaj<\/a>. Trzymam kciuki, bo jest to jedna z rzeczy, na kt\u00f3r\u0105 czekam najbardziej na angularowej roadmapie.<\/p>\n","innerContent":["\n<p>Jeszcze nie wiadomo kiedy faza RFC si\u0119 zako\u0144czy i kiedy mamy szans\u0119 zobaczy\u0107 now\u0105 architektur\u0119 w naszych aplikacjach. W tym momencie mo\u017cemy ju\u017c natomiast zobaczy\u0107 Proof Of Concept rozwi\u0105zania na StackBlitz udost\u0119pnionym <a href=\"https:\/\/stackblitz.com\/edit\/ng-standalone\">tutaj<\/a>. Trzymam kciuki, bo jest to jedna z rzeczy, na kt\u00f3r\u0105 czekam najbardziej na angularowej roadmapie.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":2798,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpol.jpeg\" alt=\"\" class=\"wp-image-2798\"\/><\/figure><\/div>\n","innerContent":["\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpol.jpeg\" alt=\"\" class=\"wp-image-2798\"\/><\/figure><\/div>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>PS. Dzisiaj opublikowany zosta\u0142 pierwszy Release Candidate Angulara 13 \ud83e\udd73<\/p>\n","innerContent":["\n<p>PS. Dzisiaj opublikowany zosta\u0142 pierwszy Release Candidate Angulara 13 \ud83e\udd73<\/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:\/\/twitter.com\/IgorMinar\/status\/1447593511981772802\">https:\/\/twitter.com\/IgorMinar\/status\/1447593511981772802<\/a><br><a href=\"https:\/\/github.com\/angular\/angular\/discussions\/43784\">https:\/\/github.com\/angular\/angular\/discussions\/43784<\/a><br><a href=\"https:\/\/docs.google.com\/document\/d\/1SBeMuko8_T15t511iJgCktyO9tnggFvBda-XLMeE9r8\/edit?resourcekey=0-fs2SACbxWCThdLyILtNNSA#heading=h.bb41yd99dqib\">https:\/\/docs.google.com\/document\/d\/1SBeMuko8_T15t511iJgCktyO9tnggFvBda-XLMeE9r8\/edit?resourcekey=0-fs2SACbxWCThdLyILtNNSA#heading=h.bb41yd99dqib<\/a><br><a href=\"https:\/\/stackblitz.com\/edit\/ng-standalone?file=app%2Fapp.module.ts\">https:\/\/stackblitz.com\/edit\/ng-standalone<\/a><br><a href=\"https:\/\/twitter.com\/IgorMinar\/status\/1447593478834188291\">https:\/\/twitter.com\/IgorMinar\/status\/1447593478834188291<\/a><br><a href=\"https:\/\/marmicode.io\/blog\/your-angular-module-is-a-scam\">https:\/\/marmicode.io\/blog\/your-angular-module-is-a-scam<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/twitter.com\/IgorMinar\/status\/1447593511981772802\">https:\/\/twitter.com\/IgorMinar\/status\/1447593511981772802<\/a><br><a href=\"https:\/\/github.com\/angular\/angular\/discussions\/43784\">https:\/\/github.com\/angular\/angular\/discussions\/43784<\/a><br><a href=\"https:\/\/docs.google.com\/document\/d\/1SBeMuko8_T15t511iJgCktyO9tnggFvBda-XLMeE9r8\/edit?resourcekey=0-fs2SACbxWCThdLyILtNNSA#heading=h.bb41yd99dqib\">https:\/\/docs.google.com\/document\/d\/1SBeMuko8_T15t511iJgCktyO9tnggFvBda-XLMeE9r8\/edit?resourcekey=0-fs2SACbxWCThdLyILtNNSA#heading=h.bb41yd99dqib<\/a><br><a href=\"https:\/\/stackblitz.com\/edit\/ng-standalone?file=app%2Fapp.module.ts\">https:\/\/stackblitz.com\/edit\/ng-standalone<\/a><br><a href=\"https:\/\/twitter.com\/IgorMinar\/status\/1447593478834188291\">https:\/\/twitter.com\/IgorMinar\/status\/1447593478834188291<\/a><br><a href=\"https:\/\/marmicode.io\/blog\/your-angular-module-is-a-scam\">https:\/\/marmicode.io\/blog\/your-angular-module-is-a-scam<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>2. Storybook trzykrotnie przyspiesza<\/h2>\n","innerContent":["\n<h2>2. Storybook trzykrotnie przyspiesza<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Korzystacie w swoich projektach ze Storybooka? Je\u015bli tak, to pewnie zainteresuje Was fakt, \u017ce do najnowszej wersji 6.4 trafi\u0142a flaga `storyStoreV7`, kt\u00f3ra sprawia, \u017ce paczka jak\u0105 zwraca Webpack jest 50% mniejsza, a sam Storybook \u0142aduje si\u0119 trzykrotnie szybciej. Je\u015bli zastanawiacie si\u0119 nad jej tajemnicz\u0105 nazw\u0105, to potraktujcie j\u0105 jako preview technologii, kt\u00f3ra od Storybook 7.0 b\u0119dzie t\u0105 domy\u015bln\u0105.<\/p>\n","innerContent":["\n<p>Korzystacie w swoich projektach ze Storybooka? Je\u015bli tak, to pewnie zainteresuje Was fakt, \u017ce do najnowszej wersji 6.4 trafi\u0142a flaga `storyStoreV7`, kt\u00f3ra sprawia, \u017ce paczka jak\u0105 zwraca Webpack jest 50% mniejsza, a sam Storybook \u0142aduje si\u0119 trzykrotnie szybciej. Je\u015bli zastanawiacie si\u0119 nad jej tajemnicz\u0105 nazw\u0105, to potraktujcie j\u0105 jako preview technologii, kt\u00f3ra od Storybook 7.0 b\u0119dzie t\u0105 domy\u015bln\u0105.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli Storybook, kt\u00f3ry utrzymujecie nie jest du\u017cy, by\u0107 mo\u017ce nie dostrzegli\u015bcie do tej pory problem\u00f3w z wydajno\u015bci\u0105. Tak jak to zwykle bywa, takie problemy objawiaj\u0105 si\u0119 przy osi\u0105gni\u0119ciu odpowiedniej skali, a tak\u0105 osi\u0105gn\u0105\u0142 mi\u0119dzy innymi Shopify. Ich Storybook liczy obecnie ponad tysi\u0105c Stories, wa\u017cy\u0142 16MB i \u0142adowa\u0142 si\u0119 ponad 1,5s. To w\u0142a\u015bnie Shopify wraz z Webpackiem i chromatic (firm\u0105 stoj\u0105ca za Storybookiem) przygotowa\u0142 t\u0105 optymalizacj\u0119. Jak osi\u0105gni\u0119to tak imponuj\u0105cy wynik? Do tej pory Storybook serwowany by\u0142 jako jedna ogromna paczka. Nowy flaga umo\u017cliwia podzielenie paczki na mniejsze kawa\u0142ki zawieraj\u0105ce pojedyncze story i ich lazy loading. Proste optymalizacje zawsze s\u0105 najlepsze.<\/p>\n","innerContent":["\n<p>Je\u015bli Storybook, kt\u00f3ry utrzymujecie nie jest du\u017cy, by\u0107 mo\u017ce nie dostrzegli\u015bcie do tej pory problem\u00f3w z wydajno\u015bci\u0105. Tak jak to zwykle bywa, takie problemy objawiaj\u0105 si\u0119 przy osi\u0105gni\u0119ciu odpowiedniej skali, a tak\u0105 osi\u0105gn\u0105\u0142 mi\u0119dzy innymi Shopify. Ich Storybook liczy obecnie ponad tysi\u0105c Stories, wa\u017cy\u0142 16MB i \u0142adowa\u0142 si\u0119 ponad 1,5s. To w\u0142a\u015bnie Shopify wraz z Webpackiem i chromatic (firm\u0105 stoj\u0105ca za Storybookiem) przygotowa\u0142 t\u0105 optymalizacj\u0119. Jak osi\u0105gni\u0119to tak imponuj\u0105cy wynik? Do tej pory Storybook serwowany by\u0142 jako jedna ogromna paczka. Nowy flaga umo\u017cliwia podzielenie paczki na mniejsze kawa\u0142ki zawieraj\u0105ce pojedyncze story i ich lazy loading. Proste optymalizacje zawsze s\u0105 najlepsze.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":2801,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/giphy-1.gif\" alt=\"\" class=\"wp-image-2801\"\/><figcaption>Deweloperzy po raz pierwszy otwieraj\u0105cy Storybook 7<\/figcaption><\/figure><\/div>\n","innerContent":["\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/giphy-1.gif\" alt=\"\" class=\"wp-image-2801\"\/><figcaption>Deweloperzy po raz pierwszy otwieraj\u0105cy Storybook 7<\/figcaption><\/figure><\/div>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dobrze s\u0142ysze\u0107, \u017ce narz\u0119dzia z kt\u00f3rych na co dzie\u0144 korzysta si\u0119 w projekcie staj\u0105 si\u0119 szybsze. Osobi\u015bcie czekam jednak na optymalizacje, kt\u00f3r\u0105 pod koniec notatki wspominaj\u0105 jej autorzy, czyli lazy compilation. Ta eksperymentalna funkcja Webpacka ma umo\u017cliwi\u0107 kompilowanie tylko tych zasob\u00f3w, o kt\u00f3re poprosi klient, co powinno znacz\u0105co przy\u015bpieszy\u0107 kompilacj\u0119 w trybie deweloperskim (je\u015bli obecnie pracujemy nad jednym story, wszystkie pozosta\u0142e nie b\u0119d\u0105 kompilowane).<\/p>\n","innerContent":["\n<p>Dobrze s\u0142ysze\u0107, \u017ce narz\u0119dzia z kt\u00f3rych na co dzie\u0144 korzysta si\u0119 w projekcie staj\u0105 si\u0119 szybsze. Osobi\u015bcie czekam jednak na optymalizacje, kt\u00f3r\u0105 pod koniec notatki wspominaj\u0105 jej autorzy, czyli lazy compilation. Ta eksperymentalna funkcja Webpacka ma umo\u017cliwi\u0107 kompilowanie tylko tych zasob\u00f3w, o kt\u00f3re poprosi klient, co powinno znacz\u0105co przy\u015bpieszy\u0107 kompilacj\u0119 w trybie deweloperskim (je\u015bli obecnie pracujemy nad jednym story, wszystkie pozosta\u0142e nie b\u0119d\u0105 kompilowane).<\/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:\/\/storybook.js.org\/blog\/storybook-on-demand-architecture\/\">https:\/\/storybook.js.org\/blog\/storybook-on-demand-architecture\/<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/storybook.js.org\/blog\/storybook-on-demand-architecture\/\">https:\/\/storybook.js.org\/blog\/storybook-on-demand-architecture\/<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>3. Parcel v2<\/h2>\n","innerContent":["\n<h2>3. Parcel v2<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wy te\u017c my\u015bleli\u015bcie, \u017ce Parcel umar\u0142 \u015bmierci\u0105 naturaln\u0105 podczas ostatniego nap\u0142ywu modnych narz\u0119dzi do budowania aplikacji? Jak si\u0119 okazuje nic bardziej mylnego i w zesz\u0142ym tygodniu \u015bwiat\u0142o dzienne ujrza\u0142a wersja druga tego narz\u0119dzia<\/p>\n","innerContent":["\n<p>Wy te\u017c my\u015bleli\u015bcie, \u017ce Parcel umar\u0142 \u015bmierci\u0105 naturaln\u0105 podczas ostatniego nap\u0142ywu modnych narz\u0119dzi do budowania aplikacji? Jak si\u0119 okazuje nic bardziej mylnego i w zesz\u0142ym tygodniu \u015bwiat\u0142o dzienne ujrza\u0142a wersja druga tego narz\u0119dzia<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli nie kojarzycie Parcela, to w telegraficznym skr\u00f3cie jest to narz\u0119dzie do budowania aplikacji, kt\u00f3re za zadanie postawi\u0142o sobie ograniczenie konfiguracji wymaganej do rozpocz\u0119cia pracy nad projektem do minimum. Z Parcela korzystaj\u0105 takie tuzy jak Atlassian, Adobe czy Microsoft.<\/p>\n","innerContent":["\n<p>Je\u015bli nie kojarzycie Parcela, to w telegraficznym skr\u00f3cie jest to narz\u0119dzie do budowania aplikacji, kt\u00f3re za zadanie postawi\u0142o sobie ograniczenie konfiguracji wymaganej do rozpocz\u0119cia pracy nad projektem do minimum. Z Parcela korzystaj\u0105 takie tuzy jak Atlassian, Adobe czy Microsoft.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":2799,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpq4.jpeg\" alt=\"\" class=\"wp-image-2799\"\/><figcaption>Co interesuj\u0105ce alfa Parcela v2 ukaza\u0142a si\u0119 ju\u017c ponad dwa lata temu \ud83d\ude2e<\/figcaption><\/figure><\/div>\n","innerContent":["\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpq4.jpeg\" alt=\"\" class=\"wp-image-2799\"\/><figcaption>Co interesuj\u0105ce alfa Parcela v2 ukaza\u0142a si\u0119 ju\u017c ponad dwa lata temu \ud83d\ude2e<\/figcaption><\/figure><\/div>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Z dokumentacji wynika, \u017ce je\u015bli nie polegacie zbytnio na zewn\u0119trznych wtyczkach to migracja powinna przebiec raczej bezbole\u015bnie. A migrowa\u0107 warto, bo lista zmian wygl\u0105da naprawd\u0119 imponuj\u0105co. Poni\u017cej znajdziecie jej skr\u00f3con\u0105 wersj\u0119, a po wi\u0119cej szczeg\u00f3\u0142\u00f3w jak zwykle odsy\u0142amy do \u017ar\u00f3de\u0142.<\/p>\n","innerContent":["\n<p>Z dokumentacji wynika, \u017ce je\u015bli nie polegacie zbytnio na zewn\u0119trznych wtyczkach to migracja powinna przebiec raczej bezbole\u015bnie. A migrowa\u0107 warto, bo lista zmian wygl\u0105da naprawd\u0119 imponuj\u0105co. Poni\u017cej znajdziecie jej skr\u00f3con\u0105 wersj\u0119, a po wi\u0119cej szczeg\u00f3\u0142\u00f3w jak zwykle odsy\u0142amy do \u017ar\u00f3de\u0142.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nowo\u015bci w Parcel v2:&nbsp;<\/p>\n","innerContent":["\n<p>Nowo\u015bci w Parcel v2:&nbsp;<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[],"innerHTML":"\n<ul><li>Nowy system wtyczek (niestety nie jest on wstecznie kompatybilny, wi\u0119c wtyczki do Parcel 1 musz\u0105 zosta\u0107 przepisane od podstaw)<\/li><li>Domy\u015blnie w\u0142\u0105czony Tree Shaking<\/li><li>Domy\u015blnie w\u0142\u0105czony Differential Building (ES modules)<\/li><li>Automatyczne dzielenie kodu obs\u0142uguj\u0105ce wsp\u00f3\u0142dzielenie paczek i ich wsp\u00f3\u0142bie\u017cne \u0142adowanie<\/li><li>Optymalizacja wydajno\u015bci (Parcel do\u0142\u0105cza do grona frontendowych narz\u0119dzi napisanych w Rust!)<\/li><li>Konwersja i optymalizacja obraz\u00f3w (w\u0142\u0105czaj\u0105c takie formaty jak AVIF i WebP)<\/li><li>Usprawniony Hot Module Reloading (z wsparciem dla React Fast Refresh)<\/li><li>Lazy Development Module (ta funkcjonalno\u015b\u0107 w Webpacku 5 jest jeszcze w preview)<\/li><\/ul>\n","innerContent":["\n<ul><li>Nowy system wtyczek (niestety nie jest on wstecznie kompatybilny, wi\u0119c wtyczki do Parcel 1 musz\u0105 zosta\u0107 przepisane od podstaw)<\/li><li>Domy\u015blnie w\u0142\u0105czony Tree Shaking<\/li><li>Domy\u015blnie w\u0142\u0105czony Differential Building (ES modules)<\/li><li>Automatyczne dzielenie kodu obs\u0142uguj\u0105ce wsp\u00f3\u0142dzielenie paczek i ich wsp\u00f3\u0142bie\u017cne \u0142adowanie<\/li><li>Optymalizacja wydajno\u015bci (Parcel do\u0142\u0105cza do grona frontendowych narz\u0119dzi napisanych w Rust!)<\/li><li>Konwersja i optymalizacja obraz\u00f3w (w\u0142\u0105czaj\u0105c takie formaty jak AVIF i WebP)<\/li><li>Usprawniony Hot Module Reloading (z wsparciem dla React Fast Refresh)<\/li><li>Lazy Development Module (ta funkcjonalno\u015b\u0107 w Webpacku 5 jest jeszcze w preview)<\/li><\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":2800,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpuw.jpeg\" alt=\"\" class=\"wp-image-2800\"\/><\/figure><\/div>\n","innerContent":["\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/10\/5qdpuw.jpeg\" alt=\"\" class=\"wp-image-2800\"\/><\/figure><\/div>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>\u0179r\u00f3d\u0142a:<\/h2>\n","innerContent":["\n<h2>\u0179r\u00f3d\u0142a:<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/parceljs.org\/blog\/v2\/\">https:\/\/parceljs.org\/blog\/v2\/<\/a><br><a href=\"https:\/\/parceljs.org\/getting-started\/migration\/\">https:\/\/parceljs.org\/getting-started\/migration\/<\/a><br><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/parceljs.org\/blog\/v2\/\">https:\/\/parceljs.org\/blog\/v2\/<\/a><br><a href=\"https:\/\/parceljs.org\/getting-started\/migration\/\">https:\/\/parceljs.org\/getting-started\/migration\/<\/a><br><\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10068","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=10068"}],"version-history":[{"count":1,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10068\/revisions"}],"predecessor-version":[{"id":10618,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10068\/revisions\/10618"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/7734"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=10068"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=10068"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=10068"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}