<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jade Chou</title>
    <description>The latest articles on DEV Community by Jade Chou (@jade_chou).</description>
    <link>https://dev.to/jade_chou</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3777142%2F628051d3-c43f-4c6d-a718-b1243357bf15.png</url>
      <title>DEV Community: Jade Chou</title>
      <link>https://dev.to/jade_chou</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jade_chou"/>
    <language>en</language>
    <item>
      <title>NextJS Codebase Analysis(3) - how's server props and static props work?</title>
      <dc:creator>Jade Chou</dc:creator>
      <pubDate>Wed, 18 Mar 2026 16:01:10 +0000</pubDate>
      <link>https://dev.to/jade_chou/nextjs-codebase-analysis3-hows-server-props-and-static-props-work-29em</link>
      <guid>https://dev.to/jade_chou/nextjs-codebase-analysis3-hows-server-props-and-static-props-work-29em</guid>
      <description>&lt;p&gt;As we all know, &lt;strong&gt;Server Components are not allowed to use hooks like &lt;code&gt;useState&lt;/code&gt; and &lt;code&gt;useEffect&lt;/code&gt;&lt;/strong&gt;—but &lt;em&gt;why&lt;/em&gt;?&lt;/p&gt;




&lt;h2&gt;
  
  
  🚧 Understanding the Request Flow
&lt;/h2&gt;

&lt;p&gt;Let’s start from a typical page request. When a request comes in (and possibly hits the cache), it flows through several key functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;handleResponse&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;doRender&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;renderToHTMLOrFlightImpl&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;generateCacheEntry&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;code&gt;generateCacheEntry&lt;/code&gt; is the core of Next.js caching strategy.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fki40f1ls4vatvd6ln2qc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fki40f1ls4vatvd6ln2qc.png" alt=" " width="582" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔑 Key Parameters in &lt;code&gt;generateCacheEntry&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;From the function signature, we can identify some critical parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;encodeCacheKeyParts&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;fn&lt;/code&gt; (the actual render function)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F06pwsqqnvczeuaesdpqr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F06pwsqqnvczeuaesdpqr.png" alt=" " width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Cache Keys and Server References
&lt;/h2&gt;

&lt;p&gt;Taking a deeper look at &lt;strong&gt;&lt;code&gt;encodeCacheKeyParts&lt;/code&gt;&lt;/strong&gt;, we notice something important:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;It generates keys that match those in &lt;code&gt;server-reference-manifest.json&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This connects directly to concepts discussed in the previous article.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each page/component has a &lt;strong&gt;corresponding cache key&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;These keys are &lt;strong&gt;heavily used across Next.js internals&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpt0thicyjpm2jm1x0dvp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpt0thicyjpm2jm1x0dvp.png" alt=" " width="800" height="508"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ The Core Execution: &lt;code&gt;generateCacheEntryImpl&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Continuing down the call stack, we reach:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;generateCacheEntryImpl&lt;/code&gt; — where rendering actually happens&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here, we encounter a key variable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;requestPromise&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 This is crucial:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server Components can be &lt;strong&gt;&lt;code&gt;async&lt;/code&gt; functions&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;requestPromise&lt;/code&gt; represents the execution of the component itself&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Once resolved, the result is &lt;strong&gt;streamed to the client&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foz07cnnom6bn8imeo9n4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foz07cnnom6bn8imeo9n4.png" alt=" " width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⏱️ Cache Expiration Strategy
&lt;/h2&gt;

&lt;p&gt;Next.js also implements a &lt;strong&gt;time-based cache invalidation strategy&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When &lt;code&gt;cache&lt;/code&gt; is invoked:

&lt;ul&gt;
&lt;li&gt;It calculates the &lt;strong&gt;current time&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Compares it with the &lt;strong&gt;expiration time defined by the developer&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Based on this, it decides:&lt;/li&gt;

&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Should we reuse the cache or regenerate it?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1fhxxonohrgx1ncid3c5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1fhxxonohrgx1ncid3c5.png" alt=" " width="800" height="322"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🗂️ Cache Retrieval
&lt;/h2&gt;

&lt;p&gt;Cache entries are retrieved using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Page key&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Page path (&lt;code&gt;serializedCacheKey&lt;/code&gt;)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0x1e5y65kps1etd6nvv5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0x1e5y65kps1etd6nvv5.png" alt=" " width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📌 Example
&lt;/h3&gt;

&lt;p&gt;For the URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000/blog/2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The dynamic parameter:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This value becomes part of the cache key&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 So… Why No Hooks in Server Components?
&lt;/h2&gt;

