ชุดส่วนหัวของคำแนะนำไคลเอ็นต์ช่วยให้เว็บไซต์รับค่ากำหนดสื่อของผู้ใช้ได้โดยไม่บังคับในเวลาที่ส่งคำขอ ซึ่งช่วยให้เซิร์ฟเวอร์สามารถแทรก 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
คำแนะนำไคลเอ็นต์ที่มีชื่อเหมาะสม
ข้อมูลเบื้องต้นเกี่ยวกับคำแนะนำสำหรับไคลเอ็นต์ที่สำคัญ
Client Hints ที่เสนอใน ส่วนหัวของ Client Hints สำหรับฟีเจอร์สื่อตามค่ากำหนดของผู้ใช้ น่าจะใช้เป็น Client Hints ที่สำคัญมากที่สุด Client Hints ที่สำคัญคือ Client Hints ที่เปลี่ยนแปลงทรัพยากรผลลัพธ์อย่างมีนัยสำคัญ ระบบควรดึงข้อมูล ดังกล่าวอย่างสม่ำเสมอเมื่อโหลดหน้าเว็บ (รวมถึงการโหลดหน้าเว็บครั้งแรก) เพื่อ หลีกเลี่ยงการเปลี่ยนที่ผู้ใช้เห็นแล้วรู้สึกไม่ราบรื่น
ไวยากรณ์ของ Client Hint
ฟีเจอร์สื่อค่ากําหนดของผู้ใช้ประกอบด้วยชื่อ (เช่น prefers-reduced-motion
) และค่าที่อนุญาต
(เช่น no-preference
หรือ reduce
) ฟิลด์ส่วนหัวคำแนะนำไคลเอ็นต์แต่ละรายการจะแสดงเป็นออบเจ็กต์ส่วนหัวที่มีโครงสร้างสำหรับ HTTP
ซึ่งมีรายการที่มีค่าเป็นสตริง ตัวอย่างเช่น หากต้องการสื่อว่าผู้ใช้ต้องการธีมมืดและลดการเคลื่อนไหว Client Hints จะมีลักษณะดังตัวอย่างด้านล่าง
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
Client Hint | ค่าที่อนุญาต | ฟีเจอร์สื่อที่เกี่ยวข้องกับค่ากำหนดของผู้ใช้ |
---|---|---|
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 |
การสนับสนุนเบราว์เซอร์
ส่วนหัวคำแนะนำไคลเอ็นต์ Sec-CH-Prefers-Color-Scheme
รองรับใน Chromium 93
Chromium 108 รองรับส่วนหัวคำแนะนำไคลเอ็นต์ Sec-CH-Prefers-Reduced-Motion
ความคิดเห็นของผู้ให้บริการรายอื่นๆ กล่าวคือ WebKit
และ Mozilla อยู่ระหว่างรอการพิจารณา
การสาธิต Sec-CH-Prefers-Color-Scheme
ลองใช้เดโมและสังเกตว่า CSS แบบอินไลน์เปลี่ยนแปลงตามรูปแบบสีที่ผู้ใช้ต้องการอย่างไร ดูซอร์สโค้ดได้ที่ GitHub
การสาธิต Sec-CH-Prefers-Reduced-Motion
ลองใช้เดโมและสังเกตว่า CSS แบบอินไลน์เปลี่ยนแปลงตามค่ากำหนดการเคลื่อนไหวของผู้ใช้อย่างไร ดูซอร์สโค้ดได้ที่ GitHub
วิธีการทำงาน
- ไคลเอ็นต์ส่งคำขอเริ่มต้นไปยังเซิร์ฟเวอร์
bash GET / HTTP/2 Host: example.com
- เซิร์ฟเวอร์จะตอบกลับโดยแจ้งให้ไคลเอ็นต์ทราบผ่าน
Accept-CH
ว่ายอมรับSec-CH-Prefers-Color-Scheme
และคำแนะนำไคลเอ็นต์Sec-CH-Prefers-Contrast
ซึ่งตาม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
- คำแนะนำสำหรับไคลเอ็นต์
- ความน่าเชื่อถือของคำแนะนำสำหรับไคลเอ็นต์
- Media Queries ระดับ 5
- ส่วนหัวที่มีโครงสร้างสำหรับ HTTP
คำขอบคุณ
ขอขอบคุณสำหรับความคิดเห็นและคำแนะนำที่มีค่าจาก Yoav Weiss รูปภาพหลักโดย Tdadamemd ใน Wikimedia Commons