Hours to Seconds: Experience Blazing-Fast Publishing in XM Cloud

I always felt that XM Cloud publishing (Also, Experience Edge) publishing needed some attention. I shared this feedback during the last MVP Summit, and the Sitecore product team confirmed that they are aware of this and are working on it. I’ve been looking forward to this.

As soon as I noticed this update in Change log : https://developers.sitecore.com/changelog/xm-cloud/faster-publishing-in-xm-cloud couldn’t resist to try this change on my test XM Cloud environment!

Here are the quick steps:

  1. Configure environment variable Sitecore_ExperienceEdge_dot_WorkerStoreEnabled to TRUE
  2. Deploy the environment
  3. Once the deployment competes, republish [only one time]

I wanted to spend some time validating and measuring these changes. So, I can see the progress and I also thought to share it with you too.

Note : Related items checked for all test and one language English has been selected. I would recommend to use these numbers as starting guidelines and perform testing in your environment as it might differ based on your setup.

Observations:

  • V2 Publishing reduces Publish Item [Smart Publish] time by 8-12% than V1/Default publishing
  • V2 Publishing reduces Publish Item [Republish with Sub-items] time by 14% than V1/Default publishing
  • V2 Publishing reduces Publish site [Republish] time by 22% than V1/Default publishing
  • V2 Publishing reduces Incremental Publishing time by 75-85% than V1/Default publishing

Remember, it’s experimental, so be sure to review your published links and report any language fallback issues. And you can always revert back to Default publishing by reverting “Sitecore_ExperienceEdge_dot_WorkerStoreEnabled” value to FALSE and then redeploy

If you are wondering how it works than following reply from Andy Cohen (System Architect, Edge & XM Cloud Deploy @ Sitecore) might answer your question:

we are splitting raw layout json structure from the data sources into 2 separate paths.  in the edge, we recombine the 2.  where the datasources have integrated graphql, those also get executed on the edge.

There is a tradeoff – and how you architect your app will have an affect on uncached rendering time.

We are not recombining partial layout at the edge at the moment.  If you modified the layout structure of the partials, the pages they exist on still would need to be published.  But if you had a component on your partial that had a datasource with a multilist field with a “Promo Content” field for example – and you updated that piece of content – you only have to publish that piece of content

If you are thinking will it work for Platform DXP client who is leveraging Experience Edge? Then Ivan Lieckens [Product Manager, Product Connectors @ Sitecore] comment should help:

 This is only for XMC right now until it’s stable. At that point we’ll backport it to Platform DXP. Keep in mind this is an experimental feature currently.

Happy Faster Publishing! 🙂


Override media cache headers with SXA site learnings

Challenge

Recently, we faced an interesting issue where PDF file was showing outdated content. Our Site supposed to show Dining menu, which client authoring team used to update daily due to some event.

This post should help you understand what was the underlying reason for the issue and how we fixed it!

Solution

We first started looking at Cloud flare (CF) configurations as we used CF CDN to cache media files. If you are new to CF and not sure, how to check this. Please refer this article : https://support.cloudflare.com/hc/en-us/articles/200172516-Understanding-Cloudflare-s-CDN. We were getting CF-Cache-Status variable value as HIT.

Our goal was to exclude PDF File from CF Cache and other media extensions should still be served from CDN Cache. We could do that using Page Rules, as shown below:

After above configuration, We could exclude PDF Caching at CF CDN level. Which we could identify using cf-cache-status variable value as MISS.

But still that didn’t fix our issue, then we started reading more about browser caching headers : https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control

After some quick web search, we came across this post : https://ggullentops.blogspot.com/2021/01/sitecore-media-cache-headers-pdf.html (Thanks Gert Gullentops!) – Basically, this post adds processor in Media Request Handler pipeline to modify response headers.

Tested this in local and it worked as expected!. But “Life is not as easy at seems to be”. It didn’t worked on either of the other environments – Dev/QA/UAT/PROD.

After spending lot of time to debug this did a quick compare of local web.config and other environment’s web.config and noticed that local config had “Sitecore.XA.Foundation.MediaRequestHandler.MediaRequestHandler” and on other environments it was using Sitecore’s OOTB Media Request handler for sitecore_media.ashx handler. Which seems was bug in our ARM Template. Post SXA Installation “Sitecore.XA.Foundation.MediaRequestHandler.sxaconfig” file patch needs to be applied. To fix this we added web.config transform in our code repo.

As soon as we applied web.config change and deployed code suggested in the post. It fixed our issue! You can verify it using Dev Tool:

Bonus tip : SXA 9.3 also handles Media 404 handler. And if you are using SXA Media Request handler, then on Media 404. Your Site’s 404 error page will be shown (If configured). Which means you don’t need to add custom code mentioned in this post : https://www.coreysmith.co/sxa-media-and-layout-not-found/

As per the famous quote

Leave this world a little better than you found it.

We updated our Media Request Header Processor to be config-driven as we didn’t want to make more code changes in case this doesn’t work on PROD. Sharing the same updates with you as well. Hope this helps you!

using Sitecore.Diagnostics;
using Sitecore.XA.Foundation.MediaRequestHandler.Pipelines.MediaRequestHeaders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace SCBasics.Foundation.Caching.Pipelines
{
public class MediaRequestHeaderProcessor
{
public void Process(MediaRequestHeadersArgs args)
{
try
{
Assert.ArgumentNotNull(args, nameof(args));
var media = args.Media;
var cache = args.Context.Response.Cache;
int maxAgeInSeconds =
Sitecore.Configuration.Settings.GetIntSetting("MediaRequest.CachingOverride.MaxAgeInSeconds", 0);
string mimeTypeToApplyCache =
Sitecore.Configuration.Settings.GetSetting("MediaRequest.CachingOverride.MimeTypeToApplyCache", "application");
string httpCacheability =
Sitecore.Configuration.Settings.GetSetting("MediaRequest.CachingOverride.HttpCacheability", "NoCache");
string cacheExtension =
Sitecore.Configuration.Settings.GetSetting("MediaRequest.CachingOverride.CacheExtension", "no-cache");
if (media.MimeType.StartsWith(mimeTypeToApplyCache
, StringComparison.OrdinalIgnoreCase))
{
cache.SetMaxAge(TimeSpan.FromSeconds(maxAgeInSeconds));
if (!string.IsNullOrWhiteSpace(httpCacheability))
{
// Please make sure there is no typo and value should be from above list of possibe values
// This will be mainly owned by Developers – So, if Dev makes any typo – This will throw error – Which is intentional
var httpCacheabilityValue = (HttpCacheability)
Enum.Parse(typeof(System.Web.HttpCacheability), httpCacheability, true);
if (httpCacheability != null)
cache.SetCacheability(httpCacheabilityValue);
}
if (!string.IsNullOrWhiteSpace(cacheExtension))
cache.AppendCacheExtension(cacheExtension);
}
}
catch (Exception exception)
{
// Log it and swallow it
Log.Error("Something went wrong while setting cache-control headers for media file", exception, this);
}
}
}
}
<?xml version="1.0"?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/&quot; xmlns:role="http://www.sitecore.net/xmlconfig/role/"&gt;
<sitecore>
<!– Thanks! https://ggullentops.blogspot.com/2021/01/sitecore-media-cache-headers-pdf.html–&gt;
<!–NOTE : This pipeline is to add additional cache-control headers to disable caching for specific mimetype –>
<settings>
<!–MimeType To Apply Cache
https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
We are doint it for application – Which covers most of the documents–>
<setting name="MediaRequest.CachingOverride.MimeTypeToApplyCache" value="application"/>
<!–//
// Summary:
// Sets the Cache-Control: no-cache header. Without a field name, the directive
// applies to the entire request and a shared (proxy server) cache must force a
// successful revalidation with the origin Web server before satisfying the request.
// With a field name, the directive applies only to the named field; the rest of
// the response may be supplied from a shared cache.
NoCache = 1,
//
// Summary:
// Default value. Sets Cache-Control: private to specify that the response is cacheable
// only on the client and not by shared (proxy server) caches.
Private = 2,
//
// Summary:
// Specifies that the response is cached only at the origin server. Similar to the
// System.Web.HttpCacheability.NoCache option. Clients receive a Cache-Control:
// no-cache directive but the document is cached on the origin server. Equivalent
// to System.Web.HttpCacheability.ServerAndNoCache.
Server = 3,
//
// Summary:
// Applies the settings of both System.Web.HttpCacheability.Server and System.Web.HttpCacheability.NoCache
// to indicate that the content is cached at the server but all others are explicitly
// denied the ability to cache the response.
ServerAndNoCache = 3,
//
// Summary:
// Sets Cache-Control: public to specify that the response is cacheable by clients
// and shared (proxy) caches.
Public = 4,
//
// Summary:
// Indicates that the response is cached at the server and at the client but nowhere
// else. Proxy servers are not allowed to cache the response.
ServerAndPrivate = 5
NOTE : Please make sure there is no typo and value should be from above list of possibe values–>
<setting name="MediaRequest.CachingOverride.HttpCacheability" value="NoCache"/>
<!–Appends the specified text to the Cache-Control HTTP header.–>
<setting name="MediaRequest.CachingOverride.CacheExtension" value=""/>
<!–Max Age In Seconds–>
<setting name="MediaRequest.CachingOverride.MaxAgeInSeconds" value="0"/>
</settings>
<!– Added to Disable PDF Browser Caching –>
<pipelines>
<mediaRequestHeaders>
<processor type="SCBasics.Foundation.Caching.Pipelines.MediaRequestHeaderProcessor, SCBasics.Foundation.Caching" />
</mediaRequestHeaders>
</pipelines>
</sitecore>
</configuration>
<handlers>
<add xdt:Transform="Replace" xdt:Locator="Match(name)" name="Sitecore.MediaRequestHandler" verb="*" path="sitecore_media.ashx" type="Sitecore.XA.Foundation.MediaRequestHandler.MediaRequestHandler, Sitecore.XA.Foundation.MediaRequestHandler" />
</handlers>
<!–Optional–>