&lt;p&gt;Now that we understand the flow, the reason becomes clearer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Server Components are designed to be pure, stateless, and cacheable.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Hooks like &lt;code&gt;useState&lt;/code&gt; and &lt;code&gt;useEffect&lt;/code&gt;:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Depend on &lt;strong&gt;client-side lifecycle&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Require &lt;strong&gt;persistent state between renders&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  But Server Components:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Are executed &lt;strong&gt;once per request (or cache hit)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Produce a &lt;strong&gt;deterministic output&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Are &lt;strong&gt;serialized and streamed&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;Allowing hooks would break caching, determinism, and streaming guarantees.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Key Takeaway
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Server Components trade interactivity for performance and scalability.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They work because they are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stateless&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deterministic&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cache-friendly&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that’s exactly why hooks like &lt;code&gt;useState&lt;/code&gt; and &lt;code&gt;useEffect&lt;/code&gt; are not allowed.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>javascript</category>
      <category>nextjs</category>
      <category>react</category>
    </item>
    <item>
      <title>NextJs Codebase Analysis (2) - manifests</title>
      <dc:creator>Jade Chou</dc:creator>
      <pubDate>Sun, 08 Mar 2026 14:03:58 +0000</pubDate>
      <link>https://dev.to/jade_chou/nextjs-codebase-analysis-2-manifests-522b</link>
      <guid>https://dev.to/jade_chou/nextjs-codebase-analysis-2-manifests-522b</guid>
      <description>&lt;h2&gt;
  
  
  Terminology
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;App Router&lt;/strong&gt; → New routing system using &lt;code&gt;/app&lt;/code&gt; (&lt;strong&gt;Next.js 13+&lt;/strong&gt;)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pages Router&lt;/strong&gt; → Legacy routing using &lt;code&gt;/pages&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSR&lt;/strong&gt; → &lt;strong&gt;Server-Side Rendering&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSG&lt;/strong&gt; → &lt;strong&gt;Static Site Generation&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ISR&lt;/strong&gt; → &lt;strong&gt;Incremental Static Regeneration&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSR&lt;/strong&gt; → &lt;strong&gt;Client-Side Rendering&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RSC&lt;/strong&gt; → &lt;strong&gt;React Server Components&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SPA&lt;/strong&gt; → &lt;strong&gt;Single Page Application&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's the function of these manifest?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Next.js manifest files are runtime metadata maps generated at build time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They tell &lt;strong&gt;Next.js exactly which files, module IDs, and extra metadata belong to each page or component&lt;/strong&gt;. This allows the runtime to quickly resolve dependencies &lt;strong&gt;without re-scanning the project source during execution&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;More specifically, these manifests allow the &lt;strong&gt;server and client runtimes&lt;/strong&gt; to locate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Correct &lt;strong&gt;JS/CSS chunks&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RSC (React Server Components) client references&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SRI hashes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Server Action metadata&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Page/component dependency mappings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;In short: manifests act as lookup tables that power the Next.js runtime.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They ensure that the framework can efficiently load the correct resources for a given request.&lt;/p&gt;




&lt;p&gt;Take &lt;strong&gt;&lt;code&gt;app-paths-manifest.json&lt;/code&gt;&lt;/strong&gt; for example.&lt;/p&gt;

&lt;p&gt;It is typically located at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.next/dev/server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This file &lt;strong&gt;maps application routes to their compiled output files&lt;/strong&gt;, effectively describing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Which paths exist in the application&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Which compiled chunks belong to each path&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So when a request arrives, &lt;strong&gt;Next.js doesn't need to discover routes dynamically&lt;/strong&gt; — it simply consults this manifest.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9gf08i4fiuitlfn799pj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9gf08i4fiuitlfn799pj.png" alt=" " width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1gsff24bgyayoaqfk3wy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1gsff24bgyayoaqfk3wy.png" alt=" " width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why do some manifests contain encryption keys?
&lt;/h2&gt;

