เพราะในตัวอย่างของคุณเว็บเซิร์ฟเวอร์จะส่ง CSS และอิมเมจเสมอโดยไม่คำนึงว่าไคลเอ็นต์มีอยู่แล้วดังนั้นจึงสิ้นเปลืองแบนด์วิดท์อย่างมาก (และทำให้การเชื่อมต่อช้าลงแทนที่จะเร็วขึ้นโดยลดความล่าช้าซึ่งอาจเป็นเจตนาของคุณ) โปรดทราบว่าโดยปกติแล้วไฟล์ CSS, JavaScript และรูปภาพจะถูกส่งด้วยเวลาที่หมดอายุอย่างมากด้วยเหตุผลนั้น (เช่นเมื่อคุณต้องการเปลี่ยนคุณเพียงแค่เปลี่ยนชื่อไฟล์เพื่อบังคับให้สำเนาใหม่ซึ่งจะถูกแคชอีกครั้งเป็นเวลานาน)
ตอนนี้คุณสามารถลองใช้แบนด์วิดท์ที่เสียไปโดยพูดว่า " ตกลง แต่ไคลเอนต์อาจระบุว่ามีทรัพยากรบางส่วนอยู่แล้วดังนั้นเซิร์ฟเวอร์จะไม่ส่งอีกครั้ง " สิ่งที่ต้องการ:
GET /index.html HTTP/1.1
Host: www.example.com
If-None-Match: "686897696a7c876b7e"
Connection: Keep-Alive
GET /style.css HTTP/1.1
Host: www.example.com
If-None-Match: "70b26618ce2c246c71"
GET /image.png HTTP/1.1
Host: www.example.com
If-None-Match: "16d5b7c2e50e571a46"
จากนั้นรับเฉพาะไฟล์ที่ไม่ได้เปลี่ยนรับส่งผ่านการเชื่อมต่อ TCP เดียว (โดยใช้การไพพ์ไลน์ HTTP ผ่านการเชื่อมต่อแบบถาวร) และคาดเดาอะไร มันเป็นวิธีการทำงานแล้ว (คุณสามารถใช้If-Modified- เนื่องจากแทนที่จะเป็นIf-None-Match )
แต่ถ้าคุณต้องการลดความหน่วงจริง ๆ ด้วยการสูญเสียแบนด์วิดท์จำนวนมาก (เช่นเดียวกับคำขอต้นฉบับของคุณ) คุณสามารถทำได้โดยใช้ HTTP / 1.1 มาตรฐานเมื่อทำการออกแบบเว็บไซต์ของคุณ เหตุผลที่คนส่วนใหญ่ไม่ทำเพราะพวกเขาไม่คิดว่ามันคุ้มค่า
ในการทำเช่นนั้นคุณไม่จำเป็นต้องมี CSS หรือ JavaScript ในไฟล์แยกต่างหากคุณสามารถรวมไว้ในไฟล์ HTML หลักโดยใช้<style>
และ<script>
แท็ก (คุณอาจไม่จำเป็นต้องทำมันด้วยตนเองแม่แบบเครื่องยนต์ของคุณอาจทำโดยอัตโนมัติ) . คุณสามารถรวมภาพในไฟล์ HTML โดยใช้data URIเช่นนี้:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />
แน่นอนว่าการเข้ารหัส base64 จะเพิ่มการใช้แบนด์วิดท์เล็กน้อย แต่ถ้าคุณไม่สนใจแบนด์วิธที่เสียไปนั่นก็ไม่น่าเป็นปัญหา
ตอนนี้ถ้าคุณใส่ใจจริงๆคุณสามารถทำให้เว็บสคริปต์ของคุณฉลาดพอที่จะทำให้ทั้งสองโลกดีที่สุด: ตามคำขอแรก (ผู้ใช้ไม่มีคุกกี้) ส่งทุกอย่าง (CSS, JavaScript, ภาพ) ที่ฝังอยู่ใน HTML เดียว ไฟล์ตามที่อธิบายไว้ข้างต้นเพิ่มlink rel = "prefetch" แท็กสำหรับการคัดลอกไฟล์ภายนอกและเพิ่มคุกกี้ หากผู้ใช้มีอยู่แล้วคุกกี้ (เช่น. เขาได้ไปเยือนมาก่อน) แล้วส่งเขาเพียง HTML ปกติ<img src="example.jpg">
, <link rel="stylesheet" type="text/css" href="style.css">
ฯลฯ
ดังนั้นในการเยี่ยมชมเบราว์เซอร์ครั้งแรกจะขอเพียงไฟล์ HTML เดียวและได้รับและแสดงทุกอย่าง จากนั้นมันจะ (เมื่อไม่ได้ใช้งาน) โหลด CSS ภายนอกที่ระบุไว้ล่วงหน้า, JS, รูปภาพ ครั้งต่อไปที่ผู้ใช้เยี่ยมชมเบราว์เซอร์จะขอและรับทรัพยากรที่เปลี่ยนแปลงเท่านั้น (อาจเป็นเพียง HTML ใหม่)
ข้อมูลรูปภาพ CSS + JS + พิเศษจะถูกส่งสองครั้งเท่านั้นแม้ว่าคุณจะคลิกหลายร้อยครั้งบนเว็บไซต์ ดีกว่าหลายร้อยเท่าตามที่คุณแนะนำ และมันจะไม่เคย (ไม่ใช่ในครั้งแรกและในครั้งต่อไป) ใช้มากกว่าหนึ่งรอบการเดินทางที่เพิ่มความล่าช้า
ตอนนี้ถ้ามันฟังดูเหมือนทำงานมากเกินไปและคุณไม่ต้องการไปกับโพรโทคอลอื่นเช่นSPDYก็มีโมดูลเช่นmod_pagespeedสำหรับ Apache ซึ่งสามารถทำงานบางอย่างให้คุณโดยอัตโนมัติ (รวมไฟล์ CSS / JS หลายไฟล์ไว้ด้วยกัน) ให้เป็นหนึ่งเดียวปรับขนาดเล็ก CSS อัตโนมัติและย่อให้เล็กลงสร้างตัวยึดตำแหน่งเล็ก ๆ ของภาพที่แทรกไว้ในขณะที่รอให้ต้นฉบับโหลดภาพที่กำลังโหลดขี้เกียจ ฯลฯ ) โดยไม่จำเป็นต้องให้คุณแก้ไขบรรทัดเดียวของหน้าเว็บ