2008-10-09 15 views
6

He visto una serie de referencias a gzipping un javascript para ahorrar tiempo de descarga. Pero También veo una serie de advertencias de que ciertos navegadores no son compatibles con esto.¿Cómo enlazar a un javascript gzip en un documento html?

Tengo dos métodos diferentes a mi disposición:

  1. uso mod_deflate para que los archivos/CSS Apache compresa JS en un directorio dado a través de htaccess
  2. uso ob_start('gzhandler') para comprimir un archivo y volver al navegador con los encabezados correctos.

Los problemas con el método 1 es que no todos los navegadores soportan mod_deflate, y no tengo ni idea de cómo escribir el archivo .htaccess que ser lo suficientemente inteligente como para ajustar esto.

El problema con el método 2 es que no hay una respuesta definitiva sobre cómo saber si un navegador admite un guión gzipped o una hoja de estilo, y si lo hace, debe proporcionarse mime-type como tipo de contenido en el encabezado .

Necesito algunos consejos. Primero, ¿qué método es más universalmente aceptado por los navegadores? En segundo lugar, ¿cómo puedo descomponer usando cualquiera de los métodos para proporcionar el script de copia de seguridad sin comprimir? En tercer lugar, ¿funcionaría <script src="js/lib.js.gz" type="text/javascript"></script> por sí mismo? (Obviamente no decaería.)

Para el registro, estoy usando PHP5 con mod_deflate y capacidades completas de creación de gzip, y mi doctype es xhtml strict. Además, el javascript en sí mismo está comprimido con YUI. Edit: Acabo de regresar y miré, pero solo tengo Apache 1.3; Pensé que tenía 2, lo siento por mencionar mod_deflate cuando probablemente no lo tengo.

Respuesta

10

mod_deflate y gzhandler de php ambos están basados ​​en zlib, por lo que en ese sentido hay poca diferencia para un navegador en cómo se comprime el contenido.

en respuesta a su primera preocupación, puede establecer módulo de información específica .htaccess así:

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

en respuesta a su segunda preocupación, se pueden detectar por el apoyo del navegador en PHP:

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

aquí hay algún .htaccess no probado que debería ser capaz de manejar la negociación de comprimido vs sin comprimir.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

¿Sabes cómo cambiar la verificación del agente de usuario para ver si es IE6 o inferior? Deseo enviar IE6 al archivo JS estándar. (Aparentemente son exigentes con gzip antes de IE6 SP2 e IE7). –

+0

Creo que deberías poder comprobar user-agent para "MSIE 6.0" – Owen

+0

oh olvides añadir que es trivial para spoof user-agent, pero supongo que es más ie6 los usuarios realmente no estarían en eso de ninguna manera: RewriteCond% {HTTP_USER_AGENT}! ". * MSIE 6 \ .0. *" debería funcionar – Owen

1

La mejor manera de lograr esto es que su servidor admita gzip en línea. Quitaría el ".gz" del atributo src de la etiqueta de secuencia de comandos y almacenaría el archivo en el servidor sin comprimir. Si el cliente lo admite, el servidor automáticamente enviará la secuencia de comandos como un resultado codificado gzip. Esto le cuesta a su servidor algo de CPU adicional, pero el archivo se comprime para los clientes que lo soportan, mientras que los clientes más antiguos todavía obtienen la versión expandida.

Echa un vistazo a mod_deflate para apache2. mod_gzip es el equivalente de Apache 1.x.

+0

He mirado en mod_deflate en general , pero había olvidado que mi servidor solo tenía Apache 1.3. Entonces ... ¡arruina esa idea! –

+0

El equivalente para apache 1.3 es mod_gzip – nsayer

2

Si el navegador está estableciendo adecuadamente se Accept-Encoding cabecera, que debe ser capaz de saber si el navegador puede apoyar gzip:

Accept-Encoding: gzip,deflate 
Cuestiones relacionadas