ป้ายกำกับ: SSR

Astro: Server-Side Rendering (SSR) & Hybrid Rendering การเปิดใช้งาน SSR ผ่าน Adapters (Node.js, Cloudflare, Vercel)Astro: Server-Side Rendering (SSR) & Hybrid Rendering การเปิดใช้งาน SSR ผ่าน Adapters (Node.js, Cloudflare, Vercel)

ในโลกของการพัฒนาเว็บสมัยใหม่ การจัดการประสิทธิภาพการโหลดหน้าเว็บเป็นสิ่งสำคัญอย่างยิ่ง Astro Framework ได้เข้ามาปฏิวัติแนวคิดนี้ด้วยการนำเสนอ Server-Side Rendering (SSR) และ Hybrid Rendering ซึ่งช่วยให้สามารถผสมผสานการเรนเดอร์แบบเซิร์ฟเวอร์และไคลเอนต์ได้อย่างลงตัว

แม้ว่า Astro จะเป็นเฟรมเวิร์กสำหรับ Frontend แต่ในบทความเชิงสถาปัตยกรรมนี้ เราจะจำลองหลักการทำงานของ SSR และการใช้ Adapters (เช่น Node.js, Cloudflare, Vercel) โดยใช้ไวยากรณ์และแนวคิดของ PostgreSQL เพื่อแสดงให้เห็นถึงการจัดการข้อมูลและการประมวลผลที่ซับซ้อนในระดับ Back-end Architecture

หลักการทำงานของ Server-Side Rendering (SSR) ใน PostgreSQL

SSR คือกระบวนการที่เซิร์ฟเวอร์ทำการเรนเดอร์หน้าเว็บทั้งหมดให้เป็น HTML ที่สมบูรณ์ก่อนส่งไปยังเบราว์เซอร์ ทำให้ผู้ใช้เห็นเนื้อหาได้รวดเร็วตั้งแต่แรกเริ่ม (First Contentful Paint) ในบริบทของ PostgreSQL เราสามารถจำลองกระบวนการนี้ได้โดยการสร้างฟังก์ชันที่รับข้อมูลดิบ (Raw Data) และทำการแปลง (Transform) ให้เป็นโครงสร้างที่พร้อมใช้งานทันที โดยไม่รอการเรียกใช้ JavaScript ในฝั่ง Client

SQL

-- การจำลองการเรนเดอร์ข้อมูลบนเซิร์ฟเวอร์ (SSR) โดยใช้ฟังก์ชัน PL/pgSQL</code><code class="language-sql">CREATE OR REPLACE FUNCTION render_page_ssr(p_data_id INT) RETURNS TEXT AS $$</code><code class="language-sql">DECLARE</code><code class="language-sql">    v_data TEXT;</code><code class="language-sql">BEGIN</code><code class="language-sql">    SELECT data_string INTO v_data FROM content_table WHERE id = p_data_id;</code><code class="language-sql">    -- การส่งออก HTML ที่สมบูรณ์ (Pre-rendered content)</code><code class="language-sql">    RETURN '<h1>Welcome, User!</h1><p>Content: ' || v_data || '</p>
<!-- /wp:paragraph -->';</code><code class="language-sql">END;</code><code class="language-sql">$$ LANGUAGE plpgsql;

ฟังก์ชันนี้จำลองการที่เซิร์ฟเวอร์ (PostgreSQL) ทำการดึงข้อมูลและประกอบเป็น HTML ที่สมบูรณ์ก่อนส่งออกไป

การใช้ Adapters: การเชื่อมต่อสภาพแวดล้อมที่แตกต่างกัน

Adapters ใน Astro ทำหน้าที่เป็นตัวเชื่อมระหว่าง Astro กับ Platform ต่างๆ (เช่น Node.js, Cloudflare Workers, Vercel) เพื่อให้สามารถทำงานได้ในสภาพแวดล้อมที่แตกต่างกัน PostgreSQL ก็มีกลไกที่คล้ายกันคือการใช้ Extensions หรือ Foreign Data Wrappers (FDW) เพื่อเชื่อมต่อกับแหล่งข้อมูลภายนอก

เราสามารถจำลองการเปิดใช้งาน Adapter สำหรับ Cloudflare หรือ Vercel ได้ด้วยการสร้าง Extension ที่กำหนดขอบเขตการทำงานเฉพาะ:

SQL

-- การจำลองการติดตั้ง Adapter สำหรับสภาพแวดล้อมเฉพาะ (เช่น Cloudflare)</code><code class="language-sql">CREATE EXTENSION IF NOT EXISTS adapter_cloudflare;</code><code class="language-sql">-- การเรียกใช้ฟังก์ชันที่ถูกปรับให้เข้ากับสภาพแวดล้อมนั้นๆ</code><code class="language-sql">SELECT adapter_cloudflare.render_optimized_page('1,2,3');

Hybrid Rendering ด้วย Conditional Logic

Hybrid Rendering คือการผสมผสานระหว่าง SSR (Server) และ CSR (Client) เพื่อให้ได้ประสิทธิภาพสูงสุด เราสามารถใช้คำสั่ง `CASE` ใน PostgreSQL เพื่อจำลองการตัดสินใจว่าควรเรนเดอร์ส่วนใดบนเซิร์ฟเวอร์ และส่วนใดที่ควรให้ Client จัดการเอง

SQL

-- การจำลองการเรนเดอร์แบบ Hybrid: ตรวจสอบสถานะเพื่อตัดสินใจ</code><code class="language-sql">SELECT</code><code class="language-sql">    CASE WHEN status = 'complete' THEN 'SSR Rendered'</code><code class="language-sql">    WHEN status = 'partial' THEN 'Client Hydration Required'</code><code class="language-sql">    ELSE 'Fallback Mode'</code><code class="language-sql">END AS rendering_strategy</code><code class="language-sql">FROM user_session_status WHERE session_id = 'abc-123';

บทสรุป

การทำความเข้าใจหลักการ SSR และ Hybrid Rendering โดยใช้ PostgreSQL เป็นตัวเปรียบเทียบเชิงสถาปัตยกรรม ทำให้เราเห็นภาพว่าการเรนเดอร์ที่รวดเร็วและมีประสิทธิภาพนั้นไม่ได้ขึ้นอยู่กับภาษาใดภาษาหนึ่ง แต่ขึ้นอยู่กับการจัดการข้อมูลและการส่งมอบเนื้อหาที่เหมาะสมในแต่ละขั้นตอน ไม่ว่าจะเป็นการใช้ฟังก์ชันเพื่อ SSR หรือการใช้ Extensions เพื่อ Adapter ต่างๆ ล้วนเป็นกลไกสำคัญที่ช่วยให้แอปพลิเคชันมีประสิทธิภาพสูงสุด