&lt;p&gt;If we inspect &lt;strong&gt;&lt;code&gt;server-reference-manifest.json&lt;/code&gt;&lt;/strong&gt;, we can see that it includes an &lt;strong&gt;&lt;code&gt;encryptionKey&lt;/code&gt;&lt;/strong&gt; field.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fum5plng7t52kwwclx8l6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fum5plng7t52kwwclx8l6.png" alt=" " width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's examine a &lt;strong&gt;real manifest entry&lt;/strong&gt; to better understand this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwb17s82nk5xexpz7k1py.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwb17s82nk5xexpz7k1py.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this example, I created a &lt;strong&gt;Server Action&lt;/strong&gt; inside my &lt;code&gt;DemoActionPage&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When Next.js compiles the project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The page is &lt;strong&gt;registered as a node inside &lt;code&gt;server-reference-manifest&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Any &lt;strong&gt;exported server actions are recorded&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Each action is assigned a &lt;strong&gt;stable identifier&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; &lt;code&gt;server-reference-manifest&lt;/code&gt; is generated by&lt;br&gt;&lt;br&gt;
&lt;code&gt;packages\next\src\build\webpack\plugins\flight-client-entry-plugin.ts&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0hshll20vs3ndfso2ow.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0hshll20vs3ndfso2ow.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  How Server Actions are linked to the client
&lt;/h3&gt;

&lt;p&gt;When the server sends HTML to the browser, &lt;strong&gt;Server Actions are embedded into the markup using a hidden action binding&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Each action is associated with a &lt;strong&gt;unique action ID&lt;/strong&gt;, which corresponds &lt;strong&gt;exactly to the key stored in &lt;code&gt;server-reference-manifest.json&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhnblifd0hfsnrwy9ty5k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhnblifd0hfsnrwy9ty5k.png" alt=" " width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How Server Action encryption works
&lt;/h2&gt;

&lt;p&gt;The encryption logic used for Server Actions actually comes from &lt;strong&gt;React itself&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can see the implementation here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/facebook/react/blob/942eb80381b96f8410eab1bef1c539bed1ab0eb1/packages/react-client/src/ReactFlightReplyClient.js#L1026" rel="noopener noreferrer"&gt;https://github.com/facebook/react/blob/942eb80381b96f8410eab1bef1c539bed1ab0eb1/packages/react-client/src/ReactFlightReplyClient.js#L1026&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every time a Server Action is invoked from the client:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The browser sends a &lt;strong&gt;POST request&lt;/strong&gt; containing the action payload.&lt;/li&gt;
&lt;li&gt;The payload includes &lt;strong&gt;encrypted action metadata and bound variables&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Next.js server validates and decrypts the payload&lt;/strong&gt; before executing the action.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This validation happens inside:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;packages\next\src\server\app-render\action-handler.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fumwn6hhm3ehcmjp2h8m2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fumwn6hhm3ehcmjp2h8m2.png" alt=" " width="800" height="689"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The server checks the request against its local manifest map&lt;/strong&gt;, ensuring that the action ID is valid.&lt;/p&gt;

&lt;p&gt;This mechanism &lt;strong&gt;prevents action tampering or unauthorized invocation.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How the encryption key protects server variables
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Next.js documentation&lt;/strong&gt; mentions that the encryption key is used to &lt;strong&gt;protect closure variables from being exposed to the client.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2tvyb56g5bs150jxnhlk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2tvyb56g5bs150jxnhlk.png" alt=" " width="800" height="868"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's reproduce this behavior locally to better understand it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7qdllm7rvwnaw3uh5et.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7qdllm7rvwnaw3uh5et.png" alt=" " width="726" height="515"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When a user clicks the element that triggers the Server Action:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A request is sent to the &lt;strong&gt;Next.js server&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The request payload includes &lt;strong&gt;multiple encrypted parameters&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqvdfh2efji48fwsr9w9j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqvdfh2efji48fwsr9w9j.png" alt=" " width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These parameters originate from &lt;strong&gt;closure variables captured by the Server Action&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The lifecycle looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Variables are &lt;strong&gt;generated on the server&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;They are &lt;strong&gt;encrypted before being sent to the client&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The client later &lt;strong&gt;invokes the action&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The encrypted values are &lt;strong&gt;sent back to the server inside the request payload&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  What happens on the server during execution
&lt;/h2&gt;

&lt;p&gt;If we inspect the &lt;strong&gt;compiled server bundle&lt;/strong&gt;, we can see that Server Actions are transformed into a function wrapper.&lt;/p&gt;

&lt;p&gt;This wrapper contains the &lt;strong&gt;same encryption key used during compilation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;During execution, the runtime calls:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;decryptActionBoundArgs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses the &lt;strong&gt;encryption key&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Uses &lt;strong&gt;&lt;code&gt;action_closure_bound&lt;/code&gt;&lt;/strong&gt; data&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Decrypts the original closure variables&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa6siosk11eka3pe4fndi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa6siosk11eka3pe4fndi.png" alt=" " width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After decryption, the &lt;strong&gt;real variable values are restored&lt;/strong&gt; and the action is executed normally.&lt;/p&gt;

&lt;p&gt;Because the action runs &lt;strong&gt;on the server&lt;/strong&gt;, any logging will appear &lt;strong&gt;in the server terminal rather than the browser console&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2av9lpye3m41kplv78w6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2av9lpye3m41kplv78w6.png" alt=" " width="794" height="225"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Key takeaway
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Next.js Server Action encryption exists to guarantee two things:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Action integrity&lt;/strong&gt; — preventing clients from forging or modifying action calls
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Closure protection&lt;/strong&gt; — ensuring server-side variables captured by actions are never exposed in plaintext&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>github</category>
    </item>
    <item>
      <title>NextJs Codebase Analysis (1) - render callstacks</title>
      <dc:creator>Jade Chou</dc:creator>
      <pubDate>Mon, 23 Feb 2026 16:41:01 +0000</pubDate>
      <link>https://dev.to/jade_chou/nextjs-codebase-analysis-1-render-callstacks-5gbk</link>
      <guid>https://dev.to/jade_chou/nextjs-codebase-analysis-1-render-callstacks-5gbk</guid>
      <description>&lt;h2&gt;
  
  
  Terminology
&lt;/h2&gt;

&lt;p&gt;App Router → New routing system using /app (Next.js 13+)&lt;/p&gt;

&lt;p&gt;Pages Router → Legacy routing using /pages&lt;/p&gt;

&lt;p&gt;SSR → Server-Side Rendering&lt;/p&gt;

&lt;p&gt;SSG → Static Site Generation&lt;/p&gt;

&lt;p&gt;ISR → Incremental Static Regeneration&lt;/p&gt;

&lt;p&gt;CSR → Client-Side Rendering&lt;/p&gt;

&lt;p&gt;RSC → React Server Components&lt;/p&gt;

&lt;p&gt;SPA → Single Page Application&lt;/p&gt;

&lt;h2&gt;
  
  
  Beginning of everything: &lt;code&gt;renderImpl&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Source code path: &lt;code&gt;packages/next/src/server/render.tsx&lt;/code&gt;&lt;br&gt;
&lt;a href="https://github.com/vercel/next.js" rel="noopener noreferrer"&gt;https://github.com/vercel/next.js&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;handleRequest&lt;/span&gt;
&lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="nx"&gt;handleRequestImpl&lt;/span&gt;
&lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="nx"&gt;handleCatchallRenderRequest&lt;/span&gt;
&lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="nx"&gt;render&lt;/span&gt;
&lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="c1"&gt;// response html according to client end's request.&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;renderImpl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="nx"&gt;parsedUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;internalRender&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;renderToResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// request instance&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// response instance&lt;/span&gt;
    &lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// request page path from client end, '/page/a', '/page/c', etc&lt;/span&gt;
    &lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="c1"&gt;// params in request url, '?start=2&amp;amp;side=10'.&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="nx"&gt;renderToResponse&lt;/span&gt;
&lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="nx"&gt;renderToResponseImpl&lt;/span&gt;
&lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="nx"&gt;renderToResponseImpl&lt;/span&gt;
&lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;renderPageComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// serialize current request path, and get coordinating Component,&lt;/span&gt;
    &lt;span class="na"&gt;renderOpts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;renderOpts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;bubbleNoFallback&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="nx"&gt;renderPageComponent&lt;/span&gt;
&lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;renderToResponseWithComponents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="nx"&gt;renderToResponseWithComponentsImpl&lt;/span&gt;
&lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;components&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ComponentMod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;handlerReq&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handlerRes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;waitUntil&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getWaitUntil&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  get page component &lt;code&gt;findPageComponents&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The rendering of a NextJs Page start with a path, Let's reusing the example on  NextJs Doc website for demonstration, &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3mrx1jurv5dm5e9awd5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3mrx1jurv5dm5e9awd5.png" alt=" " width="800" height="576"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;it might be &lt;code&gt;"/page"&lt;/code&gt;, it will trigger &lt;code&gt;renderImpl&lt;/code&gt; to analyze its path, and find target component path in &lt;code&gt;renderPageComponent&lt;/code&gt;, invoke the function &lt;code&gt;findPageComponentsImpl&lt;/code&gt; at &lt;code&gt;packages/next/src/server/next-server.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;renderPageComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;RequestContext&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ServerRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ServerResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// omitted.........&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pathname&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;appPaths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getOriginalAppPaths&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pathname&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findPageComponents&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="c1"&gt;// get coordinate component by current request path.&lt;/span&gt;
    &lt;span class="na"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;getRequestMeta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;locale&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;renderOpts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
    &lt;span class="c1"&gt;// ................&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;renderToResponseWithComponents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// render component and set result on response instance.&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will keeping invoke function &lt;code&gt;loadComponentsImpl&lt;/code&gt; at &lt;code&gt;packages/next/src/server/load-components.ts&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7di5qjsskoa3askc485.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7di5qjsskoa3askc485.png" alt=" " width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9y5vlub1rcks428hmmb5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9y5vlub1rcks428hmmb5.png" alt=" " width="800" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F85jqr9yy02jlwu5q7rov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F85jqr9yy02jlwu5q7rov.png" alt=" " width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprtq67qokf6el7m4s7ia.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprtq67qokf6el7m4s7ia.png" alt=" " width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;we can see &lt;code&gt;NextJs&lt;/code&gt; built server-side bundles under &lt;code&gt;.next&lt;/code&gt;, it will be files in &lt;code&gt;dev/server/app&lt;/code&gt; that request files under &lt;code&gt;/chunks/ssr&lt;/code&gt;(server-side-only) to consist of a intact resource.&lt;/p&gt;

&lt;h2&gt;
  
  
  using component to &lt;code&gt;sendRenderResult&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxzl8xi8yz4crel700up.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxzl8xi8yz4crel700up.png" alt=" " width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After found target page component, lest keeping on plumbing logic of &lt;code&gt;renderToResponseWithComponents&lt;/code&gt;&lt;br&gt;
&lt;code&gt;renderToResponseWithComponents&lt;/code&gt; &amp;gt; &lt;code&gt;renderToResponseWithComponentsImpl&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;renderToResponseWithComponentsImpl&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="c1"&gt;// omitted.................&lt;/span&gt;
 &lt;span class="c1"&gt;// propagate the request context for dev&lt;/span&gt;
 &lt;span class="nf"&gt;setRequestMeta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;getRequestMeta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
 &lt;span class="nf"&gt;addRequestMeta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;distDir&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;distDir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="nx"&gt;addRequestMeta&lt;/span&gt;&lt;span class="p"&gt;.....&lt;/span&gt; &lt;span class="nx"&gt;omitted&lt;/span&gt;

 &lt;span class="c1"&gt;// use previous required component to render result on response instance&lt;/span&gt;
 &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;components&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ComponentMod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;handlerReq&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handlerRes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;waitUntil&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getWaitUntil&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;handler&lt;/code&gt; is locate at &lt;code&gt;packages\next\src\build\templates\app-page.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prepareResult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;routeModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;srcPage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;multiZoneDraftMode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="c1"&gt;// omitted..............&lt;/span&gt;


  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;handleResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;activeSpan&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can just focus on &lt;code&gt;handleResponse&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cacheEntry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;routeModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;handleResponse&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;cacheKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ssgCacheKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;responseGenerator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
      &lt;span class="nf"&gt;responseGenerator&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="nx"&gt;span&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="na"&gt;routeKind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;RouteKind&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;APP_PAGE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;prerenderManifest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// omitted...........&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cachedData&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cacheEntry&lt;/span&gt;&lt;span class="err"&gt;；&lt;/span&gt;

  &lt;span class="c1"&gt;// This is a request for HTML data.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cachedData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="err"&gt;；&lt;/span&gt;

  &lt;span class="c1"&gt;// If there's no postponed state, we should just serve the HTML. This&lt;/span&gt;
&lt;span class="c1"&gt;// should also be the case for a resume request because it's completed&lt;/span&gt;
&lt;span class="c1"&gt;// as a server render (rather than a static render).&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;didPostpone&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;isMinimalMode&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;isRSCRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// normally, for a PPR request, it will come to there to sendRenderResult.&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sendRenderResult&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;generateEtags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;generateEtags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;poweredByHeader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;poweredByHeader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cacheControl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cacheEntry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cacheControl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As we can see, &lt;code&gt;handleResponse&lt;/code&gt; will require cached data from &lt;code&gt;routeModule&lt;/code&gt;, which would be reused in subsequent &lt;code&gt;sendRenderResult&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7vrqfo3ra1is3fn48qxo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7vrqfo3ra1is3fn48qxo.png" alt=" " width="800" height="726"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;We traced the Next.js render pipeline starting from the server request handler down to &lt;code&gt;renderImpl&lt;/code&gt;. We followed how Next.js transforms an incoming HTTP request into a rendered result by resolving page components, executing the rendering logic, and finally returning HTML through &lt;code&gt;sendRenderResult&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Next post we will still focus on NextJS codebase, could pay attention if interested, and please feel free to point out any errors or omissions.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>nextjs</category>
      <category>react</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
