React Academy · บทเรียน

SSR แบบสตรีมจากขอบเครือข่าย

สตรีมผลลัพธ์ HTML ของรีแอ็กต์ด้วย ReadableStream เพื่อให้เบราว์เซอร์แสดงเนื้อหาสำคัญได้ทันที

บทเรียน 3 จาก 413 ขั้นตอน

SSR แบบสตรีมจากขอบเครือข่าย เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

ข้อได้เปรียบของการสตรีม

เมื่อเซิร์ฟเวอร์สตรีม HTML เบราว์เซอร์จะได้รับและเรนเดอร์เนื้อหาเป็นส่วน ๆ แทนที่จะรอเอกสารทั้งหมด ซึ่งหมายความว่าผู้ใช้จะเห็นและโต้ตอบกับส่วนที่มองเห็นได้ของหน้า เช่น ส่วนหัว แถบนำทาง และส่วนแบนเนอร์หลัก ขณะที่ส่วนที่ขึ้นอยู่กับข้อมูลและใช้เวลานานกว่ายังคงกำลังโหลดอยู่

renderToReadableStream พร้อม bootstrapScripts

การส่ง bootstrapScripts ไปยัง renderToReadableStream จะบอก React ว่าชุดโปรแกรม JS ฝั่งไคลเอ็นต์อยู่ที่ใด React จะแทรกแท็กสคริปต์ไว้ที่ท้ายสตรีม เพื่อให้เบราว์เซอร์โหลดชุดโปรแกรมและเรียก hydrateRoot ทำให้หน้าโต้ตอบได้เมื่อแต่ละส่วนสตรีมเสร็จ

ขอบเขต Suspense ในต้นไม้คอมโพเนนต์

การสตรีมของ React อาศัยขอบเขต Suspense เพื่อแบ่งต้นไม้คอมโพเนนต์ออกเป็นส่วน ๆ ที่สามารถสตรีมได้อย่างอิสระ คอมโพเนนต์ภายในขอบเขต Suspense ที่กำลังรอข้อมูล (ผ่านพรอมิสที่ถูกโยน) จะสตรีมเป็นเนื้อหาตัวแทนชั่วคราวก่อน จากนั้นจึงแก้ไขและสตรีมเนื้อหาจริงในภายหลัง

onShellReady: เวลาเริ่มสตรีม

ฟังก์ชันเรียกกลับ onShellReady จะทำงานเมื่อเชลล์ HTML ที่ไม่มีการรอจาก Suspense ซึ่งก็คือทุกอย่างนอกขอบเขต Suspense พร้อมสำหรับการสตรีม นี่คือจังหวะที่เหมาะสมในการกำหนดรหัสสถานะ HTTP และส่วนหัวการตอบกลับ จากนั้นจึงเรียก pipe(res) หรือเริ่มอ่านจาก ReadableStream

เหตุใดจึงต้องกำหนดรหัสสถานะก่อน

ต้องส่งรหัสสถานะ HTTP และส่วนหัวก่อนที่เนื้อหาการตอบกลับจะเริ่มต้น เนื่องจากการสตรีมเริ่มต้นที่ onShellReady ตรรกะจัดการข้อผิดพลาดใด ๆ เช่น การกำหนดสถานะ 500 หรือการเปลี่ยนเส้นทาง ต้องทำก่อนที่เชลล์จะเริ่มส่งข้อมูล เมื่อเริ่มสตรีมแล้ว รหัสสถานะจะถูกล็อก

การจัดการข้อผิดพลาด: onShellError

onShellError จะทำงานเมื่อเกิดข้อผิดพลาดร้ายแรงก่อนที่เชลล์จะพร้อม เช่น ข้อผิดพลาดในคอมโพเนนต์ระดับบนสุดที่อยู่นอกขอบเขต Suspense ในกรณีนี้ เชลล์จะไม่ถูกสตรีม และคุณควรตอบกลับด้วยหน้าแสดงข้อผิดพลาดแบบคงที่หรือเปลี่ยนเส้นทางไปยังเส้นทางข้อผิดพลาด

การจัดการข้อผิดพลาด: onError

onError จะทำงานสำหรับข้อผิดพลาดที่กู้คืนได้ภายในขอบเขต Suspense React ยังคงสตรีมส่วนที่เหลือของหน้าได้ ส่วนขอบเขตที่เกิดข้อผิดพลาดจะแสดงส่วนติดต่อสำรองสำหรับข้อผิดพลาด ใช้ onError เพื่อบันทึกข้อมูลการทำงาน โดยเก็บข้อผิดพลาดไว้ในแพลตฟอร์มตรวจสอบระบบโดยไม่ยกเลิกสตรีม

