ชุดของส่วนหัวคำแนะนำไคลเอ็นต์ช่วยให้เว็บไซต์สามารถรับค่ากำหนดสื่อของผู้ใช้ (ไม่บังคับ) ในเวลาที่ขอ ทำให้เซิร์ฟเวอร์สามารถแทรก CSS ที่เหมาะสมเพื่อเหตุผลด้านประสิทธิภาพ
คำค้นหาสื่อ CSS โดยเฉพาะฟีเจอร์สื่อที่ผู้ใช้ชื่นชอบ เช่น prefers-color-scheme
หรือ prefers-reduced-motion
อาจส่งผลกระทบอย่างมากต่อจำนวน CSS ที่ต้องนำส่งโดยหน้าเว็บและประสบการณ์ของผู้ใช้เมื่อโหลดหน้าเว็บ
เน้นที่ prefers-color-scheme
แต่เน้นว่าเหตุผลนั้นมีผลกับฟีเจอร์สื่ออื่นๆ ที่ผู้ใช้ต้องการด้วยเช่นกัน แนวทางปฏิบัติแนะนำคือไม่โหลด CSS สำหรับรูปแบบสีที่ไม่ตรงกันในเส้นทางการแสดงผลวิกฤติ และโหลดเฉพาะ CSS ที่เกี่ยวข้องในปัจจุบันในตอนแรกแทน วิธีหนึ่งในการทำเช่นนั้นคือ
ผ่าน <link media>
อย่างไรก็ตาม เว็บไซต์ที่มีการเข้าชมสูงอย่าง Google Search ซึ่งต้องการให้เป็นไปตามฟีเจอร์สื่อที่ต้องการของผู้ใช้ เช่น prefers-color-scheme
และ CSS ในบรรทัดเพื่อเหตุผลด้านประสิทธิภาพ ก็ต้องรู้เกี่ยวกับรูปแบบสีที่ต้องการ (หรือฟีเจอร์สื่ออื่นๆ ที่ผู้ใช้ชื่นชอบตามลำดับ) เมื่อขอ เพื่อให้เพย์โหลด HTML เริ่มต้นมี CSS ที่เหมาะสมอยู่ในเนื้อหาแล้ว
นอกจากนี้ โดยเฉพาะสำหรับ prefers-color-scheme
เว็บไซต์ต่างๆ ต้องการหลีกเลี่ยงธีมสีที่ไม่ถูกต้องในพริบตา
ส่วนหัวของคำแนะนำไคลเอ็นต์ Sec-CH-Prefers-Color-Scheme
และ Sec-CH-Prefers-Reduced-Motion
เป็นชุดส่วนหัวคำแนะนำสำหรับไคลเอ็นต์ของสื่อสำหรับค่ากำหนดของผู้ใช้ชุดแรกที่มีเป้าหมายเพื่อแก้ปัญหานี้
ความเป็นมาเกี่ยวกับคำใบ้จากลูกค้า
คำแนะนำไคลเอ็นต์ HTTP กำหนดส่วนหัวการตอบกลับ Accept-CH
ที่เซิร์ฟเวอร์สามารถใช้เพื่อโฆษณาการใช้ส่วนหัวของคำขอสำหรับการเจรจาเนื้อหาเชิงรุก หรือที่เรียกกันว่าคำแนะนำสำหรับลูกค้า ข้อเสนอส่วนหัวคำแนะนำไคลเอ็นต์สำหรับฟีเจอร์สื่อของค่ากำหนดของผู้ใช้
กำหนดชุดคำแนะนำสำหรับไคลเอ็นต์ที่มีจุดมุ่งหมายเพื่อสื่อถึงฟีเจอร์สื่อที่ผู้ใช้ชื่นชอบ คำแนะนำสำหรับไคลเอ็นต์เหล่านี้จะตั้งชื่อตามฟีเจอร์สื่อค่ากำหนดของผู้ใช้ที่เกี่ยวข้องซึ่งรายงานใช้
เช่น รูปแบบสีที่ต้องการในปัจจุบันตาม prefers-color-scheme
จะรายงานผ่านคำแนะนำไคลเอ็นต์ Sec-CH-Prefers-Color-Scheme
ซึ่งตั้งชื่อที่เหมาะสม
ความเป็นมาเกี่ยวกับคำใบ้ที่สำคัญสำหรับลูกค้า
คำแนะนำไคลเอ็นต์ที่เสนอใน ส่วนหัวคำแนะนำไคลเอ็นต์สำหรับฟีเจอร์สื่อของค่ากำหนดของผู้ใช้ จะถือว่ามีการใช้มากที่สุดเป็น คำแนะนำไคลเอ็นต์ที่สำคัญ Critical Client Hints คือคำแนะนำสำหรับลูกค้า ซึ่งจะเปลี่ยนแปลงทรัพยากรที่ได้อย่างมาก ควรดึงทรัพยากรดังกล่าวอย่างสม่ำเสมอในการโหลดหน้าเว็บ (รวมถึงการโหลดหน้าเว็บinitial) เพื่อหลีกเลี่ยงไม่ให้สวิตช์ผู้ใช้มองเห็นได้ยาก
ไวยากรณ์คำแนะนำไคลเอ็นต์
ฟีเจอร์สื่อค่ากำหนดของผู้ใช้ประกอบด้วยชื่อ (เช่น prefers-reduced-motion
) และค่าที่อนุญาต
(เช่น no-preference
หรือ reduce
) ช่องส่วนหัวของคำแนะนำไคลเอ็นต์แต่ละช่องจะแสดงเป็น
ส่วนหัวที่มีโครงสร้างสำหรับออบเจ็กต์ HTTP
ที่มีรายการที่มีค่าเป็นสตริง ตัวอย่างเช่น หากต้องการสื่อว่าผู้ใช้ต้องการธีมมืดและการเคลื่อนไหวที่ลดลง คำแนะนำสำหรับไคลเอ็นต์จะมีลักษณะเหมือนในตัวอย่างด้านล่าง
GET / HTTP/2
Host: example.com
Sec-CH-Prefers-Color-Scheme: "dark"
Sec-CH-Prefers-Reduced-Motion: "reduce"
ค่าที่เทียบเท่าของ CSS ของข้อมูลที่จะแสดงในคำแนะนำสำหรับลูกค้าข้างต้นคือ @media (prefers-color-scheme: dark) {}
และ @media (prefers-reduced-motion: reduce) {}
ตามลำดับ
รายการคำแนะนำสำหรับไคลเอ็นต์ทั้งหมด
รายการคำแนะนำสำหรับไคลเอ็นต์จะจำลองตามฟีเจอร์สื่อค่ากำหนดของผู้ใช้ในคิวรี่สื่อระดับ 5
คำแนะนำสำหรับไคลเอ็นต์ | ค่าที่อนุญาต | ฟีเจอร์สื่อค่ากำหนดของผู้ใช้ที่เกี่ยวข้อง |
---|---|---|
Sec-CH-Prefers-Reduced-Motion |
no-preference , reduce |
prefers-reduced-motion |
Sec-CH-Prefers-Reduced-Transparency |
no-preference , reduce |
prefers-reduced-transparency |
Sec-CH-Prefers-Contrast |
no-preference , less , more , custom |
prefers-contrast |
Sec-CH-Forced-Colors |
active , none |
forced-colors |
Sec-CH-Prefers-Color-Scheme |
light , dark |
prefers-color-scheme |
Sec-CH-Prefers-Reduced-Data |
no-preference , reduce |
prefers-reduced-data |
การสนับสนุนเบราว์เซอร์
Chromium 93 รองรับส่วนหัวคำแนะนำไคลเอ็นต์ Sec-CH-Prefers-Color-Scheme
Chromium 108 รองรับส่วนหัวคำแนะนำไคลเอ็นต์ Sec-CH-Prefers-Reduced-Motion
ความคิดเห็นของผู้ให้บริการรายอื่นๆ เช่น WebKit และ Mozilla กำลังรอดำเนินการ
การสาธิตการใช้ Sec-CH-Prefers-Color-Scheme
ลองใช้การสาธิตใน Chromium 93 แล้วสังเกตการณ์ว่า CSS ในบรรทัดมีการเปลี่ยนแปลงตามรูปแบบสีที่ผู้ใช้ต้องการอย่างไร
การสาธิตการใช้ Sec-CH-Prefers-Reduced-Motion
ลองใช้การสาธิตใน Chromium 108 และดูว่า CSS ในบรรทัดมีการเปลี่ยนแปลงตามค่ากำหนดการเคลื่อนไหวของผู้ใช้อย่างไร
วิธีการทำงาน
- ไคลเอ็นต์ส่งคำขอเริ่มต้นไปยังเซิร์ฟเวอร์
bash GET / HTTP/2 Host: example.com
- เซิร์ฟเวอร์ตอบสนองโดยบอกไคลเอ็นต์ผ่านทาง
Accept-CH
ว่ายอมรับSec-CH-Prefers-Color-Scheme
และSec-CH-Prefers-Contrast
Client Hints ซึ่งตามCritical-CH
จะถือว่าSec-CH-Prefers-Color-Scheme
เป็นคำแนะนำไคลเอ็นต์ที่สำคัญและทำให้เกิดคำตอบที่แตกต่างกันตามที่Vary
แจ้งbash HTTP/2 200 OK Content-Type: text/html Accept-CH: Sec-CH-Prefers-Color-Scheme, Sec-CH-Prefers-Contrast Vary: Sec-CH-Prefers-Color-Scheme Critical-CH: Sec-CH-Prefers-Color-Scheme
- จากนั้นไคลเอ็นต์จะลองส่งคำขออีกครั้ง เพื่อบอกเซิร์ฟเวอร์ผ่าน
Sec-CH-Prefers-Color-Scheme
ว่าความต้องการของผู้ใช้สำหรับเนื้อหาที่มีรูปแบบสีเข้มbash GET / HTTP/2 Host: example.com Sec-CH-Prefers-Color-Scheme: "dark"
- จากนั้นเซิร์ฟเวอร์จะสามารถปรับการตอบสนองตามความต้องการของลูกค้าให้เหมาะสม ตัวอย่างเช่น แทรก CSS ที่รับผิดชอบธีมมืดในเนื้อหาการตอบกลับ
ตัวอย่าง Node.js
ตัวอย่าง Node.js ด้านล่างซึ่งเขียนขึ้นสำหรับเฟรมเวิร์ก Express.js ยอดนิยมแสดงให้เห็นว่าการจัดการกับส่วนหัวคำแนะนำไคลเอ็นต์ Sec-CH-Prefers-Color-Scheme
มีลักษณะอย่างไรในทางปฏิบัติ
โค้ดนี้เป็นตัวขับเคลื่อนการสาธิตด้านบน
app.get("/", (req, res) => {
// Tell the client the server accepts the `Sec-CH-Prefers-Color-Scheme` client hint…
res.set("Accept-CH", "Sec-CH-Prefers-Color-Scheme");
// …and that the server's response will vary based on its value…
res.set("Vary", "Sec-CH-Prefers-Color-Scheme");
// …and that the server considers this client hint a _critical_ client hint.
res.set("Critical-CH", "Sec-CH-Prefers-Color-Scheme");
// Read the user's preferred color scheme from the headers…
const prefersColorScheme = req.get("sec-ch-prefers-color-scheme");
// …and send the adequate HTML response with the right CSS inlined.
res.send(getHTML(prefersColorScheme));
});
ข้อควรพิจารณาเกี่ยวกับความเป็นส่วนตัวและความปลอดภัย
ทีม Chromium ออกแบบและติดตั้งส่วนหัวคำแนะนำไคลเอ็นต์เกี่ยวกับฟีเจอร์สื่อของค่ากำหนดผู้ใช้โดยใช้หลักการสำคัญที่ระบุไว้ในการควบคุมสิทธิ์เข้าถึงฟีเจอร์แพลตฟอร์มเว็บที่มีประสิทธิภาพ ซึ่งรวมถึงการควบคุมของผู้ใช้ ความโปร่งใส และการยศาสตร์
ข้อพิจารณาด้านความปลอดภัยของคำแนะนำไคลเอ็นต์ HTTP และข้อพิจารณาด้านความปลอดภัยด้านความน่าเชื่อถือของคำแนะนำไคลเอ็นต์ก็มีผลกับข้อเสนอนี้เช่นกัน
รายการอ้างอิง
- ฉบับร่างของข้อกำหนด
- คำอธิบาย
- Sec-CH-Prefers-Color-Scheme - รายการสถานะของ Chrome
- Sec-CH-Prefers-Color-Scheme - Chromium ข้อบกพร่อง
- Sec-CH-Prefers-Reduced-Motion - รายการสถานะของ Chrome
- Sec-CH-Prefers-Reduced-Motion - ข้อบกพร่องของ Chromium
- ชุดข้อความ WebKit
- ตำแหน่งมาตรฐานของ Mozilla
- คำแนะนำเกี่ยวกับไคลเอ็นต์
- ความน่าเชื่อถือของคำแนะนำไคลเอ็นต์
- คิวรี่สื่อระดับ 5
- ส่วนหัวที่มีโครงสร้างสำหรับ HTTP
ข้อความแสดงการยอมรับ
ขอขอบคุณอย่างยิ่งสำหรับความคิดเห็นและคำแนะนำที่มีค่าจาก Yoav Weiss รูปภาพหลักโดย Tdadamemd ในWikimedia Commons