модуль чтобы динамически отдавать несколько java-script/css файлов в одном bundle

locojohn nginx-forum на nginx.us
Пт Фев 10 22:49:16 UTC 2012


Уважаемые товарищи инженеры,

Я написал на данную тему в
англо-язычную ветку "Ideas and Feature requests" 4
дня назад, но покамест не получил там
ответа.  Не судите строго за то, что не
поленился написать сюда на русском.

Существует простой и неплохой модуль,
написанный неким Joshua Zhu как часть его
проекта под названием "tengine".  Модуль
называется "http-concat" и полностью
совместим с nginx 1.1.14 (проверено).  Он
позволяет соединять несколько файлов в
один и выдавать соединенный файл
клиенту, что позволяет сократить время
запроса, так как нет традиционного
обращения к каждому файлу по
отдельности. Мы используем этот модуль
для соединения в "бандлы" Javascript и CSS
файлов. Исходники http-concat доступны для
скачивания здесь:
https://github.com/perusio/nginx-http-concat 

Если коротко, то этот модуль парсит
запрос типа:
"/jquery/??jquery.asmselect.css,ui.imageuploader.css,jquery.linkselect.css",
после чего соединяет все файлы после "??"
в один "бандл" и отправляет клиенту. Он
также использует внутренний кэш и
прочее, что делает его быстрым и
удобным для использования.

Но я бы сюда не обращался если бы не
было некоторых моментов :

В данный момент http-concat не может брать
файлы из локейшнов, где используются
директивы "alias" или "root". Пример:

location /jquery/ {
try_files $uri $uri/ @common;
}

location @common {
# handle common requests for all sites: /jquery/...., etc. if local
version of the requested file is not available
root /opt/www/_common;
}

...

Если попытаемся "склеить" файлы из location
/jquery, запрос кончится 404 ошибкой.  Это
происходит потому, что http-concat не может
получить путь к файлам, находящимся в
локейшне, где действуют директивы
root/alias.  Я был бы очень признателен, если
бы кто-то мог бы взглянуть на исходный
код модуля http-concat (URL:
https://github.com/perusio/nginx-http-concat/blob/master/ngx_http_concat_module.c)
и дать мне какие-нибудь наводящие
указания в какую сторону копать или
патч, чтобы правильно определить пути
таким локейншнам.  Я связался с автором,
но он сообщил, что не знает как выяснить
путь к файлам в локейшнах где
определены директивы alias или root.

Вторая проблема связана с тем, что
некоторые CSS файлы могут содержать в
себе аттрибуты "url", чтобы ссылаться на
внешние файлы, например изображения.  К
сожалению, если пути к этим внешним
файлам относительные, то сервер
считает, что они относительны текущей
страницы, то есть страницы, откуда
вызывается конкатенация CSS файлов при
помощи http-concat.  Например: файл
"/jquery/jquery-ui-1.8.17.custom.css" из стандартной
библиотеки "jquery" содержит 8 линков на
внешние файлы в каталоге images/...., пути к
которым должны определятся как
/jquery/images/...., если вызывать этот CSS файл
напрямую.  Но если мы хотим
задействовать http-concat в другом каталоге
сайта, но при этом использовать данный
CSS файл из библиотеки jquery, то линки на
изображения больше не работают, так как
они становятся относительными того
файла, откуда вызывается
/jquery/jquery-ui-1.8.17.custom.css.  

Перед тем как мы нашли модуль http-concat, мы
использовали PHP чтобы связывать CSS и
Javascript файлы в один файл, и наш скрипт
умел находить линки на изображения с
атрибутом "url" и в общем файле, который
выдавал клиенту, подставлял вместо
относительных абсолютные и правильные
пути в таких линках, так как известен
путь к самому файлу, в котором эти линки
присутствуют.  Это делалось при помощи
preg_replace():

$uri_path = dirname($css_file['uri']);
// example: url(relative/path/to/file) becomes:
url(/absolute/and/not/relative/path/to/file) within a CSS file
$buf =
preg_replace('/(:?\s*url\s*\()[\'"\s]*([^\/\'"].*)[\'"\s]*\)/isU', '$1'
. ($uri_path == '/' ? '/' : $uri_path . '/') . '$2)', $buf);

Возможно ли как-то использовать PCRE
библиотеку чтобы сделать подобную
автоматическую замену линков в
аттрибутах "url" в CSS файлах на абсолютные
пути на языке C?  Ведь nginx и так уже
использует PCRE в полный рост, так может
быть это не такая уж трудоёмкая задача? 


К сожалению, у меня очень мало опыта
программирования на языке C, поэтому и
вынужден обратиться к экспертам.  Любые
патчи или предложения по устранению
изложенных проблем приветствуются.  Я
также уверен, что этот модуль может
быть многим полезен в силу возможности
уменьшить количество запросов к
javascript/css файлам. 

Буду очень признателен за любую
помощь.

Спасибо,
Андрей

Posted at Nginx Forum: http://forum.nginx.org/read.php?21,222269,222269#msg-222269



Подробная информация о списке рассылки nginx-ru