Happy Cache Disabling! 🙂

SXA Rendering Global Exception Handler

Challenge

We’ve been happily using SXA OOTB Components [and still doing the same :)]. But suddenly one day we started getting errors on the Site. Where the page would give an error. After troubleshooting further we figured out that. The data source item was deleted and the component was still looking for that data source item.

If it had been a custom component or MVC Component. We would have handled that exception. But unfortunately, that’s not the case with OOTB SXA Components.

One way to resolve this is. Configure Custom Error page: https://doc.sitecore.com/developers/sxa/93/sitecore-experience-accelerator/en/generate-a-custom-static-error-page.html. So, it shows our custom error page.

But we didn’t want to break a full page because of an error in one of the components. Instead, we wanted to keep the full page working without an error-ed component.

If it had been an MVC solution there are plenty of blogs to handle this using the Global MVC Rendering exception handling approach. But unfortunately, we couldn’t found any blog for SXA to do the same.

That’s why this blog post is coming to an existence on this earth!

Solution

We stumbled upon following posts to do the same in MVC (Thank you so much for this post):

And tried to fit it in SXA architecture.

Quick show config revealed that SXA has “SxaPageModeRenderingErrorStrategy” to handle such error in Experience editor mode. We noticed that the errored component was throwing and showing errors in Experience editor mode.

That was our Eureka Moment! We fired up the reflector and figured out the next steps.

Putting it together for you. So, you can go home (Or as per New Normal, go to the living room from the working room) on time to spend time with your loved ones!

Here you go!

