{"id":10286,"date":"2021-02-05T16:46:57","date_gmt":"2021-02-05T15:46:57","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=10286"},"modified":"2024-01-30T16:36:08","modified_gmt":"2024-01-30T15:36:08","slug":"modern-frontend-in-e-commerce","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/en\/modern-frontend-in-e-commerce\/","title":{"rendered":"Modern frontend in e-commerce"},"content":{"rendered":"\n<p>Looking at Shopify\u2019s valuation on the US stock exchange or LPP\u2019s (CEE largest retailer, employing more than 20&nbsp;000 people) approach to its stationary stores, it\u2019s hard not to notice the growing importance of e-commerce. On the Internet \u2013 just as in the real world \u2013 many factors impact our shopping experience.<\/p>\n\n\n\n<p>UX, design, and performance are the key elements which importance are crucial in both online and standard shopping. Each of these topics is so extensive it could be covered in a separate book. Such has already been written. Therefore, I will try to indicate the most important elements of each of them, within my knowledge. I do not intend to thoroughly analyse each of the raised topics, because I am neither an expert in any of these areas nor the form of the article allows for such a comprehensive study. The purpose of this article is to introduce the developer to the potential problems he or she may face in the main areas of modern e-commerce.<\/p>\n\n\n\n<p>At the beginning, I\u2019d like to discuss a buzzword that\u2019s becoming more and more talked about, especially in the context of e-commerce.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Headless e-commerce<\/h2>\n\n\n\n<p>What exactly is headless e-commerce? It is e-commerce where each layer is implemented independently of each other, and the binder of these layers is their API. From an end-user perspective, the potential difference can be perceived mainly in the performance of the application.&nbsp; However, looking at the available functionalities, headless e-commerce is no different from \u201cregular\u201d e-commerce. At this point, we can ask ourselves a question \u2013 what are the advantages of headless approach in comparison to traditional, \u201cmonolithic\u201d one?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Advantages<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">High service performance is easier to realize<\/h4>\n\n\n\n<p>When building webshops based on the \u201cback-end rules them all\u201d principle, it is much harder to achieve the high performance of an application. It happens because of, among other things, the complexity of the back-end architecture, which must also handle the front-end and the cache layer. On the back-end, we usually use additional caching tools like Varnish, Redis or Elasticsearch to keep the results of individual queries in memory.<\/p>\n\n\n\n<p>Using headless approach, we can easily generate any subpage as a static one, which view is not dependent on user status (logged in\/guest). Static page makes user wait only for \u201cclean\u201d HTML and CSS to load. For e-commerce, this approach works mainly because in this domain the main significant difference for users is the content of their shopping cart. From an UX perspective, there is no need to download shopping cart along with the content of the entire site \u2013 it can be downloaded dynamically after the user enters the website. That is why static pages are the best solution for e-commerce.<\/p>\n\n\n\n<p id=\"107881c0-077d-4680-8b86-da717a961d54\">At this point, a question about cache invalidation may come up. After all, static pages will not update. Here is another good news for those concerned. Modern front-end frameworks such as NextJS or Remix use the &nbsp;SWR (StaleWhileRevalidate) pattern. In a nutshell, it means that cache invalidation takes place \u201cunderneath\u201d, after a time interval we specify. In the meantime, users get the version of the page saved in the cache. This solution also allows us to resign from Varnish, which simplifies our system and relieves the back-end developers.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Smaller scope of technologies required from a single developer<\/h4>\n\n\n\n<p>f the service we are writing is based on a back-end that also renders the front-end, it is practically impossible for a front-end developer not to know the technologies used on the back-end. For example \u2013 when writing the front-end layer in Magento 2, we need to know the structure of the xml file required by Magento, we need to know what entries to add to each xml file and where to place them. In places where in JavaScript we would like to use data passed directly from the back-end, we are forced to understand the entire MVC structure behind Magento. Of course, behind all this comes the necessity of the knowledge of PHP. And this additional overhead absolutely does not compensate for the required front-end knowledge.<\/p>\n\n\n\n<p>With the headless approach, front-end developer only needs to know the front-end technology. That\u2019s it.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Greater flexibility in the choice of technology<\/h4>\n\n\n\n<p>When working on a headless site (whether it is e-commerce or not), we have more freedom over the choice of tools to accomplish the task, whether it is front-end or back-end. The only thing that binds the two layers together is the structure and the way (SOAP, REST, GraphQL) data is transmitted. Looking at the architecture as a whole, back-end is its foundation. From a front-end developer\u2019s perspective, in headless approach, the back-end is an implementation detail. In this case, you can easily replace the technology anywhere or add a new microservice based on a completely different language or framework.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Ability to develop individual layers independently of each other<\/h4>\n\n\n\n<p>Because of the flexibility that headless e-commerce gives us, none of the layers are blocked by another. You can easily implement deployments of individual layers, completely independent of each other. This also allows us to easier iterate design changes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Disadvantages<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">The need to integrate additional tools<\/h4>\n\n\n\n<p>In complex systems, we can expect a lot of built-in functionality, such as i.e. analytics or CMS. Of course, this is the cost that has to be borne in case of their implementation in the headless approach. At this point, you have to answer the questions: if the tools available in the \u201cmonolith\u201d are needed, if they are sufficient, if the development will be fast enough and what kind of developers we have at our disposal.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Summary<\/h3>\n\n\n\n<p>The differences I have mentioned are the ones that are easiest to indicate. As for the difference in costs, for example, this is hard to estimate. Costs consist of both the size of the team and the time they spend on the project. The size of the team in a headless approach can be exactly the same as in a traditional approach. As for the lead time \u2013 theoretically, it can also be the same in both cases. In practice, however, I noticed that the headless approach sped up development significantly. This was mainly due to smaller overhead caused by the need for back-end knowledge.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Three pillars of modern front-end<\/h2>\n\n\n\n<p>It\u2019s time to discuss topics that in my opinion should be addressed when creating a front-end layer. The scope of each of them goes far beyond e-commerce as well as front-end. Below I will try to discuss these points in the context of creating an online shop<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. UX<\/h3>\n\n\n\n<p>UX stands for user experience, or what the user experiences \u2013 in this case in our online shop. UX in itself is a broad topic, far beyond e-commerce, but in e-commerce itself, it is an essential element for a high conversion rate.<\/p>\n\n\n\n<p id=\"747f8335-feb1-4374-9328-397346cff9a3\">Non-responsive design, complicated navigation, impractical positioning of icons, lack of default and widely used keyboard shortcuts (e.g. ESC key to disable a modal), screen \u201cfreeze\u201d when loading particular actions, menu, which takes up practically the whole page when hovered over, so it is impossible to \u201cunhover\u201d it, no possibility to return to the same place on the list of products after entering a single product \u2013 these are just some of the UX sins, of which at least one can be found in every online shop.<\/p>\n\n\n\n<p id=\"9bf53a97-ad6f-420e-8241-9ae695ac3778\">While in most cases, one or two errors do not cause a disaster, their accumulation can be critical. In extreme cases, it can lead to an increase of up to 73% in the number of users leaving our website (<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\">Filtering on product listing<\/h4>\n\n\n\n<p>Filtering on the product listing is one of the critical points of our application. The last thing we want to show the user is a screen without any product. Of course, UX in this case has to be just as good on desktop as on mobile screens<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Poor<\/strong><\/li>\n<\/ul>\n\n\n\n<p>The following example of a clothes shop can be used as an example of poor UX when filtering products.<\/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>First of all, there is no possibility to select several values of the same type. We do not have the option to display products in grey or green at the same time. There is also no information about the number of products. As a result, when choosing orange tops in size XS to wear outdoors, we get such a screen:<\/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=\"Screen 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>Choosing the \u201cNew Arrivals for men\u201d screen is actually entering new products with the \u201cmen\u201d option selected. As the filters are not dependent on each other, in New Arrivals we have the option to filter by \u201cbras\u201d. The number of filters is really small. For example, there is not even the most basic price filter. In addition, sorting by price can only be done in ascending order. On the plus side (?) the fact that due to the speed of operation (and lack of possibility to select several options from the same type of filter), it does not bother so much that the products reload immediately after selecting an option. In the case when we would like to select several options and after selecting each one we would have to wait a few seconds, surely many users would leave the site during the filtering process.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>A little bit better<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Another representative of the clothing industry looks a little bit better.<\/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>However, this shop has not been spared a few mistakes either. First of all, when we present the price filter, it is good to fill in the upper and lower range right away. It would be advisable to validate these numbers because we can enter such a high lower price or such a low upper price that we get a screen without any products.<\/p>\n\n\n\n<p>A screen without a single product is generally a problematic element in this shop. We have too many options that lead us to it. For example, in the men\u2019s jumper category we can select size M and the feature \u201cwith hood\u201d which ends up with no results:<\/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=\"View of the lack of products in the Reserved online store\" 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>There are, of course, many more such combinations. Another disadvantage is the fact that after selecting filters, user is nowhere presented with information about the options selected. To find out, a user has to click on a given filter and go through all the options to see the selected ones.<\/p>\n\n\n\n<p>Overall, product filtering performs better than its predecessor. The available options are narrowed down to the context in which we find ourselves. We can also choose several options from one type of filter. However, there is no information about the number of products in a given filter. And that miserable screen without any products\u2026<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Much better<\/strong><\/li>\n<\/ul>\n\n\n\n<p>When it comes to filtering products, the following shop, also from the clothing sector, looks the best.<\/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>Next to each option, we can see the number of products that it contains. After selecting a value we can easily remove it. The filters are also dynamic, i.e. if we select white colour and there is no product in size L, we will not be able to select this size. This automatically removes the case of a blank screen. We have a lot of filters available, but at the beginning of the process, user only gets the most important ones. This is also a very reasonable solution.<\/p>\n\n\n\n<p>On the minus side, we can write down the lack of a price filter. And this is despite a large number of available filters. The second nuance to improve is the fact of screen \u201cfreezing\u201d, which occurs when selecting an option. In case of a slower response from the back-end, this may result in user frustration.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Purchase process<\/h4>\n\n\n\n<p>A purchase process is also extremely important if you care about high conversions. Almost 70% of users abandon this process just right after the products are added to their basket (https:\/\/baymard.com\/lists\/cart-abandonment-rate). Please think about this number for a moment. Almost 3\/4 of users do not complete the purchase AFTER selecting the products! This is of course an average value that depends on many factors. However, it does not change the fact that checkout can be a critical place in our application.<\/p>\n\n\n\n<p>The important thing about the checkout is to create a context in which the user is as focused as possible on the payment process. We do not want to distract him by showing a menu with categories, product search engine, ads or popups with a newsletter. It is also worth considering whether a chat with customer service is necessary here. The last thing we want when completing a purchase is for the customer to be half-focused on something else.<\/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>The form of a Swedish furniture shop is a good example of these practices. The customer on this site is clearly guided through the steps. There are also no special distractions on the site \u2013 only a chat with customer service remains.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>The shorter process, the better<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Research also shows a correlation between the number of steps required to go through checkout and the number of dropouts (<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>). It is therefore worth minimizing the number of clicks needed to get through the process.<\/p>\n\n\n\n<p>At this point, Google\u2019s payment service should be mentioned. Integration with Google Pay allows our users to reduce the number of checkout steps as much as possible. When we have connected a bank card to the Google account, and we also have the address saved there, the form looks like below:<\/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>Source: <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\">Undoubtedly, it is hard to find even shorter process than just 2 clicks, with no additional fields to fill in.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Other issues on checkout<\/strong><\/li>\n<\/ul>\n\n\n\n<p>For those interested in other common mistakes in the purchase process, I recommend checking out this report: <a href=\"https:\/\/baymard.com\/blog\/current-state-of-checkout-ux\" target=\"_blank\" aria-label=\"https:\/\/baymard.com\/blog\/current-state-of-checkout-ux (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\">Optimistic UI<\/h4>\n\n\n\n<p id=\"d304f82e-b49d-4b51-8e77-8657a22a7252\">Optimistic UI is an interface update that immediately shows the user positive result of the action performed. Below is a comparison of the standard behaviour and optimistic UI.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Standard behaviour<\/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><strong>Optimistic behaviour<\/strong><\/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>It is important to understand that the response from the server in both cases may take the same amount of time. However, an optimistic update ensures that the user does not have to wait for anything. It also allows us to reduce the number of potential loaders on the page. Of course, as usual, \u201cwith great power comes great responsibility\u201d. We must remember to take care of all possible scenarios. For example, what if a user adds a product to the basket and changes the page before an error response is received from the server? How do we generally handle an error response? Additionally \u2013 optimistic update should not be implemented in every place, where the action called by the user requires a response from the back-end. For example, in a situation when we fill out the address form on the checkout and move on to the payment selection, it does not make sense to assume in advance that the address form was filled out correctly. This would force us into a twisted validation and complicated form flow.<\/p>\n\n\n\n<p>Optimistic UI requires the developer to skilfully plan the structure of the local state and all the transitions that may occur in it. In the context of e-commerce, I recommend the xState library.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Performance<\/h3>\n\n\n\n<p>High performance is an indispensable element of any modern web application. Just like UX, it affects the revenue we gain from our shop. Performance is actually an element of UX, because how quickly individual pages load affects user perception.<\/p>\n\n\n\n<p>The question is how important performance is. Based only on the hints from Lighthouse we can find out, among other things, that:<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"1\" id=\"20459c6f-b777-4a43-a950-590aa5f2450d\">\n<li>Walmart saw a 1% increase in revenue for every 100ms improvement in page load<\/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>The same information I also found in relation to Amazon:&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>Rebuilding Pinterest pages for performance increased conversion rates by 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>If a site takes &gt;1 second to become interactive, users lose attention, and their perception of completing the page task is broken<\/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>These facts are clear evidence that a slow page load is bound to make less money than a faster one.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"e1aa6612-b41e-4dd9-ab33-2a74b6d66cb0\">How to measure performance?<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Lighthouse.<\/strong><\/li>\n<\/ul>\n\n\n\n<p>This tool, its metrics, and all the tips that are available we should know inside out. For applications using React, there is a console add-on that allows us to check the rendering time of each component. We can also check an option that causes the component to be highlighted when it renders (or rerenders).<\/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 and performance<\/h4>\n\n\n\n<p id=\"58335f99-f353-474d-8b3a-e6f99f1cf0fa\">As I\u2019ve mentioned when describing advantages of headless e-commerce \u2013 a very important advantage of current front-end tools is the ability to generate our application to static pages. For demonstration purposes, I\u2019m adding below out of the box performance of product listing page that was created using NextJS and Tailwind libraries, with Shopify in the back-end.<\/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\">This is certainly a satisfactory result, especially considering that no special optimization tasks were performed to obtain it. I understand potential doubts as to whether the result is not fraudulent. I invite inquisitive readers to visit the website <a href=\"https:\/\/demo.vercel.store\/\" target=\"_blank\" aria-label=\"https:\/\/demo.vercel.store\/ (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/demo.vercel.store\/<\/a>, on the basis of which the page on the above screen was created. It is also worth noting that because of the static page, back-end does not play any role in the performance. This can be seen especially after entering the above demo, where BigCommerce is used as the back-end. In addition, the page generated this way can be posted on a CDN, which will help us further increase the speed load.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"2ac480d0-28d2-430c-aff0-47a2f12ca0aa\">Images<\/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>Nowadays, images are by far the \u201cheaviest\u201d content on our websites.<\/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\">Source:&nbsp;<a href=\"https:\/\/twitter.com\/simonw\/status\/627108810381889536\/photo\/2\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Twitter<\/a><\/figcaption><\/figure>\n\n\n\n<p>Images themselves are an extremely broad topic. Lossless compression, raster graphics, vector graphics, lazy loading, the difference between JPG and PNG, the difference between PNG and WebP \u2013 these are topics that every front-end developer should understand at least at a basic level. I am not going to present all definitions here. What is important from a developer\u2019s perspective is to know what tools he\/she has and how to address the issue of the size of their graphics.<\/p>\n\n\n\n<p>We should focus our attention on CDN tool and all the functions it offers us in the context of images. Solutions such as imgix, cloudflare, imagekit or other similar services provide us with, among other things, automatic cropping and resizing of images. In a situation where we have a few thousand products on the website, each product has a few pictures, and each picture has to be at least in 3 sizes, probably everyone understands how much automation of this process can give, in comparison with manual resizing of each picture. Additionally, the CDN should ensure (at least in theory) fast delivery of content.<\/p>\n\n\n\n<p>When we already have different images for different resolutions, we still have to inform browser which file to use for a given size of the browser window. To know how to do that, I recommend reading the documentation of the picture element \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>Regarding lazy loading images, I recommend all developers who implement lazy loading with external libraries or their own scripts to get familiar with the \u201cloading\u201d attribute. More here:&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>However, when we are forced to optimize images on our own, I recommend, among others, the following links:<\/p>\n\n\n\n<p><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>Code splitting in other words it\u2019s dividing files into smaller fragments, which are actually used on a given subpage. This is another important element that aims to reduce the size of uploaded files. Certainly, we do not want e.g. checkout validation to load on the product listing page. This is a task which implementation difficulty strongly depends on the selected tools. For example \u2013 Magento 2 has a whole page dedicated to this issue (<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>), while I personally did not notice any improvement by following this advice. Interesting fact \u2013 Lighthouse in its tips suggests using \u201cbundler\u201d tool for code splitting in Magento 2 (<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>). As we can see in the documentation \u2013 this tool is in Alpha phase and the last commit is from 9 months ago (as of 10.12.2020). I understand at this point the powerlessness of the developer. I can\u2019t help but sympathize and recommend the headless approach.<\/p>\n\n\n\n<p>When we have a possibility to choose tools, I recommend webpack, and especially this part of its documentation:&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>. There is all the information about how to implement code splitting and about potential problems related to code duplication.<\/p>\n\n\n\n<p>If we are writing a front-end layer that is not a standalone application, an important attribute that we can add to our scripts is \u201cdefer\u201d. It allows us to execute the script when the browser has finished parsing the page. More about this attribute here:&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>Javascript also allows dynamic imports, which are shown in the link to webpack documentation. This way we can \u201cdefer\u201d importing a particular module until it is actually used.<\/p>\n\n\n\n<p>PS. NextJS supports dynamic imports out of the box.<\/p>\n\n\n\n<p>PPS. While writing this article, a new (yet experimental) feature has appeared in React. These are Server Components (<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>). I recommend getting acquainted with the concept due to the fact that \u2013 in a nutshell \u2013 their potential implementation (once they come out of beta) will allow us to reduce the size of files sent to the browser.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Tree shaking<\/h4>\n\n\n\n<p>Tree shaking is nothing more than eliminating code that is not used. Less code means smaller files the user has to download, and smaller files mean faster page load speed, of course. Most modern tools have built-in support for detecting such code (webpack has supported this since version 2), but it is worth bearing this in mind when using custom solutions. It is also important to remember about unused imports, while linter will help us solve this problem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Design<\/h3>\n\n\n\n<p id=\"355cc5e7-8ee0-487f-ac61-342de514c460\">Let me start by saying that I am absolutely not a design expert. I am not going to write about what gives brand recognition or when it is worth going off the grid. But I do understand the value of design, and it is important that the engineers working on the project also understand it. Fundamental and yet often overlooked aspect of developers\u2019 work is understanding the business value. At this point, I would just like to cite two studies on the correlation between design and company revenue.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"2eb41544-e3e8-4826-8d31-712555e6939b\">McKinsey<\/h4>\n\n\n\n<p>A study by 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>) aimed to determine what was the difference in revenues of companies that focused on design and how their shareholders benefited. Chart with link to a detailed description of the study below.<\/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=\"Chart\" 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\">Source:&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>McKinsey presents its research as the most comprehensive and rigorous study at the time, focused on identifying the value of design. The report covers a 5-year period for 300 companies, in various countries and industries. As I wrote in the introduction \u2013 it is not my purpose to paraphrase a foreign-language article, so for an in-depth analysis, I refer all interested parties directly to the link. Looking at the graph, however, it is clear that the revenues of companies that considered design to be an overriding value grew at a much faster rate.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">The Design Council<\/h4>\n\n\n\n<p>In 2005, a group called The Design Council (<a href=\"https:\/\/www.designcouncil.org.uk\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >https:\/\/www.designcouncil.org.uk\/<\/a>) studied companies from the FTSE 100&nbsp;\u2013 the 100 largest companies listed on the London Stock Exchange. From this index, they selected 61 companies for which design was an overriding value and created their own index. Below is a graph showing how the entire FTSE 100 index and the index of companies created by The Design Council have changed over 10 years.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/The-design-council-Modern-frontend-in-ecommerce.jpg\"><img decoding=\"async\" width=\"800\" height=\"481\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/The-design-council-Modern-frontend-in-ecommerce.jpg\" alt=\"Chart\" class=\"wp-image-25352\" 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: 800px) 100vw, 800px\" \/><\/a><figcaption class=\"wp-element-caption\">Source: <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>The chart shows a hypothetical situation where we invest \u00a31,000 in the indexes shown. As you can see, the money invested in the pro-design companies has allowed them to perform more than twice as well as if that money had been invested in the FTSE 100 Index. This, in a nutshell, shows how well these companies have performed compared to the others.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"5d1a8f4b-3965-444a-bb97-fabb41e2dc9d\">Few words about cooperation with designers<\/h4>\n\n\n\n<p>In the context of a front-end developer\u2019s work, it is incredibly important to maintain systematic design. Endless feedback, consisting in moving \u201ca pixel to the right\u201d or \u201cdarkening this colour a bit\u201d is a nightmare for every person working on a given project.<\/p>\n\n\n\n<p>Configuring the right colour palette, spacing, fonts, and grid will allow us to significantly reduce potential feedback. Additionally, it creates a common language, which the developer communicates with the designer. In such circumstances, it is not possible to move a section or component \u201cfurther down\u201d. What remains is to use a predefined spacing or force the designer to create a new one.<\/p>\n\n\n\n<p>When it comes to specific tools to implement this structure, there are plenty of them: Theme-UI, Tailwind, EmotionJS, Chakra-UI, Material-UI, BaseWeb, Primer, Styled components, Carbon, Gestalt, Spectrum, Bride, Rebass\u2026 and this is just a fragment of the list.<\/p>\n\n\n\n<p>For a person who will have to create such a system for the first time, I suggest reviewing the Tailwind and Rebass libraries. They present different approaches when it comes to syntax, but they implement exactly the same assumptions. When we want to use Rebass, it\u2019s worth taking into account potential problems with performance, which may appear with a large number of components on the page or with repeatedly overwritten components.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"f5e3b07d-97e2-436b-b19b-e9bf26b56cf6\">Summary<\/h2>\n\n\n\n<p>To realize the full potential of our shop, it\u2019s essential to provide a customer with not only the merchandise they expect but also an experience they would want to return to. Creating such an experience rests on the shoulders of all those responsible for the project.<\/p>\n\n\n\n<p>Let me reiterate that each of the above points is a separate section in itself. Topics I\u2019ve chosen address a very narrow context of these areas and represent a subjective view of potential problems. Another developer could certainly find completely different subjects to discuss. What is undeniable, however, is that a modern front-end without the pillars mentioned above can hardly be called meeting current standards.&nbsp;It is an extremely hard task for a single developer to become a specialist in each of these areas. However, it is important for&nbsp;<strong>every<\/strong>&nbsp;developer to be aware of how crucial they are to our business even if the business itself is not fully aware of it.<\/p>\n\n\n\n<p>Translated by Karolina Ko\u0142yszko, Analyst working at Sii.<\/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;10286&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;6&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: 6)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Modern frontend in 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: 6)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Looking at Shopify\u2019s valuation on the US stock exchange or LPP\u2019s (CEE largest retailer, employing more than 20&nbsp;000 people) approach &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/en\/modern-frontend-in-e-commerce\/\">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":[1319],"tags":[1353,1420],"class_list":["post-10286","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-soft-development","tag-e-commerce-en","tag-frontend-en"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/Blog_eCommerce-2.jpg","category_names":["Soft development"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/10286"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/users\/264"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/comments?post=10286"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/10286\/revisions"}],"predecessor-version":[{"id":26754,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/10286\/revisions\/26754"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/media\/10160"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/media?parent=10286"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/categories?post=10286"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/tags?post=10286"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}