2008-10-09 5 views
6

Tôi đã nhìn thấy một số tham chiếu để gzipping một javascript để tiết kiệm thời gian tải xuống. Nhưng Tôi cũng thấy một số cảnh báo mà một số trình duyệt nhất định không hỗ trợ điều này.Làm thế nào để liên kết đến một javascript gzipped trong một tài liệu html?

Tôi có hai phương pháp khác nhau theo ý của tôi:

  1. sử dụng mod_deflate để làm cho Apache nén JS files/CSS trong một thư mục nhất định thông qua htaccess
  2. sử dụng ob_start('gzhandler') để nén một tập tin và gửi lại cho trình duyệt với tiêu đề chính xác.

Các vấn đề với phương pháp 1 không phải tất cả các trình duyệt đều hỗ trợ mod_deflate và tôi không biết cách viết tệp .htaccess đủ thông minh để điều chỉnh.

Vấn đề với phương pháp 2 là không có câu trả lời dứt khoát về cách cho biết trình duyệt có hỗ trợ tập lệnh gzipped hay biểu định kiểu hay không và điều đó có phải là loại mime phải được cung cấp làm loại nội dung trong tiêu đề hay không .

Tôi cần một số lời khuyên. Thứ nhất, phương thức nào được các trình duyệt chấp nhận rộng rãi hơn? Thứ hai, làm thế nào để phân rã bằng cách sử dụng một trong hai phương pháp để cung cấp kịch bản sao lưu không nén? Thứ ba, sẽ tự mình làm việc <script src="js/lib.js.gz" type="text/javascript"></script>? (Nó rõ ràng sẽ không phân rã.)

Để ghi lại, tôi đang sử dụng PHP5 với mod_deflate và khả năng tạo gzip đầy đủ và tài liệu của tôi là xhtml nghiêm ngặt. Ngoài ra, bản thân javascript được nén với YUI. Chỉnh sửa: Tôi vừa quay lại và nhìn, nhưng tôi chỉ có Apache 1.3; Tôi nghĩ rằng tôi đã có 2, vì vậy xin lỗi vì đã đề cập đến mod_deflate khi tôi có lẽ không có nó.

Trả lời

10

mod_deflate và gzhandler của php đều dựa trên zlib, do đó, theo nghĩa đó, có rất ít sự khác biệt đối với trình duyệt cách nội dung đang được nén.

để đáp ứng mối quan tâm đầu tiên của bạn, bạn có thể đặt môđun thông tin .htaccess cụ thể như thế này:

<IfModule mod_deflate.c> 
    # stuff 
</IfModule> 

để đáp ứng mối quan tâm thứ hai của bạn, bạn có thể phát hiện cho trình duyệt hỗ trợ trong PHP:

if (strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) { 
    ob_start('ob_gzhandler'); 
    header("Content-Encoding: gzip"); 
// etc... 
} 

đây là một số .htaccess chưa được kiểm tra sẽ có thể xử lý việc đàm phán nén và không nén.file js: (source)

<FilesMatch "\\.js.gz$"> 
    ForceType text/javascript 
    Header set Content-Encoding: gzip 
</FilesMatch> 
<FilesMatch "\\.js$"> 
    RewriteEngine On 
    RewriteCond %{HTTP_USER_AGENT} !".*Safari.*" 
    RewriteCond %{HTTP:Accept-Encoding} gzip 
    RewriteCond %{REQUEST_FILENAME}.gz -f 
    RewriteRule (.*)\.js$ $1\.js.gz [L] 
    ForceType text/javascript 
</FilesMatch>  
+0

Bạn có biết cách thay đổi kiểm tra tác nhân người dùng để xem đó là IE6 hoặc thấp hơn không? Tôi muốn gửi IE6- tới tệp JS chuẩn. (Rõ ràng họ là cầu kỳ về gzip trước IE6 SP2 và IE7.) –

+0

tôi tin rằng bạn sẽ có thể chỉ cần kiểm tra người dùng đại lý cho "MSIE 6.0" – Owen

+0

oh quên thêm nó tầm thường để giả mạo người dùng đại lý, nhưng tôi giả sử nhất ie6 người dùng sẽ không thực sự được vào đó dù sao đi nữa: RewriteCond% {HTTP_USER_AGENT}! ". * MSIE 6 \ .0. *" nên hoạt động – Owen

1

Cách tốt nhất để đạt được điều này là dành cho máy chủ của bạn hỗ trợ gzip nội tuyến. Bạn sẽ lấy ".gz" ra khỏi thuộc tính src của thẻ script và lưu trữ tệp trên máy chủ không nén. Nếu máy khách hỗ trợ nó, máy chủ sẽ tự động gửi kịch bản dưới dạng kết quả được mã hóa gzip. Điều này làm cho máy chủ của bạn tốn thêm một số CPU, nhưng tệp được nén cho những khách hàng hỗ trợ nó, trong khi các máy khách cũ vẫn nhận được phiên bản mở rộng.

Kiểm tra mod_deflate cho apache2. mod_gzip tương đương với Apache 1.x.

+0

Tôi đã nhìn mod_deflate nói chung , nhưng tôi đã quên rằng máy chủ của tôi chỉ có Apache 1.3. Vậy ... điều đó làm hỏng ý tưởng đó! –

+0

Tương đương với apache 1.3 là mod_gzip – nsayer

2

Nếu trình duyệt được đúng thiết lập nó Accept-Encoding tiêu đề, bạn nên có thể cho biết nếu trình duyệt có thể hỗ trợ gzip:

Accept-Encoding: gzip,deflate