{"id":33747,"date":"2026-05-08T05:00:00","date_gmt":"2026-05-08T03:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=33747"},"modified":"2026-05-07T11:11:39","modified_gmt":"2026-05-07T09:11:39","slug":"blazing-fast-websites-and-how-adobe-experience-manager-can-help-achieve-that","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/en\/blazing-fast-websites-and-how-adobe-experience-manager-can-help-achieve-that\/","title":{"rendered":"Blazing fast websites and how Adobe Experience Manager can help achieve that"},"content":{"rendered":"\n<p>Nowadays, there are many ways to serve websites \u2013 from manually creating HTML pages (or, increasingly, generating them with AI), through static site generators and headless setups, to more structured and specialized portals and full-featured CMS (Content Management Systems).<\/p>\n\n\n\n<p>All of them are expected to deliver content quickly, reliably, and securely.<\/p>\n\n\n\n<p>Website performance is not just a technical concern \u2013 it directly impacts:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>user experience,<\/li>\n\n\n\n<li>accessibility,<\/li>\n\n\n\n<li>search engine rankings,<\/li>\n\n\n\n<li>conversions,<\/li>\n\n\n\n<li>and business outcomes.<\/li>\n<\/ul>\n\n\n\n<p>Studies consistently show that users expect pages to load within a few seconds, and each additional second of delay increases bounce rates significantly. Google has made page speed a ranking factor, meaning faster websites gain visibility while slower ones get buried in search results.<\/p>\n\n\n\n<p>This article covers practical techniques to achieve blazing-fast websites:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>from caching strategies that handle the majority of requests,<\/li>\n\n\n\n<li>through asset optimization that reduces file sizes,<\/li>\n\n\n\n<li>to networking improvements and Core Web Vitals optimization.<\/li>\n<\/ul>\n\n\n\n<p>Where applicable, Adobe Experience Manager (AEM) features that support these optimizations are highlighted.<\/p>\n\n\n\n<p>In times of excessively long articles generated by AI, which, ironically, often need to be summarized by AI just to read, I&#8217;ll try to avoid unnecessary complexity and decoration by keeping the content concise.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Cache<\/strong><\/h2>\n\n\n\n<p>Typically, developers of backend applications focus on code performance and page generation time, but in reality, the most important aspect for improving web performance is caching. If a request can be served from cache, the backend code path often does not matter. Make sure that generated responses are properly cached and don&#8217;t have to be recreated or always served from the &#8220;bottom&#8221; source. When set up correctly, it should handle 80% to 95% of all public traffic, although personalized and authenticated content naturally reduces the cacheable surface area.<\/p>\n\n\n\n<p>Think in layers:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>browser cache,<\/li>\n\n\n\n<li>CDN or reverse proxy cache,<\/li>\n\n\n\n<li>web-server cache layer,<\/li>\n\n\n\n<li>application output cache, where applicable.<\/li>\n<\/ul>\n\n\n\n<p>For AEM as a Cloud Service, traffic commonly passes through a CDN and Dispatcher before reaching publish instances.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Cache Store<\/strong><\/h3>\n\n\n\n<p>Static content can be stored in a cache store. Most web servers, like Nginx or Apache, and load balancers, like HAProxy, which are typically placed in front of your backend, have their own mechanisms to cache files locally, but must be carefully configured to match your backend exactly.<\/p>\n\n\n\n<p>AEM provides its own Apache module for connectivity handling to AEM instances and a set of rules for managing the cache of static content properly (HTMLs, ClientLibs, assets, etc.). Another potential caching layer could be a Content Delivery Network, which is described in the Networking section.<\/p>\n\n\n\n<p>The important part is not only having a cache, but matching cache behavior to content behavior:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>cache public assets aggressively,<\/li>\n\n\n\n<li>cache public HTML when business rules allow it,<\/li>\n\n\n\n<li>never cache personalized responses in shared layers,<\/li>\n\n\n\n<li>avoid unnecessary cache fragmentation caused by query parameters or over-broad Vary headers.<\/li>\n<\/ul>\n\n\n\n<p>If your cache key changes for reasons that do not change the response, your hit ratio drops, and your origin does extra work for no user-facing benefit.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Cache-Control header<\/strong><\/h3>\n\n\n\n<p>One of the most important ways to describe caching properties is the Cache-Control header in HTTP responses for a specific URL. There are important but often overlooked and misunderstood options that indicate the nature of the response, worth considering for every response type:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>public<\/code><\/strong> \u2013 may be cached in every layer of the shared cache, such as public static HTMLs and assets (images, videos, documents),<\/li>\n\n\n\n<li><strong><code>private<\/code><\/strong> \u2013 user-personalized content and MUST NOT be cached between the backend and the user&#8217;s browser, but CAN be cached in the browser,<\/li>\n\n\n\n<li><strong><code>immutable<\/code><\/strong> \u2013 content will not be changed, perfect for files or documents that are versioned in the filename or JavaScript modules with a content hash in the filename,<\/li>\n\n\n\n<li><strong><code>no-cache<\/code><\/strong> vs <strong><code>no-store<\/code><\/strong> \u2013 often misleading: no-cache means the response CAN be cached (stored) in the browser but requires revalidation, while no-store forbids caching entirely, so it&#8217;s much better for sensitive content (personal data),<\/li>\n\n\n\n<li><strong><code>max-age<\/code><\/strong> \u2013 browser freshness lifetime,<\/li>\n\n\n\n<li><strong><code>s-maxage<\/code> <\/strong>\u2013 shared-cache freshness lifetime; useful when CDN and browser TTLs should differ,<\/li>\n\n\n\n<li><strong>s<code>tale-while-revalidate<\/code><\/strong> \u2013 allows caches to serve a stale response while refreshing it in the background,<\/li>\n\n\n\n<li><strong><code>stale-if-error<\/code><\/strong> \u2013 allows stale content to be used when the origin fails.<\/li>\n<\/ul>\n\n\n\n<p>Typical patterns are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>public, max-age=31536000, immutable <\/code>for hashed assets,<\/li>\n\n\n\n<li><code>public, max-age=300, stale-while-revalidate=3600<\/code> for frequently updated HTML,<\/li>\n\n\n\n<li><code>private, no-cache<\/code> for personalized pages,<\/li>\n\n\n\n<li><code>no-store<\/code> for highly sensitive responses.<\/li>\n<\/ul>\n\n\n\n<p>By properly configuring Cache-Control, you can fully control what can. You cannot be cached, ensuring not only that website files are served quickly but also that an improperly configured cache does not cause accidental data leaks. In AEM environments, it is often useful to control browser and edge caching independently. If your CDN supports surrogate cache headers, use them deliberately instead of forcing the same TTL everywhere.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Optimizing assets<\/strong><\/h2>\n\n\n\n<p>Modern websites are full of images, photos, and videos. Such files are heavy, often several megabytes each. Nowadays, web browsers are evolving rapidly and, with automatic updates, most users are up to date. Thanks to new protocols and file formats now supported by modern browsers, it is possible to deliver smaller assets faster. It is not just about reducing file sizes, but also about reducing critical-path bytes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Images\/photos<\/h3>\n\n\n\n<p>Instead of serving a single source image or photo, prepare or generate an image or photo on request in multiple resolutions, better suited to different devices and viewports.<\/p>\n\n\n\n<p>AEM Assets automatically resizes the source on upload to prepare multiple resolutions (called &#8220;renditions&#8221;). The <code>srcset<\/code> attribute of the &lt;<code>img<\/code>> and &lt;<code>source<\/code>> tags allows you to specify multiple resolution variants (renditions). In contrast, the sizes attribute defines the ratio of the visible image on the page to the viewport size, and the browser itself will optimize which rendition to use.<\/p>\n\n\n\n<p>Use the &lt;<code>picture<\/code>> tag with multiple &lt;<code>source<\/code>> tags to define different images for various viewports &#8211; especially useful to provide different images for portrait and landscape orientations or different formats.<\/p>\n\n\n\n<p>You don&#8217;t have to stick with the JPEG format to serve images anymore. Use SVG for icons, logos, and diagrams. For raster images, WebP is a strong default, and AVIF is increasingly viable, while JPEG and PNG still serve as practical fallbacks. WebP can reduce a photo&#8217;s size by about 30% compared to JPEG, and switching to AVIF can often provide an additional reduction.<\/p>\n\n\n\n<p>AVIF now has roughly 95% global browser support, but fallback markup is still the safer default than assuming a single format will work everywhere. AEM as a Cloud Service supports web-optimized WebP renditions.<\/p>\n\n\n\n<p>Changing the image file format might not be possible for existing applications. Still, it should be possible to optimize existing PNG files and re-encode existing JPEG files with stronger compression while preserving high visual quality.<\/p>\n\n\n\n<p>Consider which images are crucial. Always provide explicit width and height so the browser can reserve space and reduce layout shift. Use <code>loading=\"lazy\"<\/code> for non-critical images, but do not lazy-load the likely LCP image. For the most important image, consider <code>fetchpriority=\"high<\/code>&#8221; and preload it if the browser would otherwise discover it late.<\/p>\n\n\n\n<p>AEM Image Core Component supports renditions, lazy loading, alternate text (for screen readers), linking, and more. Verify that it emits stable dimensions and responsive markup, and that page templates do not lazy-load the hero image.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;uploadedSrc&quot;:&quot;https:\\\/\\\/sii.pl\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/image1.png&quot;,&quot;figureClassNames&quot;:&quot;wp-block-image aligncenter size-large&quot;,&quot;figureStyles&quot;:null,&quot;imgClassNames&quot;:&quot;wp-image-33738&quot;,&quot;imgStyles&quot;:null,&quot;targetWidth&quot;:1100,&quot;targetHeight&quot;:1100,&quot;scaleAttr&quot;:false,&quot;ariaLabel&quot;:&quot;Enlarge image: Comparison of AVIF, WebP, and JPEG images(Girls Shred Sessions by QParks\\\/CC BY. Thumbnails generated on Vimeo)&quot;,&quot;alt&quot;:&quot;Comparison of AVIF, WebP, and JPEG images(Girls Shred Sessions by QParks\\\/CC BY. Thumbnails generated on Vimeo)&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image aligncenter size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"1024\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/05\/image1-1024x1024.png\" alt=\"Comparison of AVIF, WebP, and JPEG images(Girls Shred Sessions by QParks\/CC BY. Thumbnails generated on Vimeo)\" class=\"wp-image-33738\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/05\/image1-1024x1024.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/05\/image1-300x300.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/05\/image1-150x150.png 150w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/05\/image1-768x768.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/05\/image1.png 1100w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge image: Comparison of AVIF, WebP, and JPEG images(Girls Shred Sessions by QParks\/CC BY. Thumbnails generated on Vimeo)\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"context.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"context.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Fig. 1 Comparison of AVIF, WebP, and JPEG images (Girls Shred Sessions by QParks\/CC BY. Thumbnails generated on Vimeo)<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Videos<\/h3>\n\n\n\n<p>To serve video, H.264 (typically in MP4) was the common web baseline for years. VP9 can significantly reduce bitrate compared to H.264, AV1 can reduce it further, and HEVC\/H.265 can also be useful, especially in Apple-heavy environments. But browser support, licensing, hardware decode support, and power consumption all matter, so the practical answer is rarely to pick one &#8220;best&#8221; codec for every case.<\/p>\n\n\n\n<p>Similarly to images, changing the video file format might not be possible for existing applications, and the source video project is no longer available. But it might be worth trying to re-encode videos even with the same codec, enabling two-pass processing and fast-start\/moov atom placement (if supported), using a slower preset, and choosing the latest software encoder over hardware-accelerated. Such re-encoding can take a long time and degrade some quality, but as long as it is visually indistinguishable and the result file is significantly smaller while being more optimized for the web, it might be worth replacing the previous file.<\/p>\n\n\n\n<p>For important video experiences, adaptive streaming and multiple &lt;<code>source<\/code>> variants may be a better choice than a single downloadable file. Use a poster image, set <code>preload=\"metadata\" or preload=\"none\" <\/code>for non-critical videos, and keep background videos short, optional, and muted.<\/p>\n\n\n\n<p>To maintain the best quality, it is worth rendering directly from the source video project to a better codec in video editing software rather than recompressing the final video, so consider rendering all newer video materials directly to VP9 or AV1 codecs before uploading to DAM. For AEM DAM workflows, keep a high-quality mezzanine source, but publish web-delivery renditions rather than raw masters.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Advanced Frontend techniques<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Background processing<\/strong><\/h3>\n\n\n\n<p>Offload heavy JavaScript tasks to Web Workers for parallel execution, preventing the main thread from blocking. There&#8217;s also enhanced support for shared memory (<code>via SharedArrayBuffer<\/code>) that allows efficient data sharing between workers and the main thread, but only in a secure cross-origin-isolated context, typically requiring <code>Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy<\/code> headers.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>WebAssembly (WASM)<\/strong><\/h3>\n\n\n\n<p>Compile performance-critical code to WASM or use existing distributable libraries for near-native speeds in the browser. Ideal for compute-intensive tasks like image processing or games, potentially achieving significant speedups (often 2-10x or more) for compute-intensive operations. It is useful for compute-heavy workloads, not as a default performance trick when the real bottleneck is network delay, render blocking, or too much DOM work.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Cache API<\/strong><\/h3>\n\n\n\n<p>Web browsers&#8217; Cache API can store JavaScript-triggered Request -> Response objects directly in the browser&#8217;s cache storage. It can store any files, including JSON data and images. It does not require a service worker. Be careful not to create a second caching system that conflicts with the browser and CDN caches. Cache invalidation is still the hard part.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Widoczno\u015b\u0107 tre\u015bci i rozmiar wewn\u0119trzny<\/strong><\/h3>\n\n\n\n<p>Use CSS <code>content-visibility<\/code>: Auto to let the browser skip layout and paint work for offscreen elements. Pair with <code>contain-intrinsic-size<\/code> to avoid layout shifts (CLS). It is especially useful for long pages with repeated, self-contained sections, but test carefully because performance improvements are only valuable if they do not break accessibility or measurement.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Network<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Content Delivery Network<\/strong><\/h3>\n\n\n\n<p>Typical rule: Be as close as possible to your web visitors. Choosing the right hosting or cloud provider and scaling up servers might yield some gains at a high cost. But the truth is that without a CDN, it is quite hard to be highly available globally when servers are in a single data center. In such cases, properly cached content in a Content Delivery Network distributed across the globe will give the largest speedup.<\/p>\n\n\n\n<p>Treat CDN and Dispatcher or reverse-proxy behavior as one system, not two unrelated boxes. Strip or ignore marketing parameters that do not change content, be intentional about<code> Vary<\/code>, and use stale-serving directives when your platform supports them.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>HTTP\/2<\/strong><\/h3>\n\n\n\n<p>Turn on HTTP\/2 (and HTTP\/3 if possible) at least at the top of your backend stack (preferably with cache enabled). As most websites serve many files, multiplexing will greatly speed up transfers, but fewer requests are no longer automatically better.<\/p>\n\n\n\n<p>Avoid both unnecessary requests and one giant synchronous bundle &#8211; the real goal is early discovery and correct priority of critical resources. AEM Dispatcher on an Apache server is agnostic to HTTP version, so when on an Apache server, HTTP\/2 is enabled, then it will work fine with AEM Dispatcher. AEM Content Delivery Network supports HTTP\/2 by default.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>HTTP compression<\/strong><\/h3>\n\n\n\n<p>Most web clients support data compression, so make sure it is enabled on the backend delivery side. Compress text resources such as HTML, CSS, JS, JSON, and SVG. There are many compression algorithms supported by web browsers: from the &#8220;classical&#8221; Gzip, through the currently recommended and widely supported Brotli, to the increasingly supported Zstandard (Zstd).<\/p>\n\n\n\n<p>Do not expect meaningful gains from recompressing already-compressed media such as JPEG, WebP, AVIF, MP4, or most font subsets. Some caching servers and CDNs allow pre-compressing and storing in separately cached files to make them ready to serve as already compressed responses.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Core Web Vitals<\/strong><\/h2>\n\n\n\n<p>Google defined specific metrics to measure real-world user experience performance of the page and called them Core Web Vitals:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Largest Contentful Paint (LCP)<\/strong>: Loading performance (perceived load speed),<\/li>\n\n\n\n<li><strong>Interaction To Next Paint (INP)<\/strong>: Responsiveness (latency of interactions),<\/li>\n\n\n\n<li><strong>Cumulative Layout Shift (CLS)<\/strong>: Visual stability (unexpected layout shifts).<\/li>\n<\/ul>\n\n\n\n<p>Make sure to keep these metrics as low as possible &#8211; this requires a fast frontend application and quick responses (or caches) from servers. Current targets are <code>LCP &lt;= 2.5 s, INP &lt;= 200 ms, and CLS &lt;= 0.1<\/code> at the 75th percentile of real-user data. Lighthouse is useful for debugging, but CrUX and RUM show what users actually experience.<\/p>\n\n\n\n<p>Let&#8217;s consider how to practically improve every metric in an existing web application.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;uploadedSrc&quot;:&quot;https:\\\/\\\/sii.pl\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/image2.png&quot;,&quot;figureClassNames&quot;:&quot;wp-block-image aligncenter size-full&quot;,&quot;figureStyles&quot;:null,&quot;imgClassNames&quot;:&quot;wp-image-33740&quot;,&quot;imgStyles&quot;:null,&quot;targetWidth&quot;:1024,&quot;targetHeight&quot;:588,&quot;scaleAttr&quot;:false,&quot;ariaLabel&quot;:&quot;Enlarge image: Core Web Vitals&quot;,&quot;alt&quot;:&quot;Core Web Vitals&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image aligncenter size-full wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"588\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/05\/image2.png\" alt=\"Core Web Vitals\" class=\"wp-image-33740\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/05\/image2.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/05\/image2-300x172.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/05\/image2-768x441.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge image: Core Web Vitals\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"context.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"context.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Fig. 2 Core Web Vitals (<a href=\"go-globe.com\" rel=\"nofollow\" >source<\/a>)<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Largest Contentful Paint<\/strong><\/h3>\n\n\n\n<p>To improve loading performance, load only styles and scripts that are really useful for the page. Every additional file affects request counts, transfer times, and processing (evaluation) times, and may delay discovery of the LCP resource. Deliver HTML quickly, make the hero image or text discoverable in the initial HTML, preload the LCP resource when discovery would otherwise be late, mark the LCP image with fetchpriority=&#8221;high&#8221;, and do not lazy-load it.<\/p>\n\n\n\n<p>AEM provides a mechanism called ClientLibs, which manages bundling of scripts and styles, taking care of proper ordering (both inside the bundle and between several bundles that are dependent).<\/p>\n\n\n\n<p>By properly splitting website features and dependency libraries into ClientLibs, you can significantly limit unnecessary requests and effectively cache bundles both server- and client-side.<\/p>\n\n\n\n<p>Web browsers automatically cache responses, even unasked, so directly serving JavaScript or CSS files using the same URLs could lead to inconsistencies, as a previously cached version of the file may be processed by a browser.<\/p>\n\n\n\n<p>Fortunately, the AEM ClientLibs mechanism solves this problem automatically (by adding a hash to the bundle filename). ClientLibs support optional minification, which provides additional speedup in transfer and processing time.<\/p>\n\n\n\n<p>On HTTP\/2 and HTTP\/3, however, fewer requests are no longer automatically better; keep critical CSS small, avoid a single giant site-wide blocking JavaScript bundle, and split features by route or need where possible. Make sure to load analytics and ads lazily after the page&#8217;s initial rendering.<\/p>\n\n\n\n<p>Additionally, consider optimizing assets, networking, advanced frontend techniques, and properly configuring caching, as described in previous sections.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Interaction To Next Paint<\/strong><\/h3>\n\n\n\n<p>Improving responsiveness can be trickier and might require debugging mode in the web browser.<\/p>\n\n\n\n<p>Find out which interaction is actually the slowest &#8211; INP measures responsiveness across the whole visit, not just the first click. Make sure that no JavaScript tasks are blocking the main thread \u2013 use Web Workers if needed and break up long tasks so the browser can paint sooner.<\/p>\n\n\n\n<p>Large DOM (Document Object Model) with too many elements and over-complicated layout definitions and complex interface updates leads to slow responsiveness. Heavy third-party scripts may not be optimized \u2013 check for updates or alternatives. Provide visual feedback early, even if the full action finishes later.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Cumulative Layout Shift<\/strong><\/h3>\n\n\n\n<p>If the layout blinks during loading or elements rapidly move to other places, then there&#8217;s visual instability. Consider precomputing the layout to account for different viewport sizes and orientations. Instead of applying layout and styling via scripts, it is better to do so purely in CSS and potentially even mark it for preloading.<\/p>\n\n\n\n<p>For page elements that require dynamic asset and information loading, use placeholders or skeletons. Always set <code>width <\/code>and <code>height<\/code> on images; use aspect-ratio or fixed placeholders for media, embeds, and ads; reserve stable slots for dynamic content; and animate with <code>transform and opacity<\/code> instead of layout-affecting properties.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Infrastructure<\/strong><\/h2>\n\n\n\n<p>To speed up your backend, you can add more servers or use faster software <strong>\u2013 Captain Obvious here, at your service.<\/strong><\/p>\n\n\n\n<p>This is why I had left Infrastructure as the last section before the Conclusion, but since we cannot ignore this topic, let&#8217;s briefly consider it. Still, infrastructure is often the wrong place to start, because more CPU will not fix late resource discovery, poor cache policy, or oversized media.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Servers<\/strong><\/h3>\n\n\n\n<p>As for servers (both virtual and bare-metal), you can scale vertically (up) by adding more resources (CPUs, RAM, disk space). When working in a virtualized environment (e.g., on VPS \u2013 Virtual Private Servers), resources are shared with other virtual servers, and even when declared, they might not always be fully available (typically not guaranteed).<\/p>\n\n\n\n<p>If your application supports scaling horizontally, you can also add more servers. When using cloud providers, it can be automated based on demand.<\/p>\n\n\n\n<p>Server placement also matters. If critical resources are on a different origin, the browser may need extra DNS, TCP, TLS, and protocol setup before it can fetch them, so same-origin delivery for critical assets is often simpler and faster.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Software<\/strong><\/h3>\n\n\n\n<p>Update or replace your software \u2013 check and consider every application in your stack. Outdated applications or their dependencies may be slower (and, of course, more vulnerable from a security perspective). Newer versions can be optimized and more secure; this is why it is so important to keep them up to date. When software is no longer maintained, or there are faster (and preferably more secure) alternatives, consider replacing it.<\/p>\n\n\n\n<p>When using all-in-one solutions like Adobe Experience Cloud &#8211; getting a framework to build enterprise-grade websites, including content management, digital assets management (images, videos, documents), and forms handling \u2013 all applications are maintained by their vendor and automatically updated.<\/p>\n\n\n\n<p>For AEM specifically, traditional Sites + Dispatcher + CDN remains viable and can be fast when configured well. AEM as a Cloud Service gives managed updates and long-cache versioned ClientLibs.<\/p>\n\n\n<div class=\"nsw-o-blogersii-banner\">\n            <picture>\n            <source srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-AEC-Desktop_.jpg\" media=\"(min-width: 992px)\" >\n            <source srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-AEC-Mob_.jpg\" media=\"(min-width: 300px)\" >            <img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-AEC-Desktop_.jpg\" alt=\"\"  class=\"\"  >\n        <\/picture>\n        <div class=\"cnt\">\n                    <div class=\"nsw-m-title-block -h3 -invert  -has-title-margin-bottom-0 -has-title-font-weight-bold\">\n                                <h2 class=\"nsw-m-title-block__title\">Sii x Adobe Experience Cloud<\/h2>\n                <\/div>\n                            <p class=\"has-nsw-p-4-font-size has-invert-color\">\n                As an official Adobe Experience Cloud partner, we implement content management, customer journey orchestration, and marketing automation solutions to streamline operations and increase campaign performance.\n            <\/p>\n                            <a  href=\"https:\/\/sii.pl\/en\/what-we-offer\/enterprise-platforms\/adobe\/\" class=\"nsw-a-button -ghost -banner-button\"   >\n        <span>Adobe offering<\/span>\n    <\/a>\n            <\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>The fastest website would be a static one with fully cacheable files distributed globally. But for most, this is not achievable due to business needs for frequent page updates and dynamic user-specific content.<\/p>\n\n\n\n<p>By choosing the right stack and configuring it properly, it is possible to handle millions of requests per day without exploding costs. For existing websites, focus first on proper caching settings (both server-side and client-side) and optimizing the LCP path, then remove unnecessary render-blocking CSS and JavaScript, and compress and resize media appropriately.<\/p>\n\n\n\n<p>These optimizations do not always require significant changes in the codebase and infrastructure, while they can significantly improve performance. And if there&#8217;s time and budget, consider other options.<\/p>\n\n\n\n<p>To summarize the key areas covered:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Caching is the foundation \u2013 when properly configured, it handles the vast majority of public requests.<\/li>\n\n\n\n<li>Asset optimization through modern image formats (WebP, AVIF), explicit dimensions, and better video delivery can cut file sizes and improve rendering without visible quality loss.<\/li>\n\n\n\n<li>Networking improvements like CDN, HTTP\/2, HTTP\/3, and compression algorithms (Brotli, Zstandard) further reduce latency and transfer times.<\/li>\n\n\n\n<li>Core Web Vitals provide measurable targets for loading performance, responsiveness, and visual stability.<\/li>\n<\/ol>\n\n\n\n<p><strong>Remember that performance optimization is an ongoing process, not a one-time task.<\/strong><\/p>\n\n\n\n<p>As browsers evolve and new standards emerge, opportunities for improvement continue to arise. Start with the fundamentals, measure with real-user data, and iterate.<\/p>\n\n\n\n<p><strong>A fast website is not only technically superior<\/strong> \u2013 it provides better user experience, ranks higher in search results, appears faster in AI chat responses, and ultimately drives better business outcomes.<\/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;33747&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;0&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;0&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;2&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;0\\\/5&quot;,&quot;size&quot;:&quot;30&quot;,&quot;title&quot;:&quot;Blazing fast websites and how Adobe Experience Manager can help achieve that&quot;,&quot;width&quot;:&quot;0&quot;,&quot;_legend&quot;:&quot;{score}\\\/5&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: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 0px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 24px;\">\n            <span class=\"kksr-muted\"><\/span>\n    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Nowadays, there are many ways to serve websites \u2013 from manually creating HTML pages (or, increasingly, generating them with AI), &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/en\/blazing-fast-websites-and-how-adobe-experience-manager-can-help-achieve-that\/\">Continued<\/a><\/p>\n","protected":false},"author":590,"featured_media":33743,"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":[1320],"tags":[2744,1640,1590,1526,1353],"class_list":["post-33747","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hard-development","tag-www-en","tag-adobe-experience-manager-en","tag-tools","tag-guidebook","tag-e-commerce-en"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/05\/code_3.jpg","category_names":["Hard development"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/33747"}],"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\/590"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/comments?post=33747"}],"version-history":[{"count":1,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/33747\/revisions"}],"predecessor-version":[{"id":33749,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/33747\/revisions\/33749"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/media\/33743"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/media?parent=33747"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/categories?post=33747"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/tags?post=33747"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}