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

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
dimagolov
я все прекрасно понял, только клиенту разница в секунду - не будет заметна, уж поверь мне. Это еще кстати надо тестить насколько eval будет медленным на современных движках парсинга JS кода в хроме, мозилле и опере. Осла не берем, он тормоз.

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

Adelf

Administrator
Команда форума
только клиенту разница в секунду - не будет заметна, уж поверь мне.
Не верю :) Секунда - это много. Современные тынденции и все такое.. летать все должно.

А по второму абзацу - согласен. JSMin + gzip - отличный вариант.
 

weregod

unserializer
если канал широкий и задача расслабить сервер, то и gzip негодный против годного js-минифайнинга ;)
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Adelf
Да не верь. Секунда ничто, так как кроме твоего JS еще будет грузиться графика и т.д. Часть нее наверняка в кеш еще не попала. Где-то будут по onload запущены ajax запросы, которые придут попозже самой страницы и все в таком духе.

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

Летало - это уже спорный вопрос. Половина jquery, к примеру, на сайтах не требуется вообще, чтобы все работало в стиле web 2.0... Но ведь засунут все библиотеку и UI в придачу)
 

LONGMAN

Dark Side of the Moon..
Все js файлы минимизировал и подключается с помошью php скрипта, который читает все эти файлы, объединяет контент и выдает под хедера text/javascript. Но беда в том что браузер почемуто не кеширует этот php файл. Firebug->Net каждый раз показывает:
js.php 200 OK
а ведь должен:
js.php 304 Not modified
Попробовал поставить cache control header-ы в js.php, но резултата не дал..
 

dimagolov

Новичок
а ведь должен:
js.php 304 Not modified
кому он должен? это ведь не статика, а раз так, апач и не пытается определять дату модификации скрипта для проверки протух он или нет, а тупо запрашивает пхп. вот если бы пых (твой скрипт) посмотрел бы на даты и отдал 304, тогда да, что-то и получилось бы.
 

LONGMAN

Dark Side of the Moon..
dimagolov
Что делать? Или хотя бы по какому вопросу гуглить?
 

Gas

может по одной?
как маленький, возьми firebug'ом посмотри какие хедеры отдаёт вебсервер при отдаче статического js-файла и отдавай теже скриптом, если ничего не изменилось.
 

LONGMAN

Dark Side of the Moon..
Gas
Сервер отдает 403 Not modified. Скриптом отдавать кажды раз такой хедер не могу, ведь не знаю есть или нет у пользователя этот файл в кеше
 

Gas

может по одной?
ведь не знаю есть или нет у пользователя этот файл в кеше
узнать можно по наличию заголовка If-Modified-Since или If-None-Match. Но чтоб с этим всем не гемороится, я бы так сделал:

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

На продакшене в deploy-скрипт дописываешь вызов файла по перегенериации сжатого js или руками его вызываешь. И продакшн не грузится отдачей js'а через скрипт, и на dev'е нет проблем с постоянным ручным перегенерирыванием в случае внесения изменений.
 

dimagolov

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

-~{}~ 11.08.10 15:47:

опоздал
 

LONGMAN

Dark Side of the Moon..
Сделал так:
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
Твой метод хорош, но сейчас нужно сделать отдачу из скрипта. В следующем проэкте наверно сделаю по твоему.
 

dimagolov

Новичок
LONGMAN, понятно, что не работает... ведь к тебя стоит Expires через год, то есть в течении этого года браузер будет брать в локальном кеше этот файл и вообще ничего не запрашивать с сервера.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
От это пипец тут)

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

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

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

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

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