{"id":320,"date":"2021-10-26T17:29:01","date_gmt":"2021-10-26T23:29:01","guid":{"rendered":"https:\/\/developers.wpengine.com\/blog\/?p=320"},"modified":"2023-04-19T08:53:51","modified_gmt":"2023-04-19T14:53:51","slug":"the-when-and-where-of-rendering","status":"publish","type":"post","link":"https:\/\/wpengine.com\/builders\/the-when-and-where-of-rendering\/","title":{"rendered":"The When and Where of Rendering"},"content":{"rendered":"\n<p>I recently had a deep discussion on a GitHub RFC about what to call a rendering pattern and was very confused about the other person&#8217;s perspective. I have a degree in Ancient Greek, so I tend to be particular about language and how folks define things. I argued that what they were giving this fancy name was actually just server-side rendering(SSR). They were emphatic it was not. I was being pedantic; but also trying to understand. They finally said something that made me realize we were looking at this from two different but equally valid perspectives.<\/p>\n\n\n\n<p>I was looking at the <em>where<\/em> of rendering. Does it happen on the build server(SSG), on the runtime server(SSR), or the client(CSR)? They looking at it from a perspective of when it was rendered. Did it happen during the build, when the server received a request from a user&#8217;s browser, etc? Because we were looking at it from a different perspective, how we named it would be different.<\/p>\n\n\n\n<p>This conversation made me realize the traditional rendering methods (SSG, SSR, and CSR) have become an oversimplification of a much more complex issue. Some of what we\u2019ll be talking about might seem pedantic at first, maybe it is, but in the end, I believe it will allow us to think about rendering in a much more nuanced way.&nbsp;<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Define &#8220;render&#8221;&#8230;<\/h1>\n\n\n\n<p>Technically all sites are &#8220;rendered&#8221; from CSS, HTML, JS, images, Wasm, JSON, XML, etc. in the browser. While a good definition, it&#8217;s not helpful for our purposes. The &#8220;R&#8221; of <em>SSR<\/em> is why I choose the word &#8220;render&#8221;. &#8220;Generate&#8221; as in <em>Static Site Generator<\/em>(SSG) might be a better term, but I think the industry settled on &#8220;render&#8221; a long time ago, so here we are.<\/p>\n\n\n\n<p>A site is &#8220;rendered&#8221; when the finalized form of the content is generated. But what IS content? HTML, CSS, images, videos, etc? All those different file types are critical, but there&#8217;s only one kind of content any website <strong>MUST<\/strong> have.&nbsp;<\/p>\n\n\n\n<p>HTML.&nbsp;<\/p>\n\n\n\n<p>When your browser does that first HTTP GET request, it&#8217;s not asking for an image, XML, or anything else. It wants that HTML goodness. From the HTML, our fonts, scripts, styles, and images can be loaded by the browser, but the HTML is the basis for all web pages.<\/p>\n\n\n\n<p>Your website is &#8220;rendered&#8221; when the HTML content is finalized.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Where?<\/h2>\n\n\n\n<p>We&#8217;ll start with the <em>where<\/em> of rendering. There are four locations where content may be rendered: the code editor, the build server, the runtime server, or the client (e.g., browser).<\/p>\n\n\n\n<p>Did you type out your HTML? Not just a template, but all the content and data directly? Great! You&#8217;ve rendered your site in your code editor.<\/p>\n\n\n\n<p>Did you create templates and merge the data on a build server (your local computer counts) to generate pages for each of your routes? Then you&#8217;ve rendered on the build server.<\/p>\n\n\n\n<p>Did you write code that allows users to be served unique pages based on permissions, queries, routes, etc.? Then your site is rendered on the server!<\/p>\n\n\n\n<p>Did you write a basic HTML file that all routes share, and you use JavaScript in the browser to render elements of HTML and fetch data based on their permissions, queries, route, etc? Then you&#8217;ve generated the final HTML on the client!<\/p>\n\n\n\n<p>Hopefully, this makes sense, and don&#8217;t worry; we&#8217;ll give relevance and talk more in-depth about these soon.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">When?<\/h2>\n\n\n\n<p>The <em>when<\/em> of rendering is more&#8230;complicated. But let&#8217;s start with the examples above.<\/p>\n\n\n\n<p>If you rendered your site in an editor, the <em>when<\/em> would be called &#8220;author time.&#8221; But you can&#8217;t not write something when you write something. This distinction is pedantic. For the sake of this discussion, &#8220;Author Time Rendering&#8221; doesn&#8217;t matter because it is uniquely tied to its <em>where<\/em>. Let&#8217;s forget about it and focus on all computer-based rendering methods.<\/p>\n\n\n\n<p>If you render something on a build server(SSG), this could be done when you trigger the task manually, via webhook, via git merge, etc. Any number of <em>events<\/em> can trigger a build on a server.&nbsp;<\/p>\n\n\n\n<p>If you have code running on a runtime server(SSR) it traditionally renders on receipt of an HTTP request.&nbsp;<\/p>\n\n\n\n<p>Finally, client-side rendering (CSR) is done when the page is loaded or upon a user event such as a button click or page scroll. I hope the client-side is well understood, I&#8217;m not going to get much into this here.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">The future of rendering<\/h1>\n\n\n\n<p>I won&#8217;t speak for everyone, but for myself, I&#8217;ve always (incorrectly) thought of rendering as a very black and white thing. I can have SSG, SSR, or CSR (client-side). Traditionally this has been true, but with new technology has come new possibilities. We need to recognize these names only describe the <em>where<\/em> of rendering.<\/p>\n\n\n\n<p>The future of rendering has to happen in one of these three places.&nbsp; But, by playing with <em>when <\/em>they happen, or even combining strategies, we can create some really great new patterns to further expand what\u2019s possible in web development. Let\u2019s talk about how this has already started to happen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Hybrid rendering<\/h2>\n\n\n\n<p>Hybrid rendering isn&#8217;t a new space. Gatsby, Next, Nuxt, and others have been doing this for years at this point. But not everyone realizes this, so I&#8217;ll give a quick overview.&nbsp;<\/p>\n\n\n\n<p>Let&#8217;s imagine we have a page with some user interface element that allows them to load additional content. The user navigates to the page. How did the initial HTML get to the browser? Was it just shipped from a static file? Generated by a server?&nbsp; Written to the DOM by JS? Well, what did the button do? Was the HTML already in the browser, and the JS modified the CSS classes to show the content?&nbsp; Or did it fetch data from an API and add HTML?<\/p>\n\n\n\n<p>For this exercise, let&#8217;s presume the site was built with an SSG. Then some JS loads specific data from an API upon the user action. In this case, we have a site mainly generated on the build server, but a small part was rendered on the client. I&#8217;d call this hybrid rendering, specifically SSG + CSR. Gatsby and Next can statically build most of your site and fetch the dynamic bits on the client, automatically or by user action. React Hydration helps enable this.\u00a0<\/p>\n\n\n\n<p>This pattern lets us build more app-like experiences that require heavy client-side code. But solve the SPA problem of not pre-rendering anything. It gives us the performance benefits of SSG, with the flexibility of a SPA.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Build time<\/h2>\n\n\n\n<p>Build server rendering is an exciting space right now. Netlify and the Jamstack have helped drive innovation here over the last ~5 years or so. Two big cases stand out to me. Netlify&#8217;s own <a href=\"https:\/\/www.netlify.com\/blog\/2021\/04\/14\/distributed-persistent-rendering-a-new-jamstack-approach-for-faster-builds\/\">DPR<\/a>, and Gatsby Cloud&#8217;s <a href=\"https:\/\/www.gatsbyjs.com\/blog\/2020-04-22-announcing-incremental-builds\/\">Incremental Builds<\/a>. Both of these platforms serve content from static file hosting (s3 bucket). In DPR&#8217;s case (if I understand it correctly), a route that doesn&#8217;t exist triggers a build, but cloud magic happens since there is no runtime server, and a build server generates that page. In the case of Gatsby Cloud, the request can&#8217;t create a build like in the case of DPR, but a webhook event due to a data change or code change triggers a build. Gatsby&#8217;s internals goes to work, figure out what&#8217;s needed, and you get a new page.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">It&#8217;s SSG! It&#8217;s SSR! No, it&#8217;s ISR\/DSG\/DPR, aka &#8220;the new hotness&#8221;!<\/h2>\n\n\n\n<p>5+ years ago, the only <em>when<\/em> an SSG had access to was &#8220;build time.&#8221; With the advent of the Jamstack, Gatsby, Netlify, and headless CMSes we started connecting the CMS to our build pipelines. Maybe it&#8217;s been longer, I won&#8217;t pretend that 5 years isn&#8217;t a guess. My point is this only somewhat recently became common, and mainstream. The fundamental issue with SSG is the time it takes to build the site. Small sites are fine, but you try to generate 100s or 1000s of pages and your build times shoot through the roof to the dismay of content publishers (silly publishers, only if devs didn&#8217;t have to deal with them we could have perfect tech \ud83d\ude1d). Gatsby and others have pioneered features like <a href=\"https:\/\/www.gatsbyjs.com\/blog\/2020-04-22-announcing-incremental-builds\/\">incremental builds<\/a> to accelerate the build process, but a lot of cloud magic isn&#8217;t necessarily available unless you buy their products.<\/p>\n\n\n\n<p>This &#8220;build time&#8221; issue brought the Jamstack world back to Next and SSR. Yes, static files were fast, and atomic deploys were nice. But we&#8217;ve been scaling server-side apps for 2+ decades now since the advent of PHP and ASPX. It&#8217;s easy! (spoiler, it&#8217;s not). But you&#8217;re fighting physics when you have to process and render HTML on the server vs loading it from a CDN. We&#8217;re stuck, both methods have benefits and drawbacks. How do we solve these problems?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Next<\/strong><\/h3>\n\n\n\n<p>Next solved this by shipping Incremental Static Regeneration. Which, despite the word &#8220;static&#8221; in the title, and some other limitations, it&#8217;s SSR + a <a href=\"https:\/\/web.dev\/stale-while-revalidate\/\">stale-while-revalidate<\/a> (SWR) cache to allow deferring the rendering from build time to later. Next&#8217;s ISR has its issues, but I think it&#8217;s the first in a new era of rendering patterns.<\/p>\n\n\n\n<p>The genius of ISR is that it took the SSG technology in Next, shipped it to the server, and put it behind an SWR cache. This means Next is not doing &#8220;SSG&#8221; on your site. The build step packages up available routes and JS\/CSS files but the actual HTML render is on the server. It&#8217;s actually SSR. But, instead of rendering on every request, it only renders on the first request, and subsequently after the cache has been invalidated by a timeout.<\/p>\n\n\n\n<p>Next has taken the traditional idea of <em>where<\/em> of SSR and modified it&#8217;s traditional <em>when<\/em> from being on every request, to only when the cache is invalidated. Genius.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Gatsby<\/strong><\/h3>\n\n\n\n<p>Gatsby <a href=\"https:\/\/www.gatsbyjs.com\/gatsby-4\/\">just announced<\/a> some very exciting features: Deferred Static Generation(DSG), and Server Side Rendering(SSR). SSR is exactly as it seems. The request comes in, content is fetched, a page is rendered, the response is sent. Nothing unique, but cool that Gatsby is supporting this.\u00a0<\/p>\n\n\n\n<p>DSG is what we really need to talk about. You may be wondering, is this like Next&#8217;s ISR? The answer is, kinda, but different. I&#8217;d say, better. For context, Gatsby&#8217;s defining feature is its <a href=\"https:\/\/www.gatsbyjs.com\/docs\/reference\/graphql-data-layer\/\">GraphQL data layer<\/a>. This allows Gatsby to know everything about your site and what content is on what page. This enables some cool things.\u00a0<\/p>\n\n\n\n<p>So, for DSG, just like ISR, a deferred page is not built at build time. Instead, it&#8217;s, wait for it, deferred. When the first request comes in for a page its data is fetched from the data layer and the HTML is rendered. That is cached and subsequent responses should be from a cache. Sounds a lot like ISR, right? Well, this is where the similarities end.\u00a0<\/p>\n\n\n\n<p>Because Gatsby knows where every piece of content is on your site, when it receives a notification(usually a webhook) that data has changed, it can invalidate all the routes that use that data. This has a huge win over time-based cache invalidation because while one route might never be updated, another might get updates every 2 minutes. Both will be invalidated only when the rebuild is required.&nbsp;<\/p>\n\n\n\n<p>Gatsby has taken SSR and modified the <em>when<\/em> to be when the data populating the page is changed.&nbsp;<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Conclusion<\/h1>\n\n\n\n<p>It&#8217;ll be cool to see where we are with rendering patterns and the web in another couple of years and how much more scalable and flexible our frameworks become. Request time SSR is great and has its place. But I&#8217;m really looking forward to seeing how we can continue to scale &#8220;static&#8221; site generators to enable a more performant web.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I recently had a deep discussion on a GitHub RFC about what to call a rendering pattern and was very confused about the other person&#8217;s perspective. I have a degree [&hellip;]<\/p>\n","protected":false},"author":25,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_EventAllDay":false,"_EventTimezone":"","_EventStartDate":"","_EventEndDate":"","_EventStartDateUTC":"","_EventEndDateUTC":"","_EventShowMap":false,"_EventShowMapLink":false,"_EventURL":"","_EventCost":"","_EventCostDescription":"","_EventCurrencySymbol":"","_EventCurrencyCode":"","_EventCurrencyPosition":"","_EventDateTimeSeparator":"","_EventTimeRangeSeparator":"","_EventOrganizerID":[],"_EventVenueID":[],"_OrganizerEmail":"","_OrganizerPhone":"","_OrganizerWebsite":"","_VenueAddress":"","_VenueCity":"","_VenueCountry":"","_VenueProvince":"","_VenueState":"","_VenueZip":"","_VenuePhone":"","_VenueURL":"","_VenueStateProvince":"","_VenueLat":"","_VenueLng":"","_VenueShowMap":false,"_VenueShowMapLink":false,"footnotes":""},"categories":[23],"tags":[],"class_list":["post-320","post","type-post","status-publish","format-standard","hentry","category-headless"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>The When and Where of Rendering - Builders<\/title>\n<meta name=\"description\" content=\"Explore the difference between server-side, client-side, and static-site rendering, and the potential for hybrid rendering.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wpengine.com\/builders\/the-when-and-where-of-rendering\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"The When and Where of Rendering - Builders\" \/>\n<meta property=\"og:description\" content=\"Explore the difference between server-side, client-side, and static-site rendering, and the potential for hybrid rendering.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wpengine.com\/builders\/the-when-and-where-of-rendering\/\" \/>\n<meta property=\"og:site_name\" content=\"Builders\" \/>\n<meta property=\"article:published_time\" content=\"2021-10-26T23:29:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-04-19T14:53:51+00:00\" \/>\n<meta name=\"author\" content=\"Alex Moon\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@moon_meister\" \/>\n<meta name=\"twitter:site\" content=\"@wpebuilders\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Alex Moon\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/the-when-and-where-of-rendering\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/the-when-and-where-of-rendering\\\/\"},\"author\":{\"name\":\"Alex Moon\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#\\\/schema\\\/person\\\/868e9d9f8b846000f45cc7a25f46255a\"},\"headline\":\"The When and Where of Rendering\",\"datePublished\":\"2021-10-26T23:29:01+00:00\",\"dateModified\":\"2023-04-19T14:53:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/the-when-and-where-of-rendering\\\/\"},\"wordCount\":2011,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#organization\"},\"articleSection\":[\"Headless\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/wpengine.com\\\/builders\\\/the-when-and-where-of-rendering\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/the-when-and-where-of-rendering\\\/\",\"url\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/the-when-and-where-of-rendering\\\/\",\"name\":\"The When and Where of Rendering - Builders\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#website\"},\"datePublished\":\"2021-10-26T23:29:01+00:00\",\"dateModified\":\"2023-04-19T14:53:51+00:00\",\"description\":\"Explore the difference between server-side, client-side, and static-site rendering, and the potential for hybrid rendering.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/the-when-and-where-of-rendering\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wpengine.com\\\/builders\\\/the-when-and-where-of-rendering\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/the-when-and-where-of-rendering\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"The When and Where of Rendering\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#website\",\"url\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/\",\"name\":\"Builders\",\"description\":\"Reimagining the way we build with WordPress.\",\"publisher\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#organization\",\"name\":\"WP Engine\",\"url\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/wp-content\\\/uploads\\\/2024\\\/05\\\/WP-Engine-Horizontal@2x.png\",\"contentUrl\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/wp-content\\\/uploads\\\/2024\\\/05\\\/WP-Engine-Horizontal@2x.png\",\"width\":348,\"height\":68,\"caption\":\"WP Engine\"},\"image\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/wpebuilders\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCh1WuL54XFb9ZI6m6goFv1g\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#\\\/schema\\\/person\\\/868e9d9f8b846000f45cc7a25f46255a\",\"name\":\"Alex Moon\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e751c6c4033ab32c97e38f1c218b0f11070378a7c7b797539c497ca289b4f205?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e751c6c4033ab32c97e38f1c218b0f11070378a7c7b797539c497ca289b4f205?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e751c6c4033ab32c97e38f1c218b0f11070378a7c7b797539c497ca289b4f205?s=96&d=mm&r=g\",\"caption\":\"Alex Moon\"},\"description\":\"Alex Moon is a Developer Advocate at WP Engine. He's been working in Open Source for over a decade and headless WordPress since the early days of WP GraphQL. When he's not writing code he's often found in the mountains or sailing the seas. Follow him on X or Bluesky for more headless WordPress goodness!\",\"sameAs\":[\"https:\\\/\\\/gurugoes.net\",\"https:\\\/\\\/x.com\\\/moon_meister\"],\"url\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/author\\\/alexmoon-2-2-2-2-2-2-2-2-2-2-2-2-2-2\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"The When and Where of Rendering - Builders","description":"Explore the difference between server-side, client-side, and static-site rendering, and the potential for hybrid rendering.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wpengine.com\/builders\/the-when-and-where-of-rendering\/","og_locale":"en_US","og_type":"article","og_title":"The When and Where of Rendering - Builders","og_description":"Explore the difference between server-side, client-side, and static-site rendering, and the potential for hybrid rendering.","og_url":"https:\/\/wpengine.com\/builders\/the-when-and-where-of-rendering\/","og_site_name":"Builders","article_published_time":"2021-10-26T23:29:01+00:00","article_modified_time":"2023-04-19T14:53:51+00:00","author":"Alex Moon","twitter_card":"summary_large_image","twitter_creator":"@moon_meister","twitter_site":"@wpebuilders","twitter_misc":{"Written by":"Alex Moon","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wpengine.com\/builders\/the-when-and-where-of-rendering\/#article","isPartOf":{"@id":"https:\/\/wpengine.com\/builders\/the-when-and-where-of-rendering\/"},"author":{"name":"Alex Moon","@id":"https:\/\/wpengine.com\/builders\/#\/schema\/person\/868e9d9f8b846000f45cc7a25f46255a"},"headline":"The When and Where of Rendering","datePublished":"2021-10-26T23:29:01+00:00","dateModified":"2023-04-19T14:53:51+00:00","mainEntityOfPage":{"@id":"https:\/\/wpengine.com\/builders\/the-when-and-where-of-rendering\/"},"wordCount":2011,"commentCount":0,"publisher":{"@id":"https:\/\/wpengine.com\/builders\/#organization"},"articleSection":["Headless"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/wpengine.com\/builders\/the-when-and-where-of-rendering\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/wpengine.com\/builders\/the-when-and-where-of-rendering\/","url":"https:\/\/wpengine.com\/builders\/the-when-and-where-of-rendering\/","name":"The When and Where of Rendering - Builders","isPartOf":{"@id":"https:\/\/wpengine.com\/builders\/#website"},"datePublished":"2021-10-26T23:29:01+00:00","dateModified":"2023-04-19T14:53:51+00:00","description":"Explore the difference between server-side, client-side, and static-site rendering, and the potential for hybrid rendering.","breadcrumb":{"@id":"https:\/\/wpengine.com\/builders\/the-when-and-where-of-rendering\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wpengine.com\/builders\/the-when-and-where-of-rendering\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/wpengine.com\/builders\/the-when-and-where-of-rendering\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wpengine.com\/builders\/"},{"@type":"ListItem","position":2,"name":"The When and Where of Rendering"}]},{"@type":"WebSite","@id":"https:\/\/wpengine.com\/builders\/#website","url":"https:\/\/wpengine.com\/builders\/","name":"Builders","description":"Reimagining the way we build with WordPress.","publisher":{"@id":"https:\/\/wpengine.com\/builders\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wpengine.com\/builders\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/wpengine.com\/builders\/#organization","name":"WP Engine","url":"https:\/\/wpengine.com\/builders\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/wpengine.com\/builders\/#\/schema\/logo\/image\/","url":"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2024\/05\/WP-Engine-Horizontal@2x.png","contentUrl":"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2024\/05\/WP-Engine-Horizontal@2x.png","width":348,"height":68,"caption":"WP Engine"},"image":{"@id":"https:\/\/wpengine.com\/builders\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/wpebuilders","https:\/\/www.youtube.com\/channel\/UCh1WuL54XFb9ZI6m6goFv1g"]},{"@type":"Person","@id":"https:\/\/wpengine.com\/builders\/#\/schema\/person\/868e9d9f8b846000f45cc7a25f46255a","name":"Alex Moon","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/e751c6c4033ab32c97e38f1c218b0f11070378a7c7b797539c497ca289b4f205?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/e751c6c4033ab32c97e38f1c218b0f11070378a7c7b797539c497ca289b4f205?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e751c6c4033ab32c97e38f1c218b0f11070378a7c7b797539c497ca289b4f205?s=96&d=mm&r=g","caption":"Alex Moon"},"description":"Alex Moon is a Developer Advocate at WP Engine. He's been working in Open Source for over a decade and headless WordPress since the early days of WP GraphQL. When he's not writing code he's often found in the mountains or sailing the seas. Follow him on X or Bluesky for more headless WordPress goodness!","sameAs":["https:\/\/gurugoes.net","https:\/\/x.com\/moon_meister"],"url":"https:\/\/wpengine.com\/builders\/author\/alexmoon-2-2-2-2-2-2-2-2-2-2-2-2-2-2\/"}]}},"_links":{"self":[{"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/posts\/320","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/users\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/comments?post=320"}],"version-history":[{"count":0,"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/posts\/320\/revisions"}],"wp:attachment":[{"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/media?parent=320"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/categories?post=320"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/tags?post=320"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}