การเพิ่มความสามารถแบบค่อยเป็นค่อยไปและการหมดเวลา

หากข้อมูลของขอบเขต Suspense ใช้เวลานานเกินไป ให้สตรีมเชลล์ต่อไป แล้วให้ขอบเขตนั้นทำไฮเดรตบนไคลเอนต์ ใช้การหมดเวลา: หลังผ่านไป 5 วินาที ให้เรียกใช้ abort() บนสตรีมหากขอบเขตยังทำงานไม่เสร็จ แล้วไคลเอนต์จะดึงข้อมูลเองผ่าน useEffect

กลไกการสตรีมของ Cloudflare Workers

รันไทม์ของ Workers ส่ง ReadableStream ไปเป็นเนื้อหาของ Response โดยตรง โครงสร้างพื้นฐานของ Cloudflare ส่งต่อแต่ละชังก์ไปยังเบราว์เซอร์ของผู้ใช้ขณะที่ React สร้างชังก์นั้น โดยไม่บัฟเฟอร์เอกสารทั้งหมด ซึ่งหมายความว่าไบต์แรกของ HTML ออกจาก PoP ที่ขอบเครือข่ายภายในไม่กี่มิลลิวินาทีหลังคำขอมาถึง

การยกเลิก: การควบคุมสตรีมที่ยาว

renderToReadableStream ส่งคืนฟังก์ชันควบคุมการยกเลิก หากคำขอถูกยกเลิก (ผู้ใช้นำทางออกจากหน้า) การเรียกใช้ abort() จะหยุดไม่ให้ React เรนเดอร์และประมวลผลข้อมูลต่อ วิธีนี้ช่วยป้องกันการคำนวณที่สูญเปล่าจากคำขอที่ไม่มีผู้ใช้งานแล้ว และควบคุมการใช้ CPU ของ Worker ให้อยู่ในขอบเขต

โปรไฟล์เวลาแฝงตั้งแต่ต้นจนจบ

เมื่อใช้การสตรีมจากขอบเครือข่าย ลำดับเวลาแฝงทั้งหมดจะเป็นดังนี้: 5ms (จากคำขอไปยัง PoP ที่ใกล้ที่สุด) + 2ms (การเริ่มต้น Worker แบบเย็น) + 8ms (การเรนเดอร์เชลล์) = 15ms จนถึงไบต์แรก เบราว์เซอร์ของผู้ใช้จะแสดงผลองค์ประกอบ LCP จากเชลล์ ขณะที่ส่วนที่เหลือของหน้าสตรีมเข้ามาอย่างต่อเนื่องในเบื้องหลัง

จังหวะการทำงานของ onShellReady

ระหว่าง SSR แบบสตรีมมิง callback onShellReady จะทำงานเมื่อใดกันแน่

สรุปบทเรียน

การสตรีม SSR จากขอบเครือข่ายจะส่ง HTML เป็นชังก์ ๆ ช่วยปรับปรุง FCP และ LCP ด้วยการส่งเชลล์ทันที ขอบเขต Suspense แบ่งต้นไม้ออกเป็นส่วนที่สตรีมได้อย่างอิสระ onShellReady เป็นสัญญาณให้เริ่มส่งข้อมูลผ่านสตรีม — ตั้งรหัสสถานะก่อนเรียกใช้ onShellReady ส่วน onShellError ใช้จัดการความล้มเหลวร้ายแรง onError ใช้จัดการความล้มเหลวที่กู้คืนได้ และ abort() ช่วยป้องกันงานที่สูญเปล่าจากคำขอที่ถูกยกเลิก

เริ่มต้นได้ฟรี

เรียนรู้ React ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
88
บทเรียน
324

คำถามที่พบบ่อย

บทเรียน “SSR แบบสตรีมจากขอบเครือข่าย” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “SSR แบบสตรีมจากขอบเครือข่าย” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “SSR แบบสตรีมจากขอบเครือข่าย”

สตรีมผลลัพธ์ HTML ของรีแอ็กต์ด้วย ReadableStream เพื่อให้เบราว์เซอร์แสดงเนื้อหาสำคัญได้ทันที คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “SSR แบบสตรีมจากขอบเครือข่าย” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม

ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การแสดงผลที่ขอบเครือข่ายคืออะไรและเหตุใดจึงสำคัญ
  2. รีแอ็กต์บน Cloudflare Workers ด้วย Hono
  3. SSR แบบสตรีมจากขอบเครือข่าย
  4. กลยุทธ์การแคชที่ขอบเครือข่ายสำหรับแอปรีแอ็กต์
← กลับไปที่ React Academy