{"id":9982,"date":"2021-02-05T16:46:57","date_gmt":"2021-02-05T15:46:57","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=9982"},"modified":"2024-01-30T16:37:29","modified_gmt":"2024-01-30T15:37:29","slug":"modern-frontend-in-ecommerce","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/modern-frontend-in-ecommerce\/","title":{"rendered":"Nowoczesny frontend w e-commerce"},"content":{"rendered":"\n<p id=\"97cd5ba6-8987-4ccb-9269-a15cde812d9a\">W obecnych czasach, patrz\u0105c m.in. na wycen\u0119 Shopify na ameryka\u0144skiej gie\u0142dzie, czy podej\u015bcie LPP do swoich sklep\u00f3w stacjonarnych, ci\u0119\u017cko nie zauwa\u017cy\u0107 wzrastaj\u0105cego znaczenia e-commerce\u2019u. W internecie, tak samo jak w realnym \u015bwiecie, wiele czynnik\u00f3w wp\u0142ywa na nasze do\u015bwiadczenie zakupowe.<\/p>\n\n\n\n<p id=\"2d011d77-4b82-44ee-9e30-9bcc35c928ae\">UX, design oraz performance s\u0105 kluczowymi elementami, kt\u00f3rych znaczenie jest nie do przecenienia zar\u00f3wno w zakupach internetowych jak i standardowych. Ka\u017cdemu z tych zagadnie\u0144 mo\u017cna po\u015bwi\u0119ci\u0107 osobn\u0105 ksi\u0105\u017ck\u0119. Takowe zreszt\u0105 ju\u017c zosta\u0142y napisane. Z tego wzgl\u0119du postaram si\u0119 wskaza\u0107 najistotniejsze elementy ka\u017cdego z nich, w ramach posiadanej wiedzy. Nie mam zamiaru dog\u0142\u0119bnie analizowa\u0107 ka\u017cdego z poruszonych temat\u00f3w, poniewa\u017c ani nie jestem ekspertem w \u017cadnej z tych dziedzin, ani forma artyku\u0142u nie pozwala na tak obszerne opracowanie. Celem niniejszego artyku\u0142u jest przedstawienie developerowi potencjalnych problem\u00f3w, z jakimi mo\u017ce zmierzy\u0107 si\u0119 w g\u0142\u00f3wnych obszarach nowoczesnego e-commerce\u2019u.<\/p>\n\n\n\n<p id=\"2749a0c9-3874-46a8-a8e8-12a417924bac\">Na pocz\u0105tku jednak chcia\u0142bym om\u00f3wi\u0107 pewien buzzword, o kt\u00f3rym coraz g\u0142o\u015bniej, zw\u0142aszcza w kontek\u015bcie e-commerce\u2019u.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Headless e-commerce<\/h2>\n\n\n\n<p>Czym w\u0142a\u015bciwie jest headless e-commerce? Jest to e-commerce, w kt\u00f3rym ka\u017cda warstwa jest realizowana niezale\u017cnie od siebie, a spoiwem tych warstw jest ich API. Z perspektywy u\u017cytkownika ko\u0144cowego, potencjalna r\u00f3\u017cnica mo\u017ce by\u0107 odczuwalna g\u0142\u00f3wnie w wydajno\u015bci aplikacji. Patrz\u0105c jednak na dost\u0119pne funkcjonalno\u015bci, headless e-commerce nie r\u00f3\u017cni si\u0119 niczym od \u201ezwyk\u0142ego\u201d e-commercu. W tym miejscu mo\u017cna zada\u0107 sobie pytanie \u2013 jakie zalety ma podej\u015bcie headless w zestawieniu z tradycyjnym, \u201emonolitycznym\u201d?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zalety<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u0141atwiejszy do zrealizowania wysoki performance serwisu<\/h4>\n\n\n\n<p id=\"ccffd43d-b854-4f04-bb7f-3458de605605\">Przy stawianiu sklep\u00f3w w oparciu o zasad\u0119 \u201ebackend rules them all\u201d znacznie ci\u0119\u017cej osi\u0105gn\u0105\u0107 wysoki performance aplikacji. Wynika to mi\u0119dzy innymi ze z\u0142o\u017cono\u015bci architektury backendowej, kt\u00f3ra musi ud\u017awign\u0105\u0107 w takim wypadku r\u00f3wnie\u017c frontend i warstw\u0119 cache. Zazwyczaj na backendzie zaprz\u0119gamy do pomocy dodatkowe narz\u0119dzia do cache\u2019owania, jak np. Varnish, Redis lub Elasticsearch, aby trzyma\u0107 w pami\u0119ci wyniki poszczeg\u00f3lnych zapyta\u0144.<\/p>\n\n\n\n<p id=\"f474efb2-3c5d-4616-a626-2a2ed0042adc\">Korzystaj\u0105c z podej\u015bcia headlessowego, mo\u017cemy w \u0142atwy spos\u00f3b wygenerowa\u0107 statycznie ka\u017cd\u0105 podstron\u0119, kt\u00f3rej widok nie jest zale\u017cny od statusu u\u017cytkownika (zalogowany\/niezalogowany). Statycznie wygenerowana strona powoduje, \u017ce u\u017cytkownik czeka tylko na za\u0142adowanie \u201eczystego\u201d html i css\u2019a. Dla e-commerce\u2019u to podej\u015bcie sprawdza si\u0119 g\u0142\u00f3wnie dlatego, \u017ce w tej domenie g\u0142\u00f3wn\u0105, istotn\u0105 r\u00f3\u017cnic\u0105 dla u\u017cytkownik\u00f3w jest zawarto\u015b\u0107 naszego koszyka. Z perspektywy UX nie ma konieczno\u015bci \u015bci\u0105gania koszyka razem z contentem ca\u0142ej strony \u2013 mo\u017cna pobra\u0107 go dynamicznie, po wej\u015bciu u\u017cytkownika na stron\u0119. Dlatego statycznie generowane strony s\u0105 najlepszym rozwi\u0105zaniem pod e-commerce.<\/p>\n\n\n\n<p id=\"107881c0-077d-4680-8b86-da717a961d54\">W tym miejscu mo\u017ce pojawi\u0107 si\u0119 pytanie o inwalidacj\u0119 cache\u2019a. Przecie\u017c statycznie wygenerowane strony nie b\u0119d\u0105 si\u0119 aktualizowa\u0107. I tutaj kolejna dobra wiadomo\u015b\u0107 dla zainteresowanych. Nowoczesne frontendowe frameworki takie jak NextJS lub Remix korzystaj\u0105 ze wzorca \u201estale while revalidate\u201d. W skr\u00f3cie \u2013 oznacza to, \u017ce inwalidacja cache\u2019a odbywa si\u0119 \u201epod spodem\u201d, po okre\u015blonym przez nas up\u0142ywie czasu. W mi\u0119dzyczasie u\u017cytkownicy dostaj\u0105 wersj\u0119 strony zapisan\u0105 w cache\u2019u. Rozwi\u0105zanie to pozwala r\u00f3wnie\u017c zrezygnowa\u0107 z Varnisha, co upraszcza nasz system i odci\u0105\u017ca backendowc\u00f3w.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Mniejszy scope technologii wymaganych od pojedynczego developera<\/h4>\n\n\n\n<p>Je\u015bli serwis, kt\u00f3ry piszemy opiera si\u0119 na backendzie, kt\u00f3ry renderuje r\u00f3wnie\u017c frontend, praktycznie nie ma mo\u017cliwo\u015bci, aby frontend developer nie zna\u0142 technologii u\u017cywanych na backendzie. Przyk\u0142adowo \u2013 pisz\u0105c warstw\u0119 frontu w Magento 2, musimy zna\u0107 struktur\u0119 pliku xml wymaganego przez Magento, musimy wiedzie\u0107 jakie wpisy doda\u0107 do poszczeg\u00f3lnych plik\u00f3w xml oraz w kt\u00f3rych miejscach je umie\u015bci\u0107. W miejscach, gdzie chcieliby\u015bmy w Javascripcie u\u017cy\u0107 danych przekazanych bezpo\u015brednio z backendu, jeste\u015bmy zmuszeni do zrozumienia ca\u0142ej struktury MVC, jaka stoi za Magento. Oczywi\u015bcie za tym wszystkim idzie r\u00f3wnie\u017c konieczna znajomo\u015b\u0107 PHP. I ten dodatkowy narzut absolutnie nie rekompensuje wymaganej wiedzy z zakresu frontendu.<\/p>\n\n\n\n<p>W przypadku podej\u015bcia headlessowego, frontend developer musi zna\u0107 tylko frontend. That\u2019s it.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Wi\u0119ksza elastyczno\u015b\u0107 przy wyborze technologii<\/h4>\n\n\n\n<p>Przy pracy nad headlessowym serwisem (niezale\u017cnie, czy jest to e-commerce czy nie), mamy wi\u0119ksz\u0105 swobod\u0119 nad wyborem narz\u0119dzi do realizacji zadania, niezale\u017cnie od tego czy jest to frontend, czy backend. Jedyne co spaja te dwie warstwy to struktura i spos\u00f3b (SOAP, REST, GraphQL) przesy\u0142anych danych. Patrz\u0105c ca\u0142o\u015bciowo na architektur\u0119, backend stanowi jej swoisty fundament. Z perspektywy frontend developera, przy podej\u015bciu headlessowym backend stanowi detal implementacyjny. W takim wypadku mo\u017cna \u0142atwo wymieni\u0107 technologi\u0119 w dowolnym miejscu lub doda\u0107 nowy mikroserwis bazuj\u0105cy na zupe\u0142nie innym j\u0119zyku lub frameworku.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Mo\u017cliwo\u015b\u0107 rozwijania poszczeg\u00f3lnych warstw niezale\u017cnie od siebie<\/h4>\n\n\n\n<p>W zwi\u0105zku z elastyczno\u015bci\u0105, kt\u00f3r\u0105 daje nam headless e-commerce, \u017cadna z warstw nie jest blokowana przez inn\u0105. Mo\u017cna w \u0142atwy spos\u00f3b realizowa\u0107 deploy\u2019e poszczeg\u00f3lnych warstw, zupe\u0142nie niezale\u017cnie od siebie. Pozwala nam to r\u00f3wnie\u017c na \u0142atwiejsze iterowanie zmian w designie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Wady<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Konieczno\u015b\u0107 integracji dodatkowych narz\u0119dzi<\/h4>\n\n\n\n<p>W rozbudowanych systemach mo\u017cemy oczekiwa\u0107 wielu wbudowanych funkcjonalno\u015bci, jak np. analitics czy CMS. Jest to oczywi\u015bcie koszt, kt\u00f3ry trzeba ponie\u015b\u0107 w przypadku ich realizacji w podej\u015bciu headlessowym. W tym miejscu trzeba samemu odpowiedzie\u0107 sobie na pytanie czy narz\u0119dzia dost\u0119pne w \u201emonolicie\u201d s\u0105 potrzebne, czy s\u0105 wystarczaj\u0105ce, czy development b\u0119dzie wystarczaj\u0105co szybki oraz jakich mamy developer\u00f3w do dyspozycji.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Podsumowanie<\/h3>\n\n\n\n<p>Wymienione przeze mnie r\u00f3\u017cnice s\u0105 tymi, kt\u00f3re naj\u0142atwiej wykaza\u0107. Je\u015bli chodzi na przyk\u0142ad o r\u00f3\u017cnic\u0119 w kosztach to jest to ci\u0119\u017ckie do oszacowania. Na koszta sk\u0142ada si\u0119 zar\u00f3wno wielko\u015b\u0107 teamu jak i czas, kt\u00f3ry po\u015bwi\u0119c\u0105 na projekt. Wielko\u015b\u0107 teamu przy podej\u015bciu headlessowym mo\u017ce by\u0107 dok\u0142adnie taka sama jak przy podej\u015bciu tradycyjnym. Je\u015bli chodzi o czas realizacji \u2013 teoretycznie r\u00f3wnie\u017c mo\u017ce by\u0107 taki sam w obu wypadkach. W praktyce jednak zauwa\u017cy\u0142em, \u017ce podej\u015bcie headlessowe znacznie przyspieszy\u0142o development. W du\u017cej mierze przyczyni\u0142 si\u0119 do tego mniejszy overhead, spowodowany konieczno\u015bci\u0105 posiadania wiedzy z zakresu backendu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Trzy filary nowoczesnego frontendu<\/h2>\n\n\n\n<p>Pora na om\u00f3wienie temat\u00f3w, kt\u00f3re wed\u0142ug mnie musz\u0105 zosta\u0107 zaadresowane, w trakcie tworzenia warstwy frontendowej. Zakres ka\u017cdego z nich znacznie wykracza poza e-commerce jak i r\u00f3wnie\u017c poza frontend. Poni\u017cej postaram si\u0119 om\u00f3wi\u0107 te punkty w kontek\u015bcie tworzenia sklepu internetowego.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. UX<\/h3>\n\n\n\n<p id=\"747f8335-feb1-4374-9328-397346cff9a3\">UX to inaczej user experience, czyli to, czego u\u017cytkownik do\u015bwiadcza \u2013 w tym wypadku \u2013 w naszym internetowym sklepie. UX sam w sobie jest ogromnym obszarem, daleko wykraczaj\u0105cym poza e-commerce, niemniej jednak w samym e-commercie stanowi element niezb\u0119dny do uzyskania wysokiego wsp\u00f3\u0142czynnika konwersji.<\/p>\n\n\n\n<p id=\"369e4131-994f-47d7-8170-e3ffcaabf29d\">Nieresponsywny design, skomplikowanie sposoby nawigacji, niepraktyczne umiejscowienie ikonek, brak domy\u015blnych i szeroko stosowanych skr\u00f3t\u00f3w klawiszowych (jak np. klawisz esc wy\u0142\u0105czaj\u0105cy modal), \u201efreeze\u201d ekranu w trakcie \u0142adowania poszczeg\u00f3lnych akcji, menu, kt\u00f3re po najechaniu zajmuje praktycznie ca\u0142\u0105 stron\u0119 i nie spos\u00f3b przez to go \u201eodhoverowa\u0107\u201d, brak mo\u017cliwo\u015bci powrotu do tego samego miejsca na li\u015bcie produkt\u00f3w po wej\u015bciu w produkt \u2013 to tylko niekt\u00f3re UXowe grzeszki, z kt\u00f3rych przynajmniej jeden mo\u017cemy spotka\u0107 praktycznie w ka\u017cdym internetowym sklepie.<\/p>\n\n\n\n<p id=\"9bf53a97-ad6f-420e-8241-9ae695ac3778\">O ile w wi\u0119kszo\u015bci przypadk\u00f3w, jeden czy dwa b\u0142\u0119dy nie powoduj\u0105 katastrofy, o tyle ich kumulacja mo\u017ce by\u0107 krytyczna. W skrajnych przypadkach mo\u017ce doprowadzi\u0107 do zwi\u0119kszenia nawet o 73% ilo\u015bci u\u017cytkownik\u00f3w opuszczaj\u0105cych nasz\u0105 stron\u0119 (<a href=\"https:\/\/baymard.com\/research\/ecommerce-product-lists\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/baymard.com\/research\/ecommerce-product-lists<\/a>).<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Filtrowanie na li\u015bcie produkt\u00f3w<\/h4>\n\n\n\n<p>Filtrowanie na li\u015bcie produkt\u00f3w jest jednym z krytycznych punkt\u00f3w naszej aplikacji. Ostatni\u0105 rzecz\u0105, jak\u0105 chcemy pokaza\u0107 u\u017cytkownikowi, to ekran bez jakichkolwiek produkt\u00f3w. Oczywi\u015bcie UX w tym wypadku musi by\u0107 tak samo dobry na desktopie, jak i na ekranach mobilnych.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>S\u0142abo<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Jako przyk\u0142ad s\u0142abego UXu przy filtrowaniu produkt\u00f3w mo\u017ce pos\u0142u\u017cy\u0107 poni\u017cszy przyk\u0142ad sklepu odzie\u017cowego.<\/p>\n\n\n\n<p><figure><img decoding=\"async\" class=\"alignnone size-full wp-image-10145\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/outdoor_voices2.gif\" alt=\"\" width=\"1851\" height=\"852\"><\/figure><\/p>\n\n\n\n<p>Przede wszystkim brak tutaj mo\u017cliwo\u015bci wybrania kilku warto\u015bci tego samego typu. Nie mamy opcji wy\u015bwietlenia naraz produkt\u00f3w w kolorze szarym lub zielonym. Brak te\u017c jakichkolwiek informacji o ilo\u015bci produkt\u00f3w. Powoduje to, \u017ce wybieraj\u0105c pomara\u0144czowe topy w rozmiarze XS do noszenia na dworzu dostajemy taki ekran:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/02\/Outdoor-voices-no-products-Modern-frontend-in-ecommerce-1-1024x511-1.png\"><img decoding=\"async\" width=\"1024\" height=\"511\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/02\/Outdoor-voices-no-products-Modern-frontend-in-ecommerce-1-1024x511-1.png\" alt=\"Ekran z komunikatem No results found\" class=\"wp-image-25334\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/02\/Outdoor-voices-no-products-Modern-frontend-in-ecommerce-1-1024x511-1.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/02\/Outdoor-voices-no-products-Modern-frontend-in-ecommerce-1-1024x511-1-300x150.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/02\/Outdoor-voices-no-products-Modern-frontend-in-ecommerce-1-1024x511-1-768x383.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Wej\u015bcie w ekran \u201eNowo\u015bci dla m\u0119\u017cczyzn\u201d jest tak naprawd\u0119 wej\u015bciem w nowe produkty z wybran\u0105 opcj\u0105 \u201em\u0119\u017cczy\u017ani\u201d. Jako, \u017ce filtry nie s\u0105 zale\u017cne od siebie, to w nowo\u015bciach dla m\u0119\u017cczyzn mamy mo\u017cliwo\u015b\u0107 filtrowania po \u201estanikach\u201d. Ilo\u015b\u0107 filtr\u00f3w jest naprawd\u0119 niewielka. Brak np. bardzo podstawowego filtra cenowego. W dodatku posortowa\u0107 po cenie mo\u017cna jedynie rosn\u0105co. Na plus (?) mo\u017cna zapisa\u0107 fakt, \u017ce ze wzgl\u0119du na szybko\u015b\u0107 dzia\u0142ania (i brak mo\u017cliwo\u015bci wyboru paru opcji z tego samego typu filtra) nie przeszkadza a\u017c tak fakt, \u017ce produkty prze\u0142adowuj\u0105 si\u0119 od razu po wybraniu jakiej\u015b opcji. W przypadku, kiedy chcieliby\u015bmy wybra\u0107 kilka opcji i po wyborze ka\u017cdej musieliby\u015bmy czeka\u0107 par\u0119 sekund, z pewno\u015bci\u0105 wielu u\u017cytkownik\u00f3w opu\u015bci\u0142oby stron\u0119 w trakcie filtrowania.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Troch\u0119 lepiej<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Odrobin\u0119 lepiej prezentuje si\u0119 kolejny przedstawiciel bran\u017cy odzie\u017cowej.<\/p>\n\n\n\n<figure><img decoding=\"async\" class=\"alignnone size-full wp-image-10008\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/Reserved-Modern-frontend-in-ecommerce-2.gif\" alt=\"\" width=\"1851\" height=\"889\"><\/figure><p><\/p>\n\n\n\n<p id=\"09389ecd-1b4f-4dae-909a-d5a4d79663ed\">Jednak i ten sklep nie wystrzeg\u0142 si\u0119 kilku b\u0142\u0119d\u00f3w. Przede wszystkim kiedy ju\u017c prezentujemy filtr cenowy, to dobrze od razu uzupe\u0142ni\u0107 g\u00f3rny i dolny zakres. Nale\u017ca\u0142oby zwalidowa\u0107 te liczby, poniewa\u017c mo\u017cemy wpisa\u0107 tak wysok\u0105 doln\u0105 cen\u0119 lub tak nisk\u0105 g\u00f3rn\u0105, \u017ce dostaniemy ekran bez \u017cadnych produkt\u00f3w.<\/p>\n\n\n\n<p id=\"a3a1f696-1e1e-4440-8b09-b69ddcd0bc4d\">Ekran bez ani jednego produktu jest generalnie elementem problematycznym w tym sklepie. Mamy zbyt wiele mo\u017cliwo\u015bci, kt\u00f3re nas do niego doprowadzaj\u0105. Przyk\u0142adowo, w kategorii m\u0119skich swetr\u00f3w mo\u017cemy wybra\u0107 rozmiar M oraz cech\u0119 \u201ez kapturem\u201d kt\u00f3ra ko\u0144czy si\u0119 brakiem wynik\u00f3w:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Reserved-brak-produktow-Morden-frontend-in-ecommerce-1024x422-1.png\"><img decoding=\"async\" width=\"1024\" height=\"422\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Reserved-brak-produktow-Morden-frontend-in-ecommerce-1024x422-1.png\" alt=\"Widok braku produkt\u00f3w w sklepie internetowym Reserved\" class=\"wp-image-25336\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Reserved-brak-produktow-Morden-frontend-in-ecommerce-1024x422-1.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Reserved-brak-produktow-Morden-frontend-in-ecommerce-1024x422-1-300x124.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Reserved-brak-produktow-Morden-frontend-in-ecommerce-1024x422-1-768x317.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p id=\"506f0665-7e2a-42b5-9be5-4f5084c23ddd\">Takich kombinacji jest oczywi\u015bcie zdecydowanie wi\u0119cej. Kolejnym minusem jest fakt, \u017ce po wyborze filtr\u00f3w u\u017cytkownik nie ma nigdzie przedstawionej informacji apropos tego, jakie opcje wybra\u0142. Aby si\u0119 tego dowiedzie\u0107, musi klikn\u0105\u0107 w dany filtr i przejecha\u0107 przez wszystkie opcje, \u017ceby zobaczy\u0107 te zaznaczone.<\/p>\n\n\n\n<p id=\"ae7c656d-fe13-47df-9e6d-3db7f5cdd56f\">Ca\u0142o\u015bciowo jednak filtrowanie produkt\u00f3w wypada w tym wypadku lepiej, ni\u017c u poprzednika. Dost\u0119pne opcje s\u0105 zaw\u0119\u017cone do kontekstu, w jakim si\u0119 znajdujemy. Mo\u017cemy r\u00f3wnie\u017c wybra\u0107 kilka opcji z jednego typu filtra. Razi jednak brak informacji o ilo\u015bci produkt\u00f3w przy danym filtrze. No i ten nieszcz\u0119sny ekran bez \u017cadnych produkt\u00f3w\u2026<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Du\u017co lepiej<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Je\u015bli chodzi o filtrowanie produkt\u00f3w, najlepiej prezentuje si\u0119 poni\u017cszy sklep, r\u00f3wnie\u017c z bran\u017cy odzie\u017cowej.<\/p>\n\n\n\n<p><figure><img decoding=\"async\" class=\"alignnone size-full wp-image-10009\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/HM-Modern-frontend-in-ecommerce-1.gif\" alt=\"\" width=\"1851\" height=\"931\"><\/figure><p><\/p><\/p>\n\n\n\n<p id=\"21c87173-003e-4ac7-a868-19fa007c91e2\">Przy ka\u017cdej opcji widzimy, jaka ilo\u015b\u0107 produkt\u00f3w kryje si\u0119 pod ni\u0105. Po wyborze jakiej\u015b warto\u015bci mo\u017cemy w \u0142atwy spos\u00f3b j\u0105 usun\u0105\u0107. Filtry s\u0105 te\u017c dynamiczne, czyli je\u015bli wybierzemy bia\u0142y kolor, a w nim \u017caden produkt nie b\u0119dzie mia\u0142 rozmiaru L, nie b\u0119dziemy mogli wybra\u0107 tego rozmiaru. To automatycznie usuwa nam przypadek pustego ekranu. Mamy bardzo du\u017co dost\u0119pnych filtr\u00f3w, jednak u\u017cytkownik na start dostaje tylko te najwa\u017cniejsze. To r\u00f3wnie\u017c bardzo rozs\u0105dne rozwi\u0105zanie.<\/p>\n\n\n\n<p id=\"2515468f-8b63-4ac2-8de7-0538043ceb3c\">Na minus mo\u017cemy zapisa\u0107 brak filtra cenowego. I to pomimo du\u017cej ilo\u015bci dost\u0119pnych filtr\u00f3w. Drugim niuansem do usprawnienia jest fakt \u201ezamro\u017cenia\u201d ekranu, kt\u00f3ry wyst\u0119puje w przypadku wyboru jakiej\u015b opcji. W przypadku wolniejszej odpowiedzi z backendu, mo\u017ce to spowodowa\u0107 frustracj\u0119 u\u017cytkownika.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Proces zakupowy<\/h4>\n\n\n\n<p id=\"1e2e286e-f005-44aa-8353-5061a3db9521\">Proces zakupowy jest r\u00f3wnie\u017c niezwykle istotny, je\u015bli zale\u017cy nam na wysokiej konwersji. Prawie 70% u\u017cytkownik\u00f3w porzuca ten proces w trakcie, ju\u017c po dodaniu produkt\u00f3w do koszyka (<a href=\"https:\/\/baymard.com\/lists\/cart-abandonment-rate\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/baymard.com\/lists\/cart-abandonment-rate<\/a>). Pomy\u015blcie prosz\u0119 chwil\u0119 o tej liczbie. Prawie 3\/4 u\u017cytkownik\u00f3w nie ko\u0144czy zakupu ju\u017c PO wybraniu produkt\u00f3w! Jest to oczywi\u015bcie \u015brednia warto\u015b\u0107, kt\u00f3ra zale\u017cy od wielu czynnik\u00f3w. Nie zmienia to jednak faktu, \u017ce checkout mo\u017ce by\u0107 krytycznym miejscem naszej aplikacji.<\/p>\n\n\n\n<p id=\"aa7043c4-4ba0-4704-a267-8502d032d094\">Istotn\u0105 spraw\u0105 dotycz\u0105c\u0105 checkoutu jest utworzenie takiego kontekstu, aby u\u017cytkownik by\u0142 maksymalnie skupiony na procesie p\u0142atno\u015bci. Nie chcemy odwraca\u0107 jego uwagi pokazuj\u0105c mu menu z kategoriami, wyszukiwark\u0119 produkt\u00f3w, reklamy czy popupy z newsletterem. Warto zastanowi\u0107 si\u0119 r\u00f3wnie\u017c czy potrzebny jest w tym miejscu chat z obs\u0142ug\u0105 klienta. Ostatnie czego chcemy podczas finalizacji zakupu, to aby klient w po\u0142owie skupi\u0142 si\u0119 na czym\u015b innym.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Ikea-checkout-Modern-frontend-in-ecommerce-1024x538-1.png\"><img decoding=\"async\" width=\"1024\" height=\"538\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Ikea-checkout-Modern-frontend-in-ecommerce-1024x538-1.png\" alt=\"Ekrany finalizacji zakup\u00f3w w sklepie internetowym Ikea\" class=\"wp-image-25338\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Ikea-checkout-Modern-frontend-in-ecommerce-1024x538-1.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Ikea-checkout-Modern-frontend-in-ecommerce-1024x538-1-300x158.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Ikea-checkout-Modern-frontend-in-ecommerce-1024x538-1-768x404.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Formularz pewnego szwedzkiego sklepu meblowego jest dobrym przyk\u0142adem wspomnianych praktyk. Klient na tej stronie jest prowadzony w jasny spos\u00f3b przez kolejne kroki. Nie ma te\u017c specjalnie rozpraszaczy na stronie \u2013 pozosta\u0142 tylko czat z obs\u0142ug\u0105 klienta.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Im kr\u00f3tszy proces, tym lepszy<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Badania wykazuj\u0105 r\u00f3wnie\u017c korelacj\u0119 pomi\u0119dzy ilo\u015bci\u0105 krok\u00f3w koniecznych do przej\u015bcia na checkoucie a ilo\u015bci\u0105 dropout\u00f3w (<a href=\"https:\/\/baymard.com\/blog\/checkout-flow-average-form-fields\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/baymard.com\/blog\/checkout-flow-average-form-fields<\/a>). Warto zatem zminimalizowa\u0107 ilo\u015b\u0107 klikni\u0119\u0107 potrzebnych do przej\u015bcia procesu.<\/p>\n\n\n\n<p id=\"3bccd729-4a67-4bfd-bfcf-995ed001f8b1\">W tym miejscu trzeba wspomnie\u0107 o us\u0142udze Google\u2019a, zwi\u0105zanej z p\u0142atno\u015bciami. Integracja z Google Pay pozwala naszym u\u017cytkownikom na maksymalne skr\u00f3cenie ilo\u015bci krok\u00f3w na checkoucie. W sytuacji, w kt\u00f3rej mamy podpi\u0119t\u0105 kart\u0119 bankow\u0105 do konta Google, a tak\u017ce mamy zapisany tam adres, formularz wygl\u0105da tak:<\/p>\n\n\n\n<p><figure id=\"5b2626f7-cbd0-452a-a8ac-6c81107a637a\" class=\"image\">\n<figcaption><img decoding=\"async\" class=\"alignnone size-full wp-image-9992\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/Google_Pay__Checkout-Modern-frontend-in-ecommerce.gif\" alt=\"\" width=\"1000\" height=\"1000\"><br>\u0179r\u00f3d\u0142o: <a href=\"https:\/\/developers.googleblog.com\/2019\/11\/google-pay-now-available-on-stripe.html\" rel=\"nofollow\" >https:\/\/developers.googleblog.com\/2019\/11\/google-pay-now-available-on-stripe.html<\/a><\/figcaption>\n<\/figure><\/p>\n\n\n\n<p id=\"5defe748-94a4-463b-8e58-52c2a1005370\">Niew\u0105tpliwie ci\u0119\u017cko o jeszcze kr\u00f3tszy proces, ni\u017c tylko 2 klikni\u0119cia, bez \u017cadnych dodatkowych p\u00f3l do wype\u0142nienia.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Inne b\u0142\u0119dy na checkoucie<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Zainteresowanym innymi popularnymi b\u0142\u0119dami w procesie zakupowym polecam zapozna\u0107 si\u0119 z tym raportem:&nbsp;<a href=\"https:\/\/baymard.com\/blog\/current-state-of-checkout-ux\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/baymard.com\/blog\/current-state-of-checkout-ux<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Optymistyczny update (optimistic UI)<\/h4>\n\n\n\n<p id=\"d304f82e-b49d-4b51-8e77-8657a22a7252\">Optymistyczny update naszego interfejsu polega na natychmiastowym pokazaniu u\u017cytkownikowi pozytywnego rezultatu wykonanej przez niego akcji. Poni\u017cej por\u00f3wnanie standardowego zachowania z optymistycznym updatem.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Standardowe zachowanie<\/strong><\/li>\n<\/ul>\n\n\n\n<p><figure><img decoding=\"async\" class=\"alignnone size-full wp-image-10010\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/Dajar-Modern-frontend-in-ecommerce-1.gif\" alt=\"\" width=\"1846\" height=\"851\"><\/figure><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Optymistyczne zachowanie<\/strong><\/li>\n<\/ul>\n\n\n\n<p><figure><img decoding=\"async\" class=\"alignnone size-full wp-image-10011\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/Optimistic-ui-Modern-frontend-in-ecommerce-1.gif\" alt=\"\" width=\"1844\" height=\"949\"><\/figure><\/p>\n\n\n\n<p id=\"43391656-4789-4f12-8d20-caf7dd3f03ac\">Istotne jest aby zrozumie\u0107, \u017ce odpowied\u017a z serwera w obu przypadkach mo\u017ce zaj\u0105\u0107 tyle samo czasu. Optymistyczny update sprawia jednak, \u017ce u\u017cytkownik nie musi na nic czeka\u0107. Powoduje to r\u00f3wnie\u017c, \u017ce zmniejszamy ilo\u015b\u0107 potencjalnych loader\u00f3w na stronie. Oczywi\u015bcie, jak zwykle, \u201ewith great power comes great responsibility\u201d. Musimy pami\u0119ta\u0107 o zadbaniu o wszystkie mo\u017cliwe scenariusze. Na przyk\u0142ad co w sytuacji, kiedy u\u017cytkownik doda produkt do koszyka i zmieni stron\u0119 zanim przyjdzie negatywna odpowied\u017a z serwera? Jak og\u00f3lnie obs\u0142u\u017cy\u0107 sytuacj\u0119, w kt\u00f3rej odpowied\u017a z serwera jest negatywna? Dodatkowo \u2013 optimistic update nie powinien by\u0107 implementowany w ka\u017cdym miejscu, gdzie wywo\u0142ywana przez u\u017cytkownika akcja wymaga odpowiedzi z backendu. Przyk\u0142adowo w sytuacji kiedy wype\u0142niamy formularz adresowy na checkoucie i przechodzimy dalej, do wyboru p\u0142atno\u015bci, nie ma sensu z g\u00f3ry zak\u0142ada\u0107, \u017ce formularz adresowy zosta\u0142 wype\u0142niony poprawnie. To zmusi\u0142oby nas do pokr\u0119tnej walidacji i skomplikowanego flow formularza.<\/p>\n\n\n\n<p id=\"a063ef1c-0b5c-4baf-bb0c-10f6a928b3da\">Optimistic UI wymaga od developera umiej\u0119tnego zaplanowania struktury lokalnego stanu oraz wszystkich tranzycji, jakie mog\u0105 w nim wyst\u0105pi\u0107. W kontek\u015bcie e-commercu, ze swojej strony polecam bibliotek\u0119 xState.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Performance<\/h3>\n\n\n\n<p id=\"d0777946-a68b-4614-b816-082470c636b0\">Wysoki performance jest nieodzownym elementem ka\u017cdej nowoczesnej aplikacji internetowej. Tak samo jak UX, wp\u0142ywa on na przychody, jakie czerpiemy z naszego sklepu. Performance jest w zasadzie elementem UX, poniewa\u017c to jak szybko \u0142aduj\u0105 si\u0119 poszczeg\u00f3lne strony wp\u0142ywa na odbi\u00f3r u\u017cytkownika.<\/p>\n\n\n\n<p id=\"c4b013f7-0d7c-4249-bc0f-126c7e9b2423\">Pytanie jak bardzo istotny jest performance. Opieraj\u0105c si\u0119 jedynie na podpowiedziach z lighthouse\u2019a mo\u017cna dowiedzie\u0107 si\u0119 mi\u0119dzy innymi, \u017ce:<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"1\" id=\"20459c6f-b777-4a43-a950-590aa5f2450d\">\n<li>Walmart zanotowa\u0142 popraw\u0119 przychod\u00f3w o 1% na ka\u017cde 100ms, w kt\u00f3rych szybciej \u0142adowa\u0142a si\u0119 strona.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Walmart-Modern-frontend-in-ecommerce.png\"><img decoding=\"async\" width=\"468\" height=\"119\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Walmart-Modern-frontend-in-ecommerce.png\" alt=\"\" class=\"wp-image-25340\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Walmart-Modern-frontend-in-ecommerce.png 468w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Walmart-Modern-frontend-in-ecommerce-300x76.png 300w\" sizes=\"(max-width: 468px) 100vw, 468px\" \/><\/a><\/figure>\n\n\n\n<p>Tak\u0105 sam\u0105 informacj\u0119 znalaz\u0142em r\u00f3wnie\u017c w odniesieniu do Amazona:&nbsp;<a href=\"https:\/\/www.gigaspaces.com\/blog\/amazon-found-every-100ms-of-latency-cost-them-1-in-sales\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/www.gigaspaces.com\/blog\/amazon-found-every-100ms-of-latency-cost-them-1-in-sales\/<\/a><\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\" id=\"20459c6f-b777-4a43-a950-590aa5f2450d\">\n<li>Po refaktoryzacji maj\u0105cej na celu zwi\u0119kszenie performance\u2019u, Pinterest zwi\u0119kszy\u0142 konwersj\u0119 o 15%.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Pinterest-Modern-frontend-in-ecommerce.png\"><img decoding=\"async\" width=\"502\" height=\"130\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Pinterest-Modern-frontend-in-ecommerce.png\" alt=\"\" class=\"wp-image-25342\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Pinterest-Modern-frontend-in-ecommerce.png 502w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Pinterest-Modern-frontend-in-ecommerce-300x78.png 300w\" sizes=\"(max-width: 502px) 100vw, 502px\" \/><\/a><\/figure>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>Je\u015bli strona potrzebuje wi\u0119cej ni\u017c 1s aby by\u0107 interaktywn\u0105, u\u017cytkownicy trac\u0105 zainteresowanie i jest znacznie wi\u0119ksza szansa na opuszczenie strony.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/1s-Modern-frontend-in-ecommerce.png\"><img decoding=\"async\" width=\"472\" height=\"124\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/1s-Modern-frontend-in-ecommerce.png\" alt=\"\" class=\"wp-image-25344\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/1s-Modern-frontend-in-ecommerce.png 472w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/1s-Modern-frontend-in-ecommerce-300x79.png 300w\" sizes=\"(max-width: 472px) 100vw, 472px\" \/><\/a><\/figure>\n\n\n\n<p>Te fakty s\u0105 ewidentnym dowodem na to, \u017ce przy wolnym \u0142adowaniu strony na pewno zarobimy mniej pieni\u0119dzy, ni\u017c przy szybszym.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"e1aa6612-b41e-4dd9-ab33-2a74b6d66cb0\">Jak mierzy\u0107 performance?<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Lighthouse.<\/strong><\/li>\n<\/ul>\n\n\n\n<p>To narz\u0119dzie, jego metryki, oraz wszystkie porady, jakie s\u0105 dost\u0119pne powinni\u015bmy zna\u0107 na wylot.<br>Dla aplikacji korzystaj\u0105cych z Reacta jest dodatek do konsoli, kt\u00f3ry pozwala na sprawdzenie czasu renderowania ka\u017cdego komponentu. Mo\u017cemy r\u00f3wnie\u017c zaznaczy\u0107 opcj\u0119, kt\u00f3ra powoduje pod\u015bwietlenie komponentu, kiedy si\u0119 on renderuje (lub rerenderuje).<\/p>\n\n\n\n<p><br><img decoding=\"async\" class=\"alignnone size-full wp-image-10012\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/Profiler-Modern-frontend-in-ecommerce-1.gif\" alt=\"\" width=\"1844\" height=\"555\"><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Headless e-commerce oraz performance<\/h4>\n\n\n\n<p id=\"58335f99-f353-474d-8b3a-e6f99f1cf0fa\">Tak jak wspomnia\u0142em przy okazji zalet headless e-commercu \u2013 bardzo wa\u017cn\u0105 zalet\u0105 obecnych narz\u0119dzi frontendowych jest mo\u017cliwo\u015b\u0107 wygenerowania naszej aplikacji do statycznych stron.<br>W celach pogl\u0105dowych zamieszczam poni\u017cej performance, kt\u00f3ry mamy out of the box na stronie listy produkt\u00f3w, kt\u00f3ra zosta\u0142a stworzona przy u\u017cyciu bibliotek NextJS oraz Tailwind, z podpi\u0119tym na backendzie Shopify.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Performance-Modern-frontend-in-ecommerce-1024x542-1.png\"><img decoding=\"async\" width=\"1024\" height=\"542\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Performance-Modern-frontend-in-ecommerce-1024x542-1.png\" alt=\"Wyniki Performance\" class=\"wp-image-25346\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Performance-Modern-frontend-in-ecommerce-1024x542-1.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Performance-Modern-frontend-in-ecommerce-1024x542-1-300x159.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Performance-Modern-frontend-in-ecommerce-1024x542-1-768x407.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p id=\"dbf9e62b-239a-4cab-a931-e978b1576cbb\">Jest to wynik z pewno\u015bci\u0105 zadowalaj\u0105cy, zw\u0142aszcza bior\u0105c pod uwag\u0119, \u017ce w celu uzyskania go, nie zosta\u0142y wykonane \u017cadne specjalne zadania optymalizuj\u0105ce. Rozumiem potencjalne w\u0105tpliwo\u015bci co do tego, czy wynik nie jest aby oszukany. Dociekliwych zapraszam na stron\u0119&nbsp;<a href=\"https:\/\/demo.vercel.store\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/demo.vercel.store\/<\/a>&nbsp;na podstawie kt\u00f3rej stworzona jest strona w powy\u017cszym screenie. Wartym odnotowania jest r\u00f3wnie\u017c fakt, \u017ce ze wzgl\u0119du na statycznie wygenerowan\u0105 stron\u0119, backend nie odgrywa w performancie \u017cadnej roli. Wida\u0107 to zw\u0142aszcza po wej\u015bciu na powy\u017csze demo, gdzie na backendzie podpi\u0119ty jest BigCommerce. Dodatkowo, wygenerowan\u0105 w ten spos\u00f3b stron\u0119 mo\u017cna zamie\u015bci\u0107 na CDN, kt\u00f3ry pomo\u017ce nam jeszcze bardziej zwi\u0119kszy\u0107 pr\u0119dko\u015b\u0107 \u0142adowania.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"2ac480d0-28d2-430c-aff0-47a2f12ca0aa\">Obrazki<\/h4>\n\n\n\n<p id=\"b3754680-dd2e-414c-9ef9-31dc0d109d8a\">\u201eYou can\u2019t be a web performance expert without being an image expert.\u201d \u2013 Tobin Titus<\/p>\n\n\n\n<p id=\"b5b0d367-e262-4160-a275-552535436323\">W obecnych czasach obrazki stanowi\u0105 zdecydowanie \u201enajci\u0119\u017cszy\u201d content na naszych stronach internetowych.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Obrazki-twitter-Modern-frontend-in-ecommerce.png\"><img decoding=\"async\" width=\"602\" height=\"339\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Obrazki-twitter-Modern-frontend-in-ecommerce.png\" alt=\"Average Bytes per Page by Content Type\" class=\"wp-image-25348\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Obrazki-twitter-Modern-frontend-in-ecommerce.png 602w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Obrazki-twitter-Modern-frontend-in-ecommerce-300x169.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/Obrazki-twitter-Modern-frontend-in-ecommerce-555x312.png 555w\" sizes=\"(max-width: 602px) 100vw, 602px\" \/><\/a><figcaption class=\"wp-element-caption\">\u0179r\u00f3d\u0142o:&nbsp;<a href=\"https:\/\/twitter.com\/simonw\/status\/627108810381889536\/photo\/2\" rel=\"nofollow\" >Twitter<\/a><\/figcaption><\/figure>\n\n\n\n<p id=\"fc9e4b02-6df0-402e-98e4-be2336538b94\">Obrazki same w sobie stanowi\u0105 niezwykle szerokie zagadnienie. Bezstratna kompresja, grafika rastrowa, wektorowa, lazy loading, r\u00f3\u017cnica pomi\u0119dzy jpg a png, r\u00f3\u017cnica pomi\u0119dzy png a webp \u2013 to zagadnienia, kt\u00f3re ka\u017cdy frontend developer powinien zrozumie\u0107 przynajmniej w podstawowym stopniu. Nie mam zamiaru w tym miejscu przedstawia\u0107 wszystkich definicji. To, co istotne z perspektywy developera, to wiedzie\u0107 jakie ma narz\u0119dzia i jak mo\u017ce zaadresowa\u0107 problem wielko\u015bci swoich grafik.<\/p>\n\n\n\n<p>Narz\u0119dziem, na kt\u00f3re powinni\u015bmy kierowa\u0107 swoj\u0105 uwag\u0119 jest CDN oraz wszystkie funkcje, jakie nam oferuje w kontek\u015bcie obrazk\u00f3w. Rozwi\u0105zania takie jak imgix, cloudflare, imagekit czy inne podobne serwisy zapewniaj\u0105 nam m.in. autmatyczne cropowanie i resizing obrazk\u00f3w. W sytuacji, kiedy mamy na stronie pare tysi\u0119cy produkt\u00f3w, ka\u017cdy produkt ma kilka zdj\u0119\u0107, a ka\u017cde zdj\u0119cie ma mie\u0107 przynajmniej 3 rozmiary, chyba ka\u017cdy rozumie, jak wiele mo\u017ce da\u0107 automatyzacja tego procesu, w zestawieniu z r\u0119cznym resizowaniem ka\u017cdego obrazka. Dodatkowo CDN powinien zapewni\u0107 nam ( przynajmniej w teorii ) szybkie dostarczenie contentu.<br>Kiedy mamy ju\u017c r\u00f3\u017cne obrazki dla r\u00f3\u017cnych rozdzielczo\u015bci, musimy jeszcze powiedzie\u0107 przegl\u0105darce, z kt\u00f3rego pliku ma skorzysta\u0107 przy danym rozmiarze okna przegl\u0105darki. Aby wiedzie\u0107, jak to zrobi\u0107, polecam zapozna\u0107 si\u0119 z dokumentacj\u0105 elementu picture \u2013&nbsp;<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Element\/picture\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Element\/picture<\/a>.<\/p>\n\n\n\n<p>Co do lazy loadu obrazk\u00f3w \u2013 wszystkim devom, kt\u00f3rzy implementuj\u0105 lazy loading za pomoc\u0105 zewn\u0119trznych bibliotek lub swoich skrypt\u00f3w polecam zapoznanie si\u0119 z atrybutem \u201eloading\u201d. Wi\u0119cej tutaj:&nbsp;<a href=\"https:\/\/web.dev\/browser-level-image-lazy-loading\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/web.dev\/browser-level-image-lazy-loading\/<\/a><\/p>\n\n\n\n<p id=\"699b9a15-9cd0-49aa-822b-c4e209cafd1d\">Kiedy jednak jeste\u015bmy zmuszeni do samodzielnej optymalizacji obrazk\u00f3w polecam m.in. poni\u017csze linki:<\/p>\n\n\n\n<p id=\"422f5f1f-4b40-476f-b08a-515839297f28\"><a href=\"https:\/\/www.smashingmagazine.com\/2019\/10\/imagekit-guide-optimizing-images-mobile\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/www.smashingmagazine.com\/2019\/10\/imagekit-guide-optimizing-images-mobile\/<\/a><br><a href=\"https:\/\/www.smashingmagazine.com\/2009\/07\/clever-png-optimization-techniques\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/www.smashingmagazine.com\/2009\/07\/clever-png-optimization-techniques\/<\/a><br><a href=\"https:\/\/www.smashingmagazine.com\/2015\/06\/efficient-image-resizing-with-imagemagick\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/www.smashingmagazine.com\/2015\/06\/efficient-image-resizing-with-imagemagick\/<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"49260934-ee69-4e4b-ae60-c1c3132431d5\">Code splitting<\/h4>\n\n\n\n<p id=\"62464b76-5e20-475d-9701-1b3d587c042f\">Code splitting, czyli podzielenie plik\u00f3w na mniejsze fragment, kt\u00f3re s\u0105 faktycznie wykorzystywane na danej podstronie. Jest to kolejny istotny element, kt\u00f3rego celem jest zmniejszenie wielko\u015bci wysy\u0142anych plik\u00f3w. Z pewno\u015bci\u0105 nie chcemy, aby na stronie listy produkt\u00f3w \u0142adowa\u0142a si\u0119 nam np. walidacja checkoutu. Jest to zadanie, kt\u00f3rego trudno\u015b\u0107 realizacji mocno zale\u017cy od wybranych narz\u0119dzi. Przyk\u0142adowo \u2013 Magento 2 ma ca\u0142\u0105 stron\u0119 po\u015bwi\u0119con\u0105 temu zagadnieniu (<a href=\"https:\/\/devdocs.magento.com\/guides\/v2.4\/frontend-dev-guide\/themes\/js-bundling.html\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/devdocs.magento.com\/guides\/v2.4\/frontend-dev-guide\/themes\/js-bundling.html<\/a>), natomiast ja osobi\u015bcie nie zauwa\u017cy\u0142em poprawy stosuj\u0105c si\u0119 do tych porad. Z ciekawostek \u2013 lighthouse w swoich podpowiedziach sugeruje, aby do code splittingu w Magento 2 u\u017cy\u0107 narz\u0119dzia \u201ebundler\u201d (<a href=\"https:\/\/github.com\/magento\/baler\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/github.com\/magento\/baler\/<\/a>). Jak widzimy w dokumentacji \u2013 jest to narz\u0119dzie w fazie Alpha, a ostatni commit jest sprzed 9 miesi\u0119cy (stan na 10.12.2020). Rozumiem w tym miejscu bezsilno\u015b\u0107 developera. Nie pozostaje mi nic innego jak wsp\u00f3\u0142czu\u0107 i poleca\u0107 podej\u015bcie headless&nbsp;\ud83d\ude42<\/p>\n\n\n\n<p id=\"34fab69c-0edb-4a1f-a3cc-f81671aa1be1\">Kiedy mamy mo\u017cliwo\u015b\u0107 wyboru narz\u0119dzi, polecam webpacka, a szczeg\u00f3lnie t\u0105 cz\u0119\u015b\u0107 jego dokumentacji:&nbsp;<a href=\"https:\/\/webpack.js.org\/guides\/code-splitting\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/webpack.js.org\/guides\/code-splitting\/<\/a>. S\u0105 tam wszystkie informacje o sposobie realizacji code splittingu oraz o potencjalnych problemach zwi\u0105zanych z duplikacj\u0105 kodu.<\/p>\n\n\n\n<p id=\"f45d2926-c0fa-4422-8a81-ea78790af0af\">Je\u015bli piszemy warstw\u0119 frontendow\u0105, kt\u00f3ra nie jest samodzieln\u0105 aplikacj\u0105, wa\u017cnym atrybutem, kt\u00f3ry mo\u017cemy doda\u0107 do naszych skrypt\u00f3w jest \u201edefer\u201d. Pozwala on nam na wykonanie skryptu w momencie, kiedy przegl\u0105darka zako\u0144czy\u0142a parsowanie strony. Wi\u0119cej o tym atrybucie tutaj:&nbsp;<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Element\/script\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Element\/script<\/a>.<\/p>\n\n\n\n<p id=\"b70fe3cf-83ea-46af-a8b4-f4c145fec494\">Javascript pozwala te\u017c na dynamiczne importy, kt\u00f3re s\u0105 przedstawione w linku do dokumentacji webpacka. Mo\u017cemy w ten spos\u00f3b \u201eod\u0142o\u017cy\u0107\u201d w czasie importowanie danego modu\u0142u do momentu, kiedy faktycznie jest u\u017cywany.<\/p>\n\n\n\n<p id=\"6abcb596-5571-4f44-a489-2279a3440f7b\">PS. NextJS obs\u0142uguje dynamiczne importy out of the box.<br>PPS. W trakcie pisania artyku\u0142u pojawi\u0142 si\u0119 nowy (narazie eksperymentalny) feature w React. S\u0105 to Server Componenty (<a href=\"https:\/\/reactjs.org\/blog\/2020\/12\/21\/data-fetching-with-react-server-components.html\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/reactjs.org\/blog\/2020\/12\/21\/data-fetching-with-react-server-components.html<\/a>). Polecam zapozna\u0107 si\u0119 z koncepcj\u0105 ze wzgl\u0119du na to, \u017ce \u2013 w du\u017cym skr\u00f3cie \u2013 ich potencjalne wdro\u017cenie (kiedy ju\u017c wyjd\u0105 z bety) pozwoli nam zmniejszy\u0107 rozmiar plik\u00f3w wysy\u0142anych do przegl\u0105darki.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Tree shaking<\/h4>\n\n\n\n<p>Potrz\u0105sanie drzewem to nic innego, jak eliminacja kodu, kt\u00f3ry nie jest u\u017cywany. Mniejsza ilo\u015b\u0107 kodu to mniejsze pliki, kt\u00f3re musi pobra\u0107 u\u017cytkownik, a mniejsze pliki to oczywi\u015bcie wi\u0119ksza szybko\u015b\u0107 \u0142adowania strony. Wi\u0119kszo\u015b\u0107 nowoczesnych narz\u0119dzi ma wbudowan\u0105 obs\u0142ug\u0119 wykrywania takiego kodu (webpack wspiera to od wersji 2), jednak warto mie\u0107 to na uwadz\u0119 w przypadku korzystania z niestandardowych rozwi\u0105za\u0144. Wa\u017cne jest te\u017c, aby pami\u0119ta\u0107 o nieu\u017cywanych importach, natomiast ten problem pomo\u017ce nam rozwi\u0105za\u0107 linter.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Design<\/h3>\n\n\n\n<p id=\"355cc5e7-8ee0-487f-ac61-342de514c460\">Na wst\u0119pie zazaczn\u0119, \u017ce absolutnie nie jestem \u017cadnym ekspertem od designu. Nie mam zamiaru pisa\u0107 o tym, co daje rozpoznawalno\u015b\u0107 danej marki czy kiedy warto wychodzi\u0107 z gridu. Rozumiem natomiast warto\u015b\u0107 designu i istotne jest, aby rozumieli go te\u017c in\u017cynierowie pracuj\u0105cy przy danym projekcie. Fundamentalnym, a zarazem cz\u0119sto pomijanym przez developer\u00f3w aspektem pracy jest zrozumienie warto\u015bci biznesowej. W tym miejscu chcia\u0142bym jedynie przytoczy\u0107 dwa badania, dotycz\u0105ce korelacji designu i przychod\u00f3w firmy.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"2eb41544-e3e8-4826-8d31-712555e6939b\">McKinsey<\/h4>\n\n\n\n<p>Badanie przeprowadzone przez firme McKinsey (<a href=\"https:\/\/www.mckinsey.com\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/www.mckinsey.com<\/a>) mia\u0142o na celu okre\u015bli\u0107 jaka by\u0142a r\u00f3\u017cnica w przychodach firm skupionych na designie oraz jak zyskali na tym ich akcjonariusze. Wykres wraz z linkiem do szczeg\u00f3\u0142owego opisu badania poni\u017cej.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/McKinsey-Modern-frontend-in-ecommerce.png\"><img decoding=\"async\" width=\"804\" height=\"845\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/McKinsey-Modern-frontend-in-ecommerce.png\" alt=\"Wykres\" class=\"wp-image-25350\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/McKinsey-Modern-frontend-in-ecommerce.png 804w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/McKinsey-Modern-frontend-in-ecommerce-285x300.png 285w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/McKinsey-Modern-frontend-in-ecommerce-768x807.png 768w\" sizes=\"(max-width: 804px) 100vw, 804px\" \/><\/a><figcaption class=\"wp-element-caption\">\u0179r\u00f3d\u0142o:&nbsp;<a href=\"https:\/\/www.mckinsey.com\/business-functions\/mckinsey-design\/our-insights\/the-business-value-of-design\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/www.mckinsey.com\/business-functions\/mckinsey-design\/our-insights\/the-business-value-of-design<\/a><\/figcaption><\/figure>\n\n\n\n<p>Firma McKinsey przedstawia sw\u00f3j research jako najbardziej obszerne i rygorystyczne w owym czasie badanie, skupione na rozpoznaniu warto\u015bci jakie niesie design. Raport dotyczy 5 letniego okresu dla 300 firm, w r\u00f3\u017cnych krajach i bran\u017cach. Tak jak pisa\u0142em na wst\u0119pie \u2013 nie jest moim celem parafrazowanie obcoj\u0119zycznego artyku\u0142u, wi\u0119c w ramach zapoznania si\u0119 z dog\u0142\u0119bn\u0105 analiz\u0105, wszystkich zainteresowanych odsy\u0142am bezpo\u015brednio do linku. Patrz\u0105c jednak na wykres wida\u0107 wyra\u017anie, \u017ce przychody firm, kt\u00f3re uznawa\u0142y design za nadrz\u0119dn\u0105 warto\u015b\u0107, ros\u0142y w zdecydowanie szybszym tempie.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">The Design Council<\/h4>\n\n\n\n<p>W 2005 roku grupa The Design&nbsp;Council (<a href=\"https:\/\/www.designcouncil.org.uk\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/www.designcouncil.org.uk\/<\/a>) przestudiowa\u0142a firmy z indeksu FTSE 100, czyli 100 najwi\u0119kszych sp\u00f3\u0142ek notowanych na gie\u0142dzie w Londynie. Z tego indeksu wybra\u0142a 61 firm dla kt\u00f3rych design by\u0142 nadrz\u0119dn\u0105 warto\u015bci\u0105 i stworzy\u0142a z nich w\u0142asny indeks. Poni\u017cej umieszczam wykres przedstawiaj\u0105cy jak w ci\u0105gu 10 lat zmienia\u0142 si\u0119 m.in. ca\u0142y indeks FTSE 100 oraz indeks firm stworzony przez The Design Council.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/The-design-council-Modern-frontend-in-ecommerce.jpg\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/The-design-council-Modern-frontend-in-ecommerce.jpg\" alt=\"Wykres\" class=\"wp-image-25352\" width=\"678\" height=\"407\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/The-design-council-Modern-frontend-in-ecommerce.jpg 800w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/The-design-council-Modern-frontend-in-ecommerce-300x180.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/The-design-council-Modern-frontend-in-ecommerce-768x462.jpg 768w\" sizes=\"(max-width: 678px) 100vw, 678px\" \/><\/a><figcaption class=\"wp-element-caption\">\u0179r\u00f3d\u0142o: <a href=\"https:\/\/www.designcouncil.org.uk\/fileadmin\/uploads\/dc\/Documents\/TheValueOfDesignFactfinder_Design_Council.pdf\" target=\"_blank\" aria-label=\"Design Council (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Design Council<\/a><\/figcaption><\/figure>\n\n\n\n<p>Na wykresie przedstawiona jest hipotetyczna sytuacja, w kt\u00f3rej inwestujemy 1000 funt\u00f3w w przedstawione indeksy. Jak wida\u0107, pieni\u0105dze zainwestowane w firmy pro-designerskie pozwoli\u0142y osi\u0105gn\u0105\u0107 ponad dwukrotnie lepsze wyniki, ni\u017c w przypadku zainwestowania tych pieni\u0119dzy w indeks FTSE 100. To, w du\u017cym skr\u00f3cie, \u015bwiadczy o tym, jak dobrze rozwija\u0142y si\u0119 te firmy na tle pozosta\u0142ych.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"5d1a8f4b-3965-444a-bb97-fabb41e2dc9d\">S\u0142\u00f3w kilka o wsp\u00f3\u0142pracy z designerami<\/h4>\n\n\n\n<p id=\"ccab9da1-47fa-4d71-8ba6-259db0a724bb\">W kontek\u015bcie pracy frontend developera niesamowicie istotne jest utrzymanie systemowo\u015bci designu. Nieko\u0144cz\u0105cy si\u0119 feedback, polegaj\u0105cy na przesuwaniu \u201epixela w prawo\u201d lub \u201eprzyciemnianiu troch\u0119 tego koloru\u201d jest zmor\u0105 dla ka\u017cdej osoby pracuj\u0105cej nad danym projektem.<\/p>\n\n\n\n<p>Skonfigurowanie odpowiedniej palety kolor\u00f3w, odst\u0119p\u00f3w, font\u00f3w oraz grida, w jakim ma by\u0107 osadzona strona, pozwoli nam znacznie zredukowa\u0107 potencjalny feedback. Dodatkowo tworzy to wsp\u00f3lny j\u0119zyk, kt\u00f3rym komunikuje si\u0119 developer z designerem. W takich okoliczno\u015bciach nie ma mo\u017cliwo\u015bci przesuni\u0119cia sekcji czy komponentu \u201ebardziej w d\u00f3\u0142\u201d. Pozostaje u\u017cycie zdefiniowanego wcze\u015bniej spacingu albo wymuszenie na designerze, by stworzy\u0142 nowy.<br>Je\u015bli chodzi o konkretne narz\u0119dzia do realizacji tej systemowo\u015bci, to jest ich ca\u0142e mn\u00f3stwo: Theme-UI, Tailwind, EmotionJS, Chakra-UI, Material-UI, BaseWeb, Primer, Styled components, Carbon, Gestalt, Spectrum, Bride, Rebass\u2026 i to jest tylko fragment listy.<\/p>\n\n\n\n<p>Osobie, kt\u00f3ra po raz pierwszy b\u0119dzie mia\u0142a za zadanie stworzenie takiego systemu proponuj\u0119 przejrzenie bibliotek Tailwind oraz Rebass. Prezentuj\u0105 one odmienne podej\u015bcia, je\u015bli chodzi o syntaktyk\u0119, natomiast realizuj\u0105 dok\u0142adnie te same za\u0142o\u017cenia. Kiedy chcemy korzysta\u0107 z Rebass\u2019a warto mie\u0107 na uwadz\u0119 potencjalne problemy z performancem, kt\u00f3re mog\u0105 pojawi\u0107 si\u0119 przy du\u017cej ilo\u015bci komponent\u00f3w na stronie lub przy wielokrotnie nadpisywanych komponentach.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"f5e3b07d-97e2-436b-b19b-e9bf26b56cf6\">Podsumowanie<\/h2>\n\n\n\n<p id=\"3cdd9ab7-d7c1-4443-9509-ff3cabe99f28\">Do pe\u0142nego wykorzystania potencja\u0142u, jaki drzemie w naszym sklepie, niezb\u0119dne jest zapewnienie klientowi nie tylko towaru, jakiego oczekuje, ale r\u00f3wnie\u017c do\u015bwiadczenia, do kt\u00f3rego b\u0119dzie chcia\u0142 wraca\u0107. Stworzenie takiego do\u015bwiadczenia spoczywa na barkach wszystkich os\u00f3b odpowiedzialnych za projekt.<br>Pragn\u0119 jeszcze raz zaznaczy\u0107, \u017ce ka\u017cdy z wymienionych powy\u017cej punkt\u00f3w jest osobnym dzia\u0142em sam w sobie. Wybrane przeze mnie zagadnienia poruszaj\u0105 mocno zaw\u0119\u017cony kontekst tych dziedzin i stanowi\u0105 subiektywne spojrzenie na potencjalne problemy. Inny developer m\u00f3g\u0142by znale\u017a\u0107 z pewno\u015bci\u0105 zupe\u0142nie inne kwestie wymagaj\u0105ce om\u00f3wienia.<br>To, co jest jednak niezaprzeczalne, to \u017ce nowoczesny frontend bez wspomnianych wy\u017cej filar\u00f3w&nbsp;ci\u0119\u017cko nazwa\u0107 pasuj\u0105cym do obecnych standard\u00f3w.<br>Niezwykle ci\u0119\u017ckim zadaniem dla pojedynczego developera jest zosta\u0107 specjalist\u0105 w ka\u017cdej z tych dziedzin. Wa\u017cne jest jednak to, aby&nbsp;<strong>ka\u017cdy<\/strong>&nbsp;developer mia\u0142 \u015bwiadomo\u015b\u0107 tego, jak bardzo istotne s\u0105 one dla naszego biznesu nawet, je\u015bli biznes sam nie do ko\u0144ca zdaje sobie z tego spraw\u0119.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;9982&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;8&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 8)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Nowoczesny frontend w e-commerce&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 8)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>W obecnych czasach, patrz\u0105c m.in. na wycen\u0119 Shopify na ameryka\u0144skiej gie\u0142dzie, czy podej\u015bcie LPP do swoich sklep\u00f3w stacjonarnych, ci\u0119\u017cko nie &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/modern-frontend-in-ecommerce\/\">Continued<\/a><\/p>\n","protected":false},"author":264,"featured_media":10160,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1316],"tags":[930,113,991],"class_list":["post-9982","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-miekko","tag-e-commerce","tag-frontend","tag-react"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/Blog_eCommerce-2.jpg","category_names":["Development na mi\u0119kko"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/9982"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/264"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=9982"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/9982\/revisions"}],"predecessor-version":[{"id":26755,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/9982\/revisions\/26755"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/10160"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=9982"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=9982"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=9982"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}