using Microsoft.Extensions.DependencyInjection;
using Sitecore;
using Sitecore.Abstractions;
using Sitecore.DependencyInjection;
using Sitecore.Diagnostics;
using Sitecore.Mvc.Pipelines.Response.RenderRendering;
using Sitecore.Mvc.Presentation;
using Sitecore.XA.Foundation.Abstractions.Configuration;
using Sitecore.XA.Foundation.Multisite.Extensions;
using Sitecore.XA.Foundation.Presentation;
using System;
using System.IO;
using System.Web.Mvc;
namespace SCBasics.Foundation.SitecoreExtensions.Pipelines.RenderRendering
{
public class CustomPublishModeRenderingErrorStrategy : PageModeRenderingErrorStrategy, IRendererErrorStrategy
{
private readonly BaseLog _log;
public CustomPublishModeRenderingErrorStrategy(BaseLog log)
{
_log = log;
}
protected override string GetExceptionDetails(string prefix, string message, string stackTrace)
{
string pageModeRenderingErrorClass = ServiceProviderServiceExtensions.GetService<IConfiguration<PresentationConfiguration>>(ServiceLocator.ServiceProvider).GetConfiguration().PageModeRenderingErrorClass;
return this.GetPreCode(stackTrace);
}
public bool HandleError(Renderer renderer, Exception ex, TextWriter writer)
{
bool isCustomErrorHandlerEnabled = Sitecore.Configuration.Settings.GetBoolSetting("SCBasics.IsCustomErrorEnabled", true);
if (!isCustomErrorHandlerEnabled)
return false;
/*
* Sitecore.XA.Foundation.Presentation.Pipelines.RenderRendering.SxaPageModeRenderingErrorStrategy
* NON SXA References:
* https://www.teamdevelopmentforsitecore.com/Blog/robust-mvc-rendering-exception-handler
* https://www.sitecorenutsbolts.net/2015/10/23/Rendering-Exception-Handling-The-Right-Way/
*/
if (this.IsPageModeNormal())
{
return PublishModeHandleError(renderer, ex, writer);
}
if (!Context.Site.IsSxaSite())
{
return false;
}
return base.HandleError(renderer, ex, writer);
}
private bool PublishModeHandleError(Renderer renderer, Exception ex, TextWriter writer)
{
Assert.IsNotNull(renderer, "renderer");
Assert.IsNotNull(ex, "ex");
Assert.IsNotNull(writer, "writer");
if (!this.IsPageModeNormal())
{
return false;
}
string prefix = string.Format("Error Rendering {0}: ", renderer);
string str3 = this.GetExceptionDetails(prefix, ex.Message, ex.StackTrace);
// Log Error
_log.Error(string.Format("Failed to render component '{0}'", prefix), ex, this);
// Log main error in comment
writer.WriteLine("<!– Exception rendering component '{0}': {1} –>",
prefix + ":" + ex.Message,
str3);
// Log Inner exception in comment
Exception innerException = ex.InnerException;
string str2 = "Inner Exception: ";
while (innerException != null)
{
string str4 = this.GetExceptionDetails(str2, innerException.Message, innerException.StackTrace);
writer.WriteLine("<!– Inner Exception: {0} –>", innerException.Message);
innerException = innerException.InnerException;
}
return true;
}
}
}
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"&gt;
<sitecore>
<settings>
<!–Default true–>
<setting name="SCBasics.IsCustomErrorEnabled" value="true"/>
<!– USE SERVER-SIDE REDIRECT FOR REQUEST ERRORS
If true, Sitecore will use Server.Transfer instead of Response.Redirect to redirect request to service pages
when an error occurs (item not found, access denied etc).
Default value: false
–>
<setting name="RequestErrors.UseServerSideRedirect" value="true"/>
</settings>
<pipelines>
<mvc.renderRendering>
<processor type="Sitecore.Mvc.Pipelines.Response.RenderRendering.ExecuteRenderer, Sitecore.Mvc">
<param desc="rendererErrorHandler" type="Sitecore.Mvc.Pipelines.Response.RenderRendering.HttpExceptionWrappingRendererErrorStrategy, Sitecore.Mvc">
<param desc="rendererErrorHandler" type="Sitecore.Mvc.Pipelines.Response.RenderRendering.ChainedRendererErrorStrategy, Sitecore.Mvc">
<Handlers hint="list">
<handler patch:after="*[@type='Sitecore.XA.Foundation.Presentation.Pipelines.RenderRendering.SxaPageModeRenderingErrorStrategy,
Sitecore.XA.Foundation.Presentation']"
type="SCBasics.Foundation.SitecoreExtensions.Pipelines.RenderRendering.CustomPublishModeRenderingErrorStrategy,
SCBasics.Foundation.SitecoreExtensions" resolve="true"/>
</Handlers>
</param>
</param>
</processor>
</mvc.renderRendering>
</pipelines>
</sitecore>
</configuration>

