Более года назад я писал о времени загрузки страниц и Jawr . С тех пор либо мои проекты были приложениями для внутренней сети, где время загрузки не было проблемой, либо мы не имели права голоса в используемых инструментах. Поэтому у меня не было возможности использовать какие-либо инструменты, которые я нашел тогда. Теперь я скоро столкнусь с приложением, которое будет использоваться людьми вне нашей сети, и я определенно хочу, чтобы приложение было максимально отзывчивым. Вооружившись моими предыдущими лучшими практиками Yahoo , я искал в Интернете инструменты, которые могли бы помочь в их применении.
Я высоко ценю одно правило: минимизировать количество HTTP-запросов . Я думаю, что это правило имеет наибольшее влияние, поскольку браузеры отправляют не более 2 HTTP-запросов одновременно. Давайте возьмем классический пример. Кнопки играют большую роль во многих приложениях, и большую часть времени вы помещаете на них значок, чтобы привязать их к действию в уме пользователя. Это просто сделано так:
<button><img src="path/to/my/image" />Label</button>
Это означает, что любой экран, отображающий более одного типа кнопок, может быть медленным. Один из способов значительно уменьшить количество запросов — объединить все изображения в одно и использовать фоновые изображения CSS. Последний доступен начиная с первой версии CSS, просто укажите атрибут background-image, чтобы отобразить изображение позади элемента. Это использование называется CSS Sprites . Код теперь выглядит так:
<button class="update">Label</button>
button.update {
background-image: url('path/to/my/image');
background-repeat: no-repeat;
}
Проницательный читатель заметит, что предыдущий код имеет тот же эффект, что и <img> в <button>. Реальное использование состоит в том, чтобы использовать только ту часть главного изображения, которую мы хотим, что-то похожее на это:
button.update {
background: transparent url('path/to/my/aggregate') -50px -50px no-repeat;
}
Для агрегирования основного изображения необходим правильный инструмент изображения. Вычислить часть, которую мы хотим для каждой кнопки — это боль в заднице (говорить вежливо).
К счастью, мой старый друг Джавр имеет право помочь мне. Начиная с версии 3.2, он включает в себя SmartSprites , продукт, который просто выполняет всю агрегацию и вычисления для меня. Как это работает? Просто добавив несколько комментариев в ваш CSS:
- объявить, как будут построены главные (ие) изображения (и)
- сказать, какой спрайт будет участвовать в каком мастер-образе
/** sprite: master-sprite-gif; sprite-image: url('../img/master-sprite.gif'); sprite-layout: vertical */
button.one {
background-image: url('../img/certificate_preferences.gif'); /** sprite-ref: master-sprite-gif; */
}
button.two {
background-image: url('../img/inbox_into.gif'); /** sprite-ref: master-sprite-gif; */
}
button.three {
background-image: url('../img/mail_forward.gif'); /** sprite-ref: master-sprite-gif; */
}
Предыдущий CSS является примером, с помощью которого все три GIF-файла будут найдены во время выполнения в ../img/master-sprite.gif. Если вы посмотрите на сгенерированный CSS, он будет выглядеть следующим образом:
button.one{background-image:url('../cb3648025844/img/master-sprite.gif');background-position:left -0px;}
button.two{background-image:url('../cb3648025844/img/master-sprite.gif');background-position:left -48px;}
button.three{background-image:url('../cb3648025844/img/master-sprite.gif');background-position:left -96px;}
Конечно, реальный сгенерированный CSS будет конкатенирован и минимизирован (см. Ниже).
Примечание: я не эксперт по GIF, но подозреваю, что оригинальные GIF должны иметь похожие таблицы цветов, в противном случае агрегированный GIF будет выглядеть очень странно.
Тем не менее, Jawr также предоставляет некоторые очень интересные функции, как старые, так и новые:
- минимизация, как для CSS, так и для JavaScript. Вы также можете выбрать минимизирующий движок (встроенный, JSMin или YUI Compressor ). Последний даже может запутать ваш источник, тем самым даже делая ваш JS еще легче в процессе
- включение лицензии, так что даже минимизированные источники могут отображать свою лицензию
- сжатие GZip во время выполнения, если браузер клиента его поддерживает
- HTTP-заголовок управления, так что запросы на одни и те же ресурсы (кроме первого) будут отвечать HTTP 304 — не модифицированный код, что позволяет избежать ненужного сетевого трафика
- управление i18n для использования стандартных файлов свойств Java для интернационализированных сообщений в вашем JavaScript
- JavaScript для использования Jawr без taglibs на простых HTML-страницах (хотя это не рекомендуется, поскольку добавляет скрипт на страницу, таким образом, другой HTTP-запрос)
- возможность расширения, с новыми пре- и постпроцессорами
- возможность переключения между режимом разработки (без изменений для ресурсов) и производством (виртуальные ресурсы, обслуживаемые Jawr)
- предварительная обработка пакета, так что обработка выполняется не при запуске, а во время сборки: это можно сделать, вызвав задачу Ant или настроив плагин Maven
- для действительно занятых администраторов серверов приложений, поддержка JMX
В течение прошлого года, кажется, Jawr получил несколько хороших улучшений. Я не знаю, сколько людей действительно используют его, но я думаю, что он заслуживает некоторого интереса, когда вам нужно оптимизировать производительность на фронте времени загрузки страницы.
Вы можете скачать исходники этой статьи в формате Eclipse / Maven здесь .