Вопрос о подключении js файлов

  • Автор темы Автор темы LONGMAN
  • Дата начала Дата начала
dimagolov
я все прекрасно понял, только клиенту разница в секунду - не будет заметна, уж поверь мне. Это еще кстати надо тестить насколько eval будет медленным на современных движках парсинга JS кода в хроме, мозилле и опере. Осла не берем, он тормоз.

Я обычно юзаю JSMin ибо привык к нему, у меня в движке все файлы яваскрипта автоматом прогоняются через него и склеиваются в один большой, после чего кладутся в папку кеша. Второй минифаер я привел чисто для тестов, чтобы вас убедить что прирост от совместных технологий gzip+minify будет существенным. На одном минифаере как-то совсем уж несолидно обзор было писать...
 
только клиенту разница в секунду - не будет заметна, уж поверь мне.
Не верю :) Секунда - это много. Современные тынденции и все такое.. летать все должно.

А по второму абзацу - согласен. JSMin + gzip - отличный вариант.
 
если канал широкий и задача расслабить сервер, то и gzip негодный против годного js-минифайнинга ;)
 
Adelf
Да не верь. Секунда ничто, так как кроме твоего JS еще будет грузиться графика и т.д. Часть нее наверняка в кеш еще не попала. Где-то будут по onload запущены ajax запросы, которые придут попозже самой страницы и все в таком духе.

Потому пока JS разжимается, у тебя будет еще грузиться графика или еще какая хрень.

Летало - это уже спорный вопрос. Половина jquery, к примеру, на сайтах не требуется вообще, чтобы все работало в стиле web 2.0... Но ведь засунут все библиотеку и UI в придачу)
 
Все js файлы минимизировал и подключается с помошью php скрипта, который читает все эти файлы, объединяет контент и выдает под хедера text/javascript. Но беда в том что браузер почемуто не кеширует этот php файл. Firebug->Net каждый раз показывает:
js.php 200 OK
а ведь должен:
js.php 304 Not modified
Попробовал поставить cache control header-ы в js.php, но резултата не дал..
 
а ведь должен:
js.php 304 Not modified
кому он должен? это ведь не статика, а раз так, апач и не пытается определять дату модификации скрипта для проверки протух он или нет, а тупо запрашивает пхп. вот если бы пых (твой скрипт) посмотрел бы на даты и отдал 304, тогда да, что-то и получилось бы.
 
dimagolov
Что делать? Или хотя бы по какому вопросу гуглить?
 
как маленький, возьми firebug'ом посмотри какие хедеры отдаёт вебсервер при отдаче статического js-файла и отдавай теже скриптом, если ничего не изменилось.
 
Gas
Сервер отдает 403 Not modified. Скриптом отдавать кажды раз такой хедер не могу, ведь не знаю есть или нет у пользователя этот файл в кеше
 
ведь не знаю есть или нет у пользователя этот файл в кеше
узнать можно по наличию заголовка If-Modified-Since или If-None-Match. Но чтоб с этим всем не гемороится, я бы так сделал:

отдельный скрипт, который генерит статический ужатый js-файл и ложит в public директорию.
Там где в шаблоне идёт подключение js-файла, ставишь проверку
if(IS_PRODUCTION) static.js
else merge-js.php

На продакшене в deploy-скрипт дописываешь вызов файла по перегенериации сжатого js или руками его вызываешь. И продакшн не грузится отдачей js'а через скрипт, и на dev'е нет проблем с постоянным ручным перегенерирыванием в случае внесения изменений.
 
Скриптом отдавать кажды раз такой хедер не могу, ведь не знаю есть или нет у пользователя этот файл в кеше
Как это не можешь? А If-Modified-Since который тебе посылает клиент тебе для чего? именно для сравнения с актуальной датой твоего скрипта.

-~{}~ 11.08.10 15:47:

опоздал
 
Сделал так:
PHP:
$mt_str = 'Fri, 14 Jan 2010 12:15:52 GMT';
$mt = strtotime($mt_str);
header('Cache-control: public');
header('Pragma: cache');
header("Expires: ".gmdate("D, d M Y H:i:s", time()+86400 * 365)." GMT");
header("Cache-Control: max-age=315360000");
header('Content-type: text/javascript');

$cache = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : 0;

if ($cache)
{
$cache_mt = strtotime($cache);
	if ($cache_mt >= $mt)
	{
header('HTTP/1.1 304 Not Modified');
		exit;
	}
}
header('Last-Modified: '.$mt_str);
Но не работает

-~{}~ 12.08.10 01:50:

Gas
Твой метод хорош, но сейчас нужно сделать отдачу из скрипта. В следующем проэкте наверно сделаю по твоему.
 
LONGMAN, понятно, что не работает... ведь к тебя стоит Expires через год, то есть в течении этого года браузер будет брать в локальном кеше этот файл и вообще ничего не запрашивать с сервера.
 
От это пипец тут)

LONGMAN
чтобы создать нормальный ужатый файл, и потом подключить его не надо писать никакие хедеры и прочее.

Достаточно того, что ты берешь файлы, которые тебе нужно (скажем 5 штук). Считаешь md5 хэш от их имен+время последней модификации каждого. Смотришь в папке, где должен лежать такой файл, если он уже там есть с таким хэшем в имени - просто печатаем ссылку на него в тег < script >, а если нет файла - создаем его и пишем ссылку на него в < script >.

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

Однако при таком раскладе, ты можешь хоть на 10 лет вперед поставить Expires заголовок в конфиге сервера, при первом мизерном изменении файла у тебя кеш перегенерится.

Ну а по нормальному то конечно на продакшене все делаешь один раз и ничего скриптом не проверяешь потом. Файлы там редко меняющиеся обычно.
 
Сверху