Quick gist of above gist :

We are handling our custom pipeline after SxaPageModeRenderingErrorStrategy which is logging exception as HTML comment on the page when the site is in normal mode and show error on page when the site is in experience editor mode (That part is done by OOTB handler). You can change it as per your need.

In case you want to disable this functionality in any environment. you can set SCBasics.IsCustomErrorEnabled to false

That’s it – Happy Exception Handling! 🙂

SXA Renderings Cheat Sheet

Challenge:

Recently have been doing SXA GAP analysis for new project. Sitecore documentation team has done great job documenting those here : https://doc.sitecore.com/users/sxa/93/sitecore-experience-accelerator/en/the-sxa-renderings-and-rendering-variants.html

As you can see there are 70+ components and it’s easy to remember all of them (you no need to in real world). But when you are doing quick analysis and try to map Non SXA component with SXA.

Mark and SXA team has done great job help you visualize all components using this SXA Style guide : https://www.markvanaalst.com/blog/sxa-styleguide/introducing-the-sxa-styleguide/ (Thank you so much!)

Still I wanted to have list of all components as a single reference card. So, I can quickly review it. And that’s how idea of having SXA Renderings Cheat Sheet came into existence!

Solution:

You can view/Download PDF from here : https://cheatography.com/kpatil/cheat-sheets/sxa-renderings/

  1. First column indicates Rendering name
  2. Second column indicates whether it supports rendering variant or not (If this column doesn’t exist means it doesn’t support rendering variant)
  3. Third column indicates Description

Happy SXA Development! 🙂

Sitecore Experience Accelerator (SXA) Basics

Challenge:

Howdy Friends, I’m really excited to share my first SXA post with you!

SXA 1.0 was launched in 2016 and SXA 9.3 (Yes, Sitecore has changed SXA versioning!) has been released on November 2019.

I just explored little bit when it was launched, But I had my own apprehensions about It’s adoption due to unclear Sitecore licensing process [at-least to me] and lot of other things. But as following quote says:

All change is hard at first, messy in the middle, and so gorgeous at the end.” – Robin Sharma.

I think this is true for SXA as well. SXA 9.3 is gorgeous version! [That doesn’t mean past version has been hard/messy 😉 ]

I wanted to learn SXA, But there were lot of resources on the web posted by great people. As a newbie, I was confused. From where to start? [You as well!?]

Image result for confused kid with options
Image Credits : https://www.successunlimited-mantra.com/index.php/blog/what-to-do-when-confused

Or, If you have following questions in your mind, then this post is for you!

  • Where to learn SXA basics?
  • What is SXA?
  • Why I should learn and adopt SXA?
  • How can I be expert in SXA?
  • What is co-relation between Sitecore Custom, Sitecore SXA, and Sitecore JSS? Are they competing development methodologies or complementing each other?
  • We are starting new project — It should be on SXA or Custom?
  • How SXA development is different than my earlier Sitecore Custom Development (Sitecore WebForms/MVC Development)?
  • I’m working on Sitecore since long time, So, whatever I’ve learnt on Sitecore platform till this point of time will be of no use?
  • Our FED-BED integration process will be impacted by SXA?
  • All my FED team need to learn SXA?
  • All my FED team need to have Sitecore instance in local?
  • BED Developer Can’t I work ahead of FED Developers?

Wow, There are lot of questions. I might not be able to cover all of them in this post. But I will try to share SXA fundamentals and try to answer few questions and by end of this post my goal will be that you will be self sufficient to find your own answers!

Quotable Quote:

Give a man a fish and you feed him for a day. Teach him how to fish and you feed him for a lifetime

Solution:

Let’s follow the W-W-H (What, Why, How) learning framework for SXA.

What is SXA?

Let’s refer Sitecore’s definition : https://doc.sitecore.com/users/sxa/93/sitecore-experience-accelerator/en/introducing-sitecore-experience-accelerator.html

Web development teams use Sitecore Experience Accelerator (SXA) to speed up the production of websites and to reuse components, layouts, and templates across a variety of sites.

