ฟีเจอร์ที่ใช้ร่วมกัน
เอกสารนี้รวบรวม "แนวคิดที่ใช้ร่วมกัน" ซึ่งเคยปรากฏซ้ำในเอกสารของโฆษณาแต่ละประเภทมาไว้ที่เดียว เพื่อให้ดูแลรักษาได้ง่ายขึ้น และเพื่อให้เอกสารของโฆษณาแต่ละประเภทสามารถมุ่งเน้นไปที่ ฟีเจอร์เฉพาะของแต่ละประเภท ได้
🧱 โครงสร้างพื้นฐาน & รูปแบบการเรียกใช้ที่ใช้ร่วมกัน
รูปแบบที่ใช้ร่วมกันสำหรับ React / Next.js Provider
⚙️ สรุปตัวเลือกที่ใช้ร่วมกัน
| ตัวเลือก | ประเภท | คำอธิบาย | ใช้กับ |
|---|---|---|---|
onClick | function(adData) | Callback เมื่อคลิกโฆษณา | ทุกประเภท |
adId | string | กำหนดโฆษณาเฉพาะแบบบังคับ | ทุกประเภท |
language | 'ko' | 'en' | 'ja' | 'zh' | ตัวกรองภาษา | ทุกประเภท |
deviceType | 'MOBILE' | 'DESKTOP' | ตัวกรองอุปกรณ์ | ทุกประเภท |
country | รหัสประเทศ (ISO2) | ตัวกรองประเทศ | ทุกประเภท |
สำหรับตัวเลือกเฉพาะของโฆษณาแต่ละประเภท โปรดดูเอกสารที่เกี่ยวข้อง (แบนเนอร์/ข้อความ/วิดีโอ)
🔄 ไลฟ์ไซเคิล & การทำงานภายใน
คุณลักษณะหลัก
- แบบคืนค่าทันที:
slotIdจะถูกคืนค่าทันทีก่อนที่เซิร์ฟเวอร์จะตอบกลับ ⇒ ไม่บล็อก UI - รองรับคอนเทนเนอร์ที่มาทีหลัง: แม้คอนเทนเนอร์ยังไม่อยู่ใน DOM ก็จะลองใหม่ตามช่วงเวลาหนึ่ง และเมื่อถูกแนบเข้ามาแล้วจึงเรนเดอร์
- การล้างข้อมูลอัตโนมัติแบบอิงกับ MutationObserver:
destroy()จะทำงานอัตโนมัติเมื่อ DOM ถูกลบออก - ปลอดภัยกับโฆษณาหลายตัว: เมื่อเรียกคอนเทนเนอร์เดียวกันซ้ำ มีเพียงการเรียกครั้งล่าสุดเท่านั้นที่มีผล (นโยบายของตัวการนำไปใช้งาน)
🧪 Slot Management API
ออบเจกต์ slot (ฟิลด์จริง):
🚀 กลยุทธ์ด้านประสิทธิภาพ & การเพิ่มประสิทธิภาพที่ใช้ร่วมกัน
| กลยุทธ์ | คำอธิบาย | หมายเหตุ |
|---|---|---|
| การโหลดเบื้องหลัง | ไม่บล็อกการเรนเดอร์เริ่มต้นด้วยการโหลดแบบอะซิงโครนัส | ใช้ slotId ได้ทันที |
| รองรับคอนเทนเนอร์ที่มาทีหลัง | จัดการกรณีที่ DOM ถูกแทรกเข้ามาภายหลังโดยอัตโนมัติ | ทำให้โค้ดการเริ่มต้นเรียบง่ายขึ้น |
| การล้างข้อมูลอัตโนมัติ | ป้องกันการรั่วไหลของหน่วยความจำ/อีเวนต์ | มีประโยชน์เมื่อมีการเปลี่ยนหน้าใน SPA |
| ปรับแต่ง DOM ให้น้อยที่สุด | อัปเดตเฉพาะ DOM ภายในคอนเทนเนอร์เท่านั้น | ลดผลกระทบต่อเลย์เอาต์ของพาเรนต์ |
| เพิ่มประสิทธิภาพขนาดตามประเภท | แบนเนอร์/วิดีโอกำหนดขนาด ส่วนข้อความใช้ความสูงอัตโนมัติ | ลด CLS |
เทมเพลตที่ใช้ร่วมกันสำหรับรูปแบบ Responsive
📦 สรุปรูปแบบที่แนะนำสำหรับ React / Next.js
| รูปแบบ | คำอธิบาย | ใช้เมื่อไหร่ |
|---|---|---|
| การเริ่มต้นแบบ global ผ่าน Provider | ตั้งค่า SDK เพียงครั้งเดียว | App/RootLayout |
| Hook (useAdStageInstance) | การเข้าถึง SDK อย่างปลอดภัย | คอมโพเนนต์ CSR |
| cleanup ใน useEffect | รับประกันการเรียก destroy | ทำให้อายุการใช้งานของ slot ชัดเจน |
| สไตล์ Skeleton | ปรับแต่งสถานะ .adstage-loading | ปรับปรุง UX |
🎨 คลาส CSS ที่ใช้ร่วมกัน
สำหรับสไตล์เพิ่มเติมตามแต่ละประเภท โปรดดูเอกสารแยกของแต่ละประเภท
🛠 การดีบัก & การมอนิเตอร์
การเปิดใช้งานโหมดดีบัก
Click Hook (onClick callback)
SDK จะไม่ปล่อย DOM CustomEvent อย่าง adstage:ad:loaded / adstage:ad:error หากคุณต้องการ hook สำหรับการโต้ตอบกับโฆษณา ให้ส่ง onClick callback ตอนสร้าง slot
การตรวจสอบสถานะการโหลด
คุณสามารถตรวจสอบได้ว่าการโหลดเสร็จสมบูรณ์หรือไม่ โดยการ polling ฟิลด์ isLoaded ของ slot (หากเปิดโหมดดีบัก ผลการโหลด/ความล้มเหลวจะถูกพิมพ์ออกมาที่คอนโซล)
ยูทิลิตีสำหรับวินิจฉัยสถานะ
🔐 ความปลอดภัย & แนวทางปฏิบัติที่ดี
| หัวข้อ | ข้อแนะนำ |
|---|---|
| API Key | สามารถเปิดเผยต่อสาธารณะได้ แต่ควรใช้คีย์ที่มีสิทธิ์น้อยที่สุด |
| การติดตามอีเวนต์ | เมื่อเพิ่มการติดตามใน onClick แนะนำให้ส่งแบบอะซิงโครนัสก่อนแล้วจึงทำการ routing |
| การจัดการข้อผิดพลาด | วินิจฉัยความล้มเหลวในการโหลดด้วยล็อกคอนโซลโหมดดีบักและสถานะ isLoaded ของ slot |
| นโยบายการลองใหม่ | กรณีการแทรกคอนเทนเนอร์ทีหลังถูกจัดการภายในแล้ว → หลีกเลี่ยงการใช้ setTimeout เพิ่มเติมมากเกินไป |
❓FAQ (ที่ใช้ร่วมกัน)
Q. จำเป็นต้องเรียก destroy() เสมอหรือไม่?
A. ส่วนใหญ่ไม่จำเป็น การตรวจจับการลบ DOM จะทำงานโดยอัตโนมัติ อย่างไรก็ตาม หากคุณนำคอนเทนเนอร์เดียวกันไปใช้ซ้ำเพื่อวัตถุประสงค์อื่นทันที แนะนำให้เรียก destroy() ด้วยตนเอง
Q. โฆษณาไม่แสดง แต่ slotId ออกมา
A. อาจกำลังโหลดแบบอะซิงโครนัสอยู่ หรืออาจถูกกรองออกด้วยตัวกรอง (adId / language / deviceType / country) ให้เปิดโหมดดีบักและตรวจสอบล็อกอีเวนต์
Q. ใน SSR (Next.js) จะเรนเดอร์ที่ฝั่งเซิร์ฟเวอร์หรือไม่?
A. ไม่ การเรนเดอร์โฆษณาจะทำที่ฝั่งไคลเอนต์เท่านั้น ให้เรียกใช้ภายในคอมโพเนนต์ use client
Q. หากเรียกซ้ำติดต่อกันที่ตำแหน่งเดียวกันจะเป็นอย่างไร?
A. ตามนโยบายของตัวการนำไปใช้งาน slot เดิมจะถูกลบออก และจะคงสถานะไว้ตามการเรียกครั้งสุดท้าย

