การคงธีมไว้และป้องกันหน้ากระพริบ
บันทึกค่ากำหนดธีมลงใน localStorage และแทรกสคริปต์บล็อกเพื่อกำหนดธีมก่อน React โหลด
การคงธีมไว้และป้องกันหน้ากระพริบ เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
ปัญหาการกะพริบของธีมที่ไม่ถูกต้อง
เมื่อโหลดหน้า React ต้องดาวน์โหลด แยกวิเคราะห์ และเรียกใช้ JavaScript ก่อนจึงจะอ่าน localStorage และใช้ธีมที่ถูกต้องได้ ในช่วงว่างนี้ เบราว์เซอร์จะแสดงผลด้วยรูปแบบเริ่มต้น หากผู้ใช้ชอบโหมดมืดแต่ค่าเริ่มต้นของคุณเป็นโหมดสว่าง ผู้ใช้จะเห็นหน้าจอสีขาวกะพริบชั่วครู่ก่อนที่ธีมจะถูกแก้ไข
วิธีแก้ด้วยสคริปต์แบบบล็อกการทำงาน
วิธีแก้คือใช้สคริปต์อินไลน์ใน document head ซึ่งทำงานแบบซิงโครนัสก่อนโค้ดอื่นทั้งหมด สคริปต์นี้จะอ่าน localStorage ทันทีและกำหนด data-theme ให้กับ document.documentElement เนื่องจากเป็นสคริปต์แบบบล็อกการทำงาน เบราว์เซอร์จึงกำหนดแอตทริบิวต์นี้ก่อนวาดเนื้อหาใด ๆ
เหตุผลที่ต้องบล็อกการทำงาน
สคริปต์แบบอะซิงโครนัสหรือแบบเลื่อนการทำงานจะทำงานหลังจากแยกวิเคราะห์ HTML แล้ว และอาจทำงานหลังการวาดครั้งแรกด้วย ซึ่งทำให้จุดประสงค์ทั้งหมดไม่บรรลุผล สคริปต์อินไลน์แบบบล็อกการทำงานต้องไม่มีแอตทริบิวต์ async หรือ defer และต้องไม่โหลดจากไฟล์ภายนอก สคริปต์ควรมีขนาดเล็กมากเพื่อลดต้นทุนด้านประสิทธิภาพ
เนื้อหาของสคริปต์อินไลน์
สคริปต์แบบบล็อกการทำงานมีเนื้อหาน้อยที่สุด โดยอ่าน localStorage.getItem('theme') ตรวจสอบ window.matchMedia('(prefers-color-scheme: dark)').matches เป็นค่าทดแทน จากนั้นเรียก document.documentElement.setAttribute('data-theme', theme) ให้ครอบด้วยการจัดการข้อผิดพลาดแบบลองและดักจับ เผื่อ localStorage ไม่พร้อมใช้งานในการเรียกดูแบบส่วนตัว
การใช้งานใน Next.js
ใน Next.js ให้ใช้คอมโพเนนต์ Script จาก next/script พร้อมกับ strategy="beforeInteractive" ภายใน _document.js กลยุทธ์ beforeInteractive จะแทรกสคริปต์ลงใน HTML ของหน้าเว็บก่อนที่ JavaScript ของหน้าจะทำงาน ทำให้ได้พฤติกรรมแบบบล็อกการทำงานเช่นเดียวกันในกระบวนการสร้างของ Next.js
การใช้งานใน Vite และ CRA
ในโปรเจ็กต์ Vite หรือ Create React App ให้แก้ไข index.html โดยตรง และวางแท็กสคริปต์อินไลน์ไว้ใน head ก่อนสคริปต์อื่นทั้งหมด เนื่องจาก index.html เป็นจุดเริ่มต้นสำหรับเบราว์เซอร์ สคริปต์จึงทำงานก่อนที่ React จะเริ่มทำงาน ควรเขียนให้กระชับเพื่อให้มีขนาดต่ำกว่า 100 ไบต์
วิธีแก้ด้วยคุกกี้หรือส่วนหัวผ่าน SSR
ในแอปที่เรนเดอร์ฝั่งเซิร์ฟเวอร์ เซิร์ฟเวอร์สามารถอ่านธีมจากคุกกี้ที่ส่งมาพร้อมคำขอ จากนั้นเซิร์ฟเวอร์จะกำหนด data-theme ใน HTML ที่เรนเดอร์แล้วก่อนส่งไปยังเบราว์เซอร์ วิธีนี้ป้องกันการกะพริบฝั่งไคลเอ็นต์ได้ทั้งหมด เพราะธีมที่ถูกต้องอยู่ในไบต์แรกของ HTML
ลำดับการทำงานแบบไม่กะพริบ
ลำดับการทำงานทั้งหมดคือ เบราว์เซอร์ดาวน์โหลด HTML ตัวแยกวิเคราะห์พบสคริปต์อินไลน์แบบบล็อกการทำงาน สคริปต์อ่าน localStorage และกำหนด data-theme ตัวแยกวิเคราะห์ทำงานต่อ หน้าเว็บถูกวาดด้วยธีมที่ถูกต้อง จากนั้น React ไฮเดรตและใช้ธีมเดียวกันจาก localStorage ผู้ใช้จึงเห็นธีมเดียวที่สอดคล้องกันตั้งแต่เริ่มต้น
การทดสอบการป้องกันการกะพริบ
หากต้องการตรวจสอบว่าวิธีแก้ทำงาน ให้เปิด Chrome DevTools ไปที่แท็บเครือข่าย และจำกัดความเร็วไว้ที่ Slow 3G จากนั้นโหลดหน้าใหม่ หากเห็นธีมเปลี่ยนระหว่างการโหลด แสดงว่ายังแก้ปัญหาการกะพริบไม่สำเร็จ เมื่อมีสคริปต์แบบบล็อกการทำงาน การวาดครั้งแรกควรแสดงธีมที่ถูกต้องอยู่แล้ว แม้การเชื่อมต่อจะช้า
ความเสี่ยงจากความไม่ตรงกันในการไฮเดรต
หากสถานะเริ่มต้นของ React กำหนดเป็นธีมสว่าง แต่สคริปต์แบบบล็อกการทำงานกำหนดธีมมืดก่อนการไฮเดรต React อาจแสดงคำเตือนเกี่ยวกับความไม่ตรงกันในการไฮเดรต หลีกเลี่ยงปัญหานี้ด้วยการเริ่มต้นสถานะธีมของ React โดยอ่าน localStorage ในระหว่างการเรนเดอร์ครั้งแรกด้วย เพื่อให้ HTML ที่ React เรนเดอร์ตรงกับสถานะ DOM ที่สคริปต์แบบบล็อกการทำงานกำหนดไว้
การกะพริบใน Storybook และสภาพแวดล้อมการทดสอบ
Storybook และสภาพแวดล้อมการทดสอบจะไม่โหลด index.html ของคุณ ดังนั้นสคริปต์แบบบล็อกการทำงานจึงไม่ทำงาน ให้จัดเตรียมตัวตกแต่งหรือการตั้งค่าการทดสอบที่กำหนดแอตทริบิวต์ data-theme เริ่มต้นในสภาพแวดล้อมเหล่านั้น วิธีนี้ป้องกันความไม่สอดคล้องทางภาพที่ทำให้สับสนเมื่อพัฒนาคอมโพเนนต์แบบแยกอิสระ
เทคนิคป้องกันการกะพริบ
ต้องใช้สคริปต์ประเภทใดในส่วนหัวของเอกสารเพื่อป้องกันการกะพริบของธีมที่ไม่ถูกต้อง
สรุปบทเรียน: การเก็บธีมและการป้องกันการกะพริบ
ป้องกันการกะพริบของธีมที่ไม่ถูกต้องด้วยการแทรกสคริปต์อินไลน์แบบบล็อกการทำงานขนาดเล็กในส่วนหัวของเอกสาร ซึ่งอ่าน localStorage และกำหนด data-theme ก่อนการวาดใด ๆ ใน Next.js ให้ใช้ strategy="beforeInteractive" ส่วน Vite/CRA ให้เพิ่มสคริปต์โดยตรงใน index.html แอป SSR สามารถอ่านคุกกี้เพื่อกำหนดธีมฝั่งเซิร์ฟเวอร์ได้
คำถามที่พบบ่อย
บทเรียน “การคงธีมไว้และป้องกันหน้ากระพริบ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การคงธีมไว้และป้องกันหน้ากระพริบ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การคงธีมไว้และป้องกันหน้ากระพริบ”
บันทึกค่ากำหนดธีมลงใน localStorage และแทรกสคริปต์บล็อกเพื่อกำหนดธีมก่อน React โหลด คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การคงธีมไว้และป้องกันหน้ากระพริบ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม
ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การตรวจจับชุดสีของระบบ
- ตัวแปร CSS สำหรับสลับธีม
- React Context สำหรับสถานะธีม
- การคงธีมไว้และป้องกันหน้ากระพริบ