SXA separates structure from design, so front-end designers, creative designers, content authors, and developers can work in parallel and you can deploy and maintain multiple sites quickly and cost effectively. Once a basic user experience plan is in place, everyone can get started on the platform. For example: the content author can start entering the content in the wireframe environment, while the front-end developer works on the theme, and the developer sets up the data templates.

Before we go in further details about SXA. Let’s understand type of Sitecore Development:

Image credits : http://www.pieterbrinkman.com/2019/12/02/sitecore-9-3-whats-new-blog-series/
  • Custom : If you have been doing Sitecore Development since long time, then you must have seen Sitecore framework ivolved from XSLT [You are getting old? :-)], to Web Forms and MVC. We’ve taken a big leap in development from XSLT to MVC for sure. But as a human we always want to do better than yesterday. Sitecore industry folks also wanted to make product better for the full eco system. Developers across different companies/projects/agencies have been spending more time on building those similar components – Header, Footer, Menu etc. rather than focusing on core business challenges and this was impacting “Time to market” for business. Everyone was looking for something better and there were few accelerators built by few companies for either their in-house use or as a product. But Configide‘s Zengarden was promising. It got adopted by lot of companies and community members. Sitecore also noticed that and adopted SXA in Sitecore’s offerings!
  • SXA : SXA stands for Sitecore Experience Accelerator. As name suggests, it helps you to speed up your website development. SXA comes with over fifty components that can be completely customized for the needs of your brand.
  • Sitecore JSS : For headless development.

Refer following diagram which depicts SXA benefits :

SxA Website development process 
User Experience 
Visual Design 
Frontend Development 
Backend Development 
Content Entry 
Time to market

Let’s try to understand above diagram with an example – Company Contoso Inc. acquired new brand and would like to spin up a new website. They asked two different teams to develop website using different approaches. Sitecore Custom vs Sitecore SXA.

This is how overall process looks like:

Sitecore custom approach – Looks more like old manufacturing assembly approach. Where each department can work on module, once last department completes their work.
SXA approach – Looks more like round-table approach. Where everyone can work collaborate together!

As you rightly guessed, SXA team could spin up new website faster than Custom Development team.

ALERT! — If your Maths is good and you are a business stakeholder, Then please don’t create formula that SXA site should take 5 times less than Custom Development approach. It might not work that way. As each Site has different features, integrations and complexity. Please let your implementation team come up with proposed solution and time it needs to build. You also need to consider some learning curve for this new tool set. But relatively SXA should take less time than Custom. But how much that all depends on lot of factors. Which your implementation team will be able to share with you.

Also, depends on your site’s complexity, you might need to divide some work between Design, FED and BED team.

If you want to read more about SXA, I strongly recommend you to read this doc : https://doc.sitecore.com/users/sxa/93/sitecore-experience-accelerator/en/introducing-sitecore-experience-accelerator.html

As you might have noticed from architecture diagram. Lot of other Sitecore pieces are old e.g. MVC, WFFM, Presentation etc. You must have noticed Sitecore Powershell module in architecture diagram.

Powershell module is heart of SXA.

Why SXA?

I believe by this time you might have already been clear with “Why SXA?” and you must be saying “Why not SXA?” 🙂 But still if you are someone who needs more reasons before deciding. I would recommend you to read following posts:

If you reached thus far and have heard following feedback from your colleagues/friends about SXA and hesitant to use SXA with that feedback or not:

  • Front-end and Back-end integration is challenging.
  • It’s cumbersome to make rendering variants.
  • Front-end markups can’t be exactly applied in Back-end.
  • Export and Import process of Creative exchange is cumbersome when project is complex and team is big.
  • It’s good for small sites. But if Site has complex custom design. Then customization takes lot of time.

This all is great feedback and learnings. Sitecore product team have been listening and working on it, and came up with SXA 9.3 version. Which has major updates. Two of my favorites are:

  • Scriban templates support – This is huge and solves two main challenges – FED-BED integration and makes customization super simple and extensible!
  • Front-end and Back-end integration workflow has been revamped : Raw FED Assets has been moved to file system rather than media library. So, your FED team mates can work in isolation and larger team can work together. Only compiled assets will be stored in Sitecore media library.

