Эксперт в области разработки веб-приложений и безопасности в интернете. Каждый месяц мой блог посещают около 90 тысяч человек. Работаю техническим директором в «Системах документооборота», занимаюсь электронным правительством.
Как видите, принцип довольно несложен.<link type="text/css" rel="stylesheet" href="core.jscss" />
<script type="text/javascript" src="core.jscss#2"></script>
Обратите внимание на «#2» после core.jscss, этот хак позволяет обойти странное поведение некоторых версий «Хрома» — без него браузер не делал попыток подгрузить файл ещё раз и JavaScript не выполнялся.<?
ob_start();
$dir = 'media/';
$expires = 10 * 365 * 24 * 60 * 60; // 10 years
$files = explode(',', str_replace('..', '', $_SERVER['QUERY_STRING']));
$css = $js = array();
foreach ($files as $file) {
switch (pathinfo($file, PATHINFO_EXTENSION)) {
case 'css':
$css[] = $dir . $file;
break;
case 'js':
$js[] = $dir . $file;
break;
}
}
$css = @array_map('file_get_contents', array_unique($css));
$js = @array_map('file_get_contents', array_unique($js));
$css = implode($css);
$js = implode($js, ';');
// removes /* comments */ from css
$css = preg_replace('!/\*.*?\*/!s', '', $css);
// removes only first /* comment */ from js
$js = preg_replace('!^/\*.*?\*/!s', '', $js);
echo <<<JSCSS
// /*
$js
"*/{"/*"}
$css
*/
JSCSS;
$len = ob_get_length();
$txt = ob_get_clean();
$etag = '"' . sha1($etag) . '"';
header("Content-type: */*; charset=utf-8");
header("Expires: " . gmdate('D, d M Y H:i:s \G\M\T', $_SERVER['REQUEST_TIME'] + $expires));
header("Cache-control: max-age=$expires, public");
header("Content-length: " . $len);
header('ETag: ' . $etag);
if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
list ($hash) = explode(';', $_SERVER['HTTP_IF_NONE_MATCH']);
if ($hash == $etag) {
header('HTTP/1.1 304 Not modified, thanx for yr question');
exit;
}
}
echo $txt;
Формат вызова простой: скрипту через запятую перечисляются файлы, которые нужно объединить и подключить (файлы берутся из папки «media», см. переменную «$dir»):
bolk (bolknote.ru)
19 апреля 2011, 23:13,
ответ предназначен Виктору
bolk (bolknote.ru)
19 апреля 2011, 23:15
reon (reon.livejournal.com)
20 апреля 2011, 00:55,
ответ предназначен bolk (bolknote.ru):
bolk (bolknote.ru)
20 апреля 2011, 01:08,
ответ предназначен reon (reon.livejournal.com):
C одной стороны идея неплохая, на один коннект меньше, но с другой стороны - концептуально неверно смешивать оформление и код.Он и не смешан. Оформление в CSS, код в JavaScript. То, что это приходит в одном файле к клиенту, концептуально ничего не меняет.
А не проще все держать в отдельных файлах и подключать просто серверным инклюдом - тогда вообще один-единственный запрос будет, если конечно не считать картинок и прочих файлов с контентом?Если сайт состоит из одной страницы, так и надо делать, в остальных случаях так делать нельзя. Вынесенный в отдельный файл CSS и JS снижает вес HTML-страницы. Когда клиент перейдёт на неё, ресурсы (JS и CSS) будут загружены из кеша.
astur (kozlov.am)
20 апреля 2011, 03:32
http://orcinus.ru (инкогнито)
20 апреля 2011, 06:52
agonych (agonych.livejournal.com)
20 апреля 2011, 06:52,
ответ предназначен astur (kozlov.am):
http://orcinus.ru (инкогнито)
20 апреля 2011, 06:55
bolk (bolknote.ru)
20 апреля 2011, 11:00,
ответ предназначен http://orcinus.ru
bolk (bolknote.ru)
20 апреля 2011, 11:03,
ответ предназначен http://orcinus.ru
Интересно, но в некоторых проектах Яндекса (уже не помню где копался), огромные портянки ЦСС шли прямо в коде самой странички, не подключаясь извне.Я ничего про это сказать не могу, просто не знаю о таких случаях.
И еще, кажется у тебя на сайте была статья о подключении дополнительной .js из подключаемого .js файла. Выглядело как обычный вывод строки. Ведь ни что не мешает написать скрипт который оформит два document.write, и модно даже многострочники оформлять, заменяя перевод строки на /n.Производительность такого решения ниже.
bolk (bolknote.ru)
20 апреля 2011, 11:05,
ответ предназначен http://orcinus.ru
Чистяков Денис (инкогнито)
20 апреля 2011, 15:07
Чистяков Денис (инкогнито)
20 апреля 2011, 15:09
maxim-zotov (инкогнито)
20 апреля 2011, 17:02
bolk (bolknote.ru)
20 апреля 2011, 18:41,
ответ предназначен maxim-zotov
bolk (bolknote.ru)
20 апреля 2011, 18:42,
ответ предназначен maxim-zotov
maxim-zotov (инкогнито)
20 апреля 2011, 19:08,
ответ предназначен bolk (bolknote.ru):
maxim-zotov (инкогнито)
20 апреля 2011, 19:11,
ответ предназначен maxim-zotov
HTTP/1.0Опечатка, должно быть HTTP/1.1
maxim-zotov (инкогнито)
20 апреля 2011, 19:21,
ответ предназначен maxim-zotov
На сайте bolknote.ru keepalive выключенИзвините, наврал. Включён.
SiMM (инкогнито)
20 апреля 2011, 21:31,
ответ предназначен maxim-zotov
Он тут не мимо, поскольку ваша цель уменьшить число соединений.Цель не уменьшить количество соединений, а уменьшить время загрузки - соединения тут лишь постольку поскольку их количество в браузере ограничено.
maxim-zotov (инкогнито)
20 апреля 2011, 23:33,
ответ предназначен SiMM
уменьшить время загрузкиНу да, ну да. Подмена отдачи статического файла вызовом php-скрипта это вообще изощрённое убийство сервера.
desh (инкогнито)
21 апреля 2011, 00:45,
ответ предназначен maxim-zotov
bolk (bolknote.ru)
22 апреля 2011, 08:28,
ответ предназначен maxim-zotov
Подмена отдачи статического файла вызовом php-скрипта это вообще изощрённое убийство сервера.В методике нигде не написано, что есть такая необходимость. Ссылка, которую вы используете, описана как «страничка, где можно проверить как это работает под вашим браузером», а
mr-simm (mr-simm.livejournal.com)
22 апреля 2011, 17:18
bolk (bolknote.ru)
22 апреля 2011, 21:23,
ответ предназначен mr-simm (mr-simm.livejournal.com):
id.rambler.ru/users/16051976 (id.rambler.ru/users/16051976)
23 апреля 2011, 01:06
Интересно, но в некоторых проектах Яндекса (уже не помню где копался), огромные портянки ЦСС шли прямо в коде самой странички, не подключаясь извне.Это можно видеть на странице с результататми поиска.
bolk (bolknote.ru)
23 апреля 2011, 10:24,
ответ предназначен id.rambler.ru/users/16051976:
nextstation (openid.yandex.ru/nextstation/)
25 апреля 2011, 18:44,
ответ предназначен bolk (bolknote.ru):
bolk (bolknote.ru)
25 апреля 2011, 20:20,
ответ предназначен nextstation (openid.yandex.ru/nextstation/):
Видимо SERP формируется допотопным скриптом.Мне-то хоть немного видно что в SERP происходит, я могу делать какие-то выводы, а у вас-то такое откуда? :)
Планируется смена архитектуры, а допиливать существующую никто не хочет.
Sam (инкогнито)
26 апреля 2011, 02:22,
ответ предназначен mr-simm (mr-simm.livejournal.com):
Крунгадашш (openid.yandex.ru/nextstation/)
26 апреля 2011, 16:09,
ответ предназначен bolk (bolknote.ru):
Мне-то хоть немного видно что в SERP происходит, я могу делать какие-то выводы, а у вас-то такое откуда?Возможно, Яндекс и непрозрачная компания, но не скрывает, что ее архитектура поисковой выдачи устарела.
bolk (bolknote.ru)
22 июня 2011, 17:16
Виктор (инкогнито)
Евгений, спасибо за статью!19 апреля 2011, 22:07
Вы считаете это готовым к использованию в боевых проектах?