Bởi vì, trong ví dụ của bạn, máy chủ web sẽ luôn gửi CSS và hình ảnh bất kể máy khách đã có chúng hay chưa, do đó làm lãng phí rất nhiều băng thông (và do đó làm cho kết nối chậm hơn , thay vì nhanh hơn bằng cách giảm độ trễ, có lẽ là ý định của bạn). Lưu ý rằng các tệp CSS, JavaScript và hình ảnh thường được gửi với thời gian hết hạn rất dài vì chính xác lý do đó (vì khi bạn cần thay đổi chúng, bạn chỉ cần thay đổi tên tệp để buộc bản sao mới sẽ được lưu vào bộ nhớ cache trong một thời gian dài).
Bây giờ, bạn có thể cố gắng khắc phục sự lãng phí băng thông đó bằng cách nói " OK, nhưng máy khách có thể chỉ ra rằng nó đã có một số tài nguyên đó, vì vậy máy chủ sẽ không gửi lại ". Cái gì đó như:
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"
Và sau đó chỉ nhận các tệp chưa thay đổi được gửi qua một kết nối TCP (sử dụng đường ống HTTP qua kết nối liên tục). Và đoán xem? Đó là cách nó đã hoạt động (bạn cũng có thể sử dụng If-Modified-Because thay vì If-none-Match ).
Nhưng nếu bạn thực sự muốn giảm độ trễ bằng cách lãng phí nhiều băng thông (như trong yêu cầu ban đầu của bạn), bạn có thể thực hiện điều đó ngay hôm nay bằng cách sử dụng HTTP / 1.1 tiêu chuẩn khi thiết kế trang web của mình. Lý do hầu hết mọi người không làm điều đó là vì họ không nghĩ rằng nó đáng giá.
Để làm điều đó, bạn không cần phải có CSS hoặc JavaScript trong tệp riêng biệt, bạn có thể đưa chúng vào tệp HTML chính bằng cách sử dụng <style>
và <script>
thẻ (bạn có thể không cần phải làm thủ công, công cụ mẫu của bạn có thể tự động làm điều đó) . Bạn thậm chí có thể bao gồm hình ảnh trong tệp HTML bằng URI dữ liệu , như thế này:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />
Tất nhiên, mã hóa base64 làm tăng mức sử dụng băng thông một chút, nhưng nếu bạn không quan tâm đến việc lãng phí băng thông, thì đó không phải là vấn đề.
Bây giờ, nếu bạn thực sự quan tâm, bạn thậm chí có thể làm cho các tập lệnh web của mình đủ thông minh để tận dụng tốt nhất cả hai thế giới: theo yêu cầu đầu tiên (người dùng không có cookie), gửi mọi thứ (CSS, JavaScript, hình ảnh) chỉ được nhúng trong một HTML duy nhất tệp như được mô tả ở trên, thêm thẻ liên kết rel = "prefetch" cho các bản sao bên ngoài của tệp và thêm cookie. Nếu người dùng đã có cookie (ví dụ: anh ta đã truy cập trước đó), thì hãy gửi cho anh ta một HTML thông thường <img src="example.jpg">
, <link rel="stylesheet" type="text/css" href="style.css">
v.v.
Vì vậy, trong lần truy cập đầu tiên, trình duyệt sẽ chỉ yêu cầu một tệp HTML và nhận và hiển thị mọi thứ. Sau đó, nó sẽ (khi nhàn rỗi) tải trước CSS, JS, hình ảnh bên ngoài. Lần tới khi người dùng truy cập, trình duyệt sẽ yêu cầu và chỉ nhận tài nguyên thay đổi (có thể chỉ là HTML mới).
Dữ liệu hình ảnh CSS + JS + bổ sung sẽ chỉ được gửi hai lần, ngay cả khi bạn nhấp vào hàng trăm lần trên trang web. Tốt hơn nhiều so với hàng trăm lần như đề xuất giải pháp của bạn đề xuất. Và nó sẽ không bao giờ (không phải lần đầu tiên, cũng không phải lần sau) sử dụng nhiều hơn một chuyến đi khứ hồi tăng độ trễ.
Bây giờ, nếu điều đó nghe có vẻ quá nhiều công việc và bạn không muốn đi với một giao thức khác như SPDY , thì đã có các mô-đun như mod_pagespeed cho Apache, có thể tự động thực hiện một số công việc đó cho bạn (hợp nhất nhiều tệp CSS / JS thành một, tự động nội tuyến CSS nhỏ và thu nhỏ chúng, tạo các điểm giữ chỗ nhỏ trong khi chờ tải bản gốc, tải hình ảnh lười biếng, v.v.) mà không yêu cầu bạn sửa đổi một dòng trang web của bạn.