I will not spend much time writing about SXA 9.3 as lot of great souls have already written/shared about it:

What!? You are still not convinced to use SXA and need to see more reasons to use SXA over Custom Development?

Let me share few examples using which you can compare Custom and SXA way to do things and understand how efficient SXA is:

  1. SXA Caching Options : Read this section : https://doc.sitecore.com/developers/sxa/93/sitecore-experience-accelerator/en/set-sxa-caching-options.html – Allows you to apply HTML Caching at Site, Component, Placeholder level along with donut caching.
  2. Source field report OOTB : https://doc.sitecore.com/developers/sxa/93/sitecore-experience-accelerator/en/run-a-source-field-report-to-set-the-data-source-context.html
  3. Helps you choose option : https://doc.sitecore.com/developers/sxa/93/sitecore-experience-accelerator/en/flowchart-to-determine-whether-to-create-a-custom-rendering.html
  4. Easy cloning : https://doc.sitecore.com/developers/sxa/93/sitecore-experience-accelerator/en/clone-an-sxa-site.html – You can create pattern library and clone it as per your need.
  5. SXA Site manager : https://doc.sitecore.com/developers/sxa/93/sitecore-experience-accelerator/en/manage-multiple-sites-with-the-sxa-site-manager.html – No more restarts for adding/deleting website!
  6. Standard Security and roles management : https://doc.sitecore.com/developers/sxa/93/sitecore-experience-accelerator/en/security.html

Hopefully you must have been convinced to use SXA by this time. If not, then please drop your use case and we can try to understand more about it :-). It might be possible that custom development might be more efficient for you to use than SXA.

Please remember technology and tools can’t solve all problems!

How to use SXA?

If you reached thus far. Then it means you are all charged up to learn SXA and looking for sources from where you can start learning basics of SXA.

I will share my learning sources and approach which I followed. Feel free to tweak it as per your need.

  1. Sitecore e-learning courses : I was very impressed with Sitecore training course’s new design. If you are developer, you might not find lot of value from Development Point of view. But these courses are great to have SXA’s fundamental understanding. You can follow your suitable approach to learn SXA. I learnt following two courses:
    1. Introduction to Sitecore® Experience Accelerator 9
    2. Fast-Track Design in Sitecore® Experience Accelerator 9
  2. Short, unofficial, ad-hoc, Sitecore SXA tutorials : This is second great source to learn SXA. Lot of great videos have been posted here. But please don’t get overwhelmed with all videos. To learn SXA, you no need to go through all videos. To keep things simple, go through some basic videos – especially – How to create site, Page Design, Partial design, Rendering variants etc. : https://www.youtube.com/channel/UCn_P819AlbNv_maQCqrKp4g/videos
  3. Sitecore Documentation : https://doc.sitecore.com/developers/sxa/93/sitecore-experience-accelerator/en/setting-up-and-configuring.html – This is another great source to learn more about SXA features. I would really like to shout-out documentation team for doing great job in documenting SXA as well as some of the recent document updates have been really great! – Looks like, Sitecore documentation team is going in right direction.
  4. Practice, Practice, Practice : Nothing can beat this step. You must need to do hands-on with SXA concepts. As there are lot of concepts to explore and you can’t remember those, until you practice.
    1. Install SXA : If you are using Sitecore Install Assistant then installing SXA is super easy.
    2. Create one website : Create one simple website, which has header, footer and some pages.
    3. Create new theme using SXA CLI and try to create few rendering variants with or without Scriban
    4. If you have been working with Sitecore Custom Development since long time, and have been aware about some best practices like Standard values, Renderings, Layouts etc. try to understand their Sitecore SXA approaches.
  5. Advanced learnings:
    1. https://buoctrenmay.com/2019/12/23/sitecore-xp-9-3-0-and-sxa-9-3-0-demo-habitat-home-setup-guide/
    2. Build complex website using SXA 9.3 and Scriban templates.

Hope you found this post helpful, and will help you to quick start your SXA learning. If you learn something new please blog and share with everyone!

Have a happy site building experience! 🙂

Good reads:

Image credits: