예를 들어, 웹 서버는 클라이언트에 이미 CSS와 이미지가 있는지 여부에 관계없이 항상 CSS와 이미지를 전송하므로 대역폭을 크게 낭비하므로 대기 시간을 줄임으로써 속도를 높이는 대신 연결 속도를 늦추므로 의도 한 것입니다. CSS, JavaScript 및 이미지 파일은 일반적으로 정확한 이유 때문에 매우 긴 만료 시간으로 전송됩니다 (변경해야 할 때 파일 이름 만 변경하면 새 사본이 다시 캐시됩니다).
이제 " OK "라고 말하여 대역폭 낭비를 해결할 수는 있지만 클라이언트가 이미 해당 리소스 중 일부를 가지고 있음을 나타낼 수 있으므로 서버가 다시 보내지 않습니다 . 다음과 같은 것 :
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-None-Match 대신 If-Modified-Since 를 사용할 수도 있습니다 ).
그러나 원래 요청과 같이 많은 대역폭을 낭비하여 대기 시간을 줄이려면 웹 사이트를 디자인 할 때 표준 HTTP / 1.1을 사용하여 오늘날 그렇게 할 수 있습니다. 대부분의 사람들이하지 않는 이유는 가치가 있다고 생각하지 않기 때문입니다.
이를 수행하려면 CSS를하거나 자바 스크립트의 별도의 파일에, 당신은 사용하여 주 HTML 파일에 포함 할 필요가 없습니다 <style>
및 <script>
태그 (당신은 아마 수동으로 수행 할 필요가 없습니다, 템플릿 엔진은 아마 자동으로 수행 할 수 있습니다) . 다음 과 같이 data URI를 사용하여 HTML 파일에 이미지를 포함시킬 수도 있습니다 .
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />
물론 base64 인코딩은 대역폭 사용량을 약간 늘리지 만 낭비되는 대역폭에 신경 쓰지 않는다면 문제가되지 않습니다.
이제 당신이 정말로 걱정한다면, 당신은 두 가지 세계를 최대한 활용할 수 있도록 웹 스크립트를 똑똑하게 만들 수 있습니다 : 첫 번째 요청 (사용자가 쿠키를 가지고 있지 않음), 하나의 HTML에 내장 된 모든 것 (CSS, JavaScript, 이미지)을 보내십시오 위에서 설명한 것처럼 파일의 경우 파일의 외부 사본에 대한 링크 rel = "prefetch"태그 를 추가하고 쿠키를 추가하십시오. 사용자에게 이미 쿠키가있는 경우 (예 : 이전에 방문한 적이있는 <img src="example.jpg">
경우) <link rel="stylesheet" type="text/css" href="style.css">
등으로 일반 HTML 만 보내십시오 .
따라서 처음 방문 할 때 브라우저는 단일 HTML 파일 만 요청하고 모든 것을 가져와 표시합니다. 그런 다음 (유휴 상태 일 때) 지정된 외부 CSS, JS, 이미지를 미리로드합니다. 다음에 사용자가 방문하면 브라우저는 변경된 리소스 (아마도 새로운 HTML) 만 요청하고 가져옵니다.
웹 사이트에서 수백 번 클릭하더라도 추가 CSS + JS + 이미지 데이터는 두 번만 전송됩니다. 제안 된 솔루션이 제안한 수백 번보다 훨씬 낫습니다. 그리고 그것은 결코 것 (하지 처음에,도 다음 시간에) 더보다 사용 하나 대기 시간이 증가 왕복.
이제 너무 많은 소리가 들리고 SPDY 와 같은 다른 프로토콜을 사용하고 싶지 않은 경우 이미 Apache 용 mod_pagespeed 와 같은 모듈이 있습니다.이 모듈 은 자동으로 해당 작업 중 일부를 수행 할 수 있습니다 (여러 CSS / JS 파일 병합) 작은 CSS를 자동으로 인라인하고 최소화하여 원본이로드되기를 기다리는 동안 작은 자리 표시 자 인라인 이미지를 만들고 이미지를 느리게로드하는 등)를 수행합니다.