Welcome! Log In Create A New Profile

Advanced

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

February 10, 2012 05:49PM
Уважаемые товарищи инженеры,

Я написал на данную тему в англо-язычную ветку "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 файлам.

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

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

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

locojohn February 10, 2012 05:49PM

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

Gena Makhomed February 11, 2012 06:04AM

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

locojohn February 11, 2012 06:44AM

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

Gena Makhomed February 11, 2012 07:00AM

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

Илья Шипицин February 13, 2012 03:20AM

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

locojohn February 13, 2012 07:12AM

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

Xasima February 13, 2012 09:06AM

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

Andrey Repin February 13, 2012 02:20PM

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

locojohn February 13, 2012 02:52PM

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

Andrey Repin February 13, 2012 07:50PM

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

Xasima February 14, 2012 03:44AM

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

Andrey N. Oktyabrski February 14, 2012 04:06AM

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

locojohn February 14, 2012 07:59AM

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

Илья Шипицин February 16, 2012 11:28PM

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

Илья Шипицин February 13, 2012 03:24AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 255
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready