Как сделать ссылку на сжатый JavaScript в HTML-документе? - PullRequest
6 голосов
/ 09 октября 2008

Я видел несколько ссылок на сжатие javascript для экономии времени загрузки. Но Я также вижу ряд предупреждений о том, что некоторые браузеры не поддерживают это.

В моем распоряжении два разных метода:

  1. используйте mod_deflate, чтобы Apache сжимал файлы JS / CSS в заданном каталоге с помощью htaccess
  2. используйте ob_start('gzhandler') для сжатия файла и возврата его в браузер с правильными заголовками.

Проблемы с методом 1 состоят в том, что не все браузеры поддерживают mod_deflate, и я понятия не имею, как написать файл .htaccess, чтобы быть достаточно умным, чтобы приспособиться к этому.

Проблема метода 2 заключается в том, что нет однозначного ответа о том, как определить, поддерживает ли браузер скрипт gzipped или таблицу стилей, и что, если он это делает, тип mime должен быть указан в качестве типа контента в заголовке.

Мне нужен совет. Во-первых, какой метод более универсален для браузеров? Во-вторых, как мне распадаться, используя любой из этих методов, чтобы предоставить несжатый сценарий резервного копирования? В-третьих, <script src="js/lib.js.gz" type="text/javascript"></script> будет работать само по себе? (Очевидно, он не распадется.)

Для справки, я использую PHP5 с mod_deflate и возможностями полного создания gzip, а мой doctype строгий xhtml. Кроме того, сам javascript сжимается с помощью YUI. Редактировать: Я просто вернулся и посмотрел, но у меня есть только Apache 1.3; Я думал, что у меня есть 2, так что извините за упоминание mod_deflate, когда у меня его, вероятно, нет.

Ответы [ 3 ]

10 голосов
/ 09 октября 2008

mod_deflate и gzhandler от php оба основаны на zlib, поэтому в этом смысле браузер мало чем отличается от способа сжатия содержимого.

в ответ на ваше первое беспокойство вы можете установить специфичную для модуля информацию .htaccess следующим образом:

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

в ответ на ваше второе беспокойство вы можете обнаружить поддержку браузера в PHP:

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

вот несколько непроверенных .htaccess, которые должны быть в состоянии обработать согласование сжатых и несжатых файлов .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>    
2 голосов
/ 09 октября 2008

Если браузер правильно настроил заголовок Accept-Encoding, вы сможете определить, поддерживает ли браузер gzip:

Accept-Encoding: gzip,deflate
1 голос
/ 09 октября 2008

Лучший способ добиться этого - поддерживать на своем сервере встроенный gzip. Вы бы удалили «.gz» из атрибута src тега script и сохранили файл на сервере без сжатия. Если клиент поддержит это, сервер автоматически отправит скрипт как результат в формате gzip. Это стоит вашему серверу некоторого дополнительного ЦП, но файл сжимается для тех клиентов, которые его поддерживают, в то время как старые клиенты все еще получают расширенную версию.

Проверьте mod_deflate для apache2. mod_gzip является эквивалентом Apache 1.x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...