Немного теории про оптимизацию скорости загрузки страницы
1 - Минимизация HTTP-запросов:
Большинство времени при загрузке страницы у пользователя занимает загрузка всех компонетов страницы: HTML структура страницы, JS скрипты, CSS, изображения, флеш и т.д. Снижение числа компонентов в разы снижает число HTTP запросов. Это ключевой фактор к быстрой загрузке страницы. Объединяйте Javascript в один и CSS файлы в одну цсс-ку. Например, 10 JS-файлов = 10 HTTP запросов, 1 JS-файл = 1 запрос, притом большинство браузеров остановит загрузку остальных елементов страницы, пока каждый файл JavaScript загружается и обрабатывается. Используйте СSS-спрайты, их использование поможет снизить количество запросов картинок, которые используются фоном.
2 - Использование компрессии:
Наиболее популярным методом компресии есть Gzip. Применять компрессию можно к HTML, CSS, JS, но изображения и PDF-файлы лучше не сжимать Gzip, поскольку они уже сжаты. Попытка сжать их с помощью Gzip потенциально только может увеличить размеры файла. В Drupal используются модули CSS Gzip и Javascript Aggregator.
3 - Минимизация JavaScript и CSS:
Минимизацией является практика удаления ненужных символов из кода, чтобы уменьшить его размер таким образом улучшая время загрузки. В коде уменьшенной версии файла все комментарии будут удалены, а также ненужные пробельные символы (пробел, новая строка, и табуляции). В случае JavaScript, это повышает производительность и время отклика, поскольку размер загружаемого файла уменьшается. Двумя самыми популярными инструментами для минимизации кода JavaScript являются JSMin и YUI Compressor. Компрессор YUI может также уменшать CSS. В Drupal можно использовать модуль Javascript Aggregator. В Drupal 7 минимизация цсс включается автоматически, при включении компрессии css.
4 - Правильный порядок подключения стилей и скриптов в документ:
Первыми в теге
страницы дожны идти метатеги иПропишите JS скрипты после всех елементов
. Проблема, вызванная сценариями является такой, что они блокируют параллельную загрузку. Спецификации HTTP/1.1 предполагает, что браузеры скачивают не более двух компонентов параллельно из одного хоста. Если сценарий загружается, браузер не будет начинать любые другие загрузки, даже из разных хостов. По этому, если это возможно, вынесите все возможные скрипты в самый низ документа.5 - Избегайте CSS Выражений и фильтров:
CSS выражения - мощный и опасный инструмент динамичного изменения CSS. Они поддержываются Internet Explorer с 5 по 7 версии. Проблема с выражения в том, что они выполняются более часто, чем большинство людей думают. Мало того, что они выполняются, когда страница отображается и изменяется, но и когда страница прокручивается и даже тогда, когда пользователь перемещает курсор мыши на странице. Добавление счетчика в CSS выражение позволяет отслеживать, когда и как часто CSS выражения выполняются. Перемещение мыши по странице может легко создавать более 10000 выполнений выражения. Если вам нужно использовать CSS выражения, помните, что они могут влиять на производительность вашей страницы.
Проблемой с фильтром AlphaImageLoader (исправление проблемы с полупрозрачным PNG в IE версий <7) является то, что он блокирует рендеринг и "заморажывает" окно браузера, когда изображение загружается. Это также увеличивает потребление памяти и применяется для каждого элемента, а не на изображение, так что проблема умножается. Лучше всего избегать AlphaImageLoader полностью и использовать PNG8, вместо потери производительности в IE. Если вам абсолютно необходим фильтр AlphaImageLoader, используйте хак с подчеркиванием _filter, чтобы не наказывать вашых IE7+ пользователей (если у вас есть оддельный CSS файл для всех IE) или, найлучшый вариант, вы можете использовать JavaScript.
6 - Используйте внешние JavaScript и CSS:
Использование внешних файлов усокоряет скорость загрузки страницы, поскольку JavaScript и CSS файлы кэшируются в браузере. JavaScript и CSS, которые встроены в документах HTML получить скачиваются каждый раз, когда запрашивается документ HTML. Единственное исключение, где встронные стили могут быть предпочтительным, это домашняя страница, когда есть несколько (возможно, только один) просмотров страницы за сессию, тогда Вы можете обнаружить, что встраивание JavaScript и CSS приводит к более быстрой загрузке у конечных пользователей.
7 - Удаление повторяющихся скриптов:
Очень плохо для производительности это включить JavaScript файл дважды на одной странице. Это не так необычно, как Вы могли бы подумать. Yahoo! пишет что в 2 из 10 топ американсих сайтах было найдено повторение одного Javascript. В Internet Explorer, если внешний скрипт включен два раза и не кэшируем, это порождает два HTTP-запроса в течении загрузки страницы. Даже если сценарии кэшируемые, дополнительные запросы HTTP появляются, когда пользователь перезагружает страницу.
8 - Пост-загрузка компонентов:
JavaScript является идеальным кандидатом для расщепления до и после события. Например, если у вас есть JavaScript код и библиотеки, для перетягивания и анимации, они могут подождать, потому что перетаскивания элементов на странице проходит после начального рендеринга. Другие кандидаты на пост-загрузку включают скрытое содержание (контент, который появляется после действий пользователя) и выпадающие изображения. Пост-загрузка хороша, когда она используется вместе с другими наилучшими практиками веб-разработки. В этом случае, идея прогрессивного улучшения говорит нам, что JavaScript, если поддерживается, может улучшить юзабилити, но вы должны убедиться, что страница работает даже без JavaScript. Так, после того как вы убедились, что страница работает нормально, вы можете увеличить юзабилити с некоторыми пост-загруженными сценариями, которые дают вам больше излишеств, таких как перетягивание и анимации.
9 - Предварительная загрузка:
С помощью предварительной загрузки Вы можете передать цсс стили, картинки или скрипты, которые на данной странице не используются, но которые понадобятся ему на следующих. Это уменьшает скорость загрузки на данной странице, но на следуюющих, эти элементы будут уже закешированны браузером пользователя.
Есть действительно несколько типов предварительной загрузки:
- Безусловная предзагрузка - как только происходит подгрузка елементов, вы идете вперед и загружаете некоторые дополнительные компоненты. Проверьте google.com для примера того, как загружается спрайт изображений. Этот спрайт изображений не требуется на google.com главной странице, но он необходим на последовательных страницах результатов поиска.
- Условные преднагрузки - на основе действий пользователя вы делаете обоснованное предположение, куда пользователь попадет далее и делаете предзагрузки соответственно.
- Ожидаемые предзагрузки - подгузка идет заранее до начала реорганизации. Часто бывает, после доработки, что вы слышите: "новый сайт это здорово, но это медленнее, чем раньше". Частью проблемы может быть то, что пользователи имели возможность посетить ваш старый сайт с полным кэш, но новых елементов всегда нет в кэше. Вы можете уменьшить этот побочный эффект путем предварительной загрузки некоторых компонентов, прежде чем вы даже начали редизайн. Ваш старый сайт может использовать время, пока браузер находится в режиме ожидания и подгружать стили, картинки и сценарии, которые будут использоваться на новом сайте.
10 - Сократите количество элементов DOM:
Большое количество элементов DOM может быть признаком того, что есть нечто, что должно быть улучшено с разметки страницы без необходимости удаления содержимого. Используете ли вы вложенные таблицы для разметки? Вы делали больше
Число элементов DOM легко проверить, просто введите в консоли Chrome Devtools:
document.getElementsByTagName ('*'). lenght
А сколько DOM элементов слишком много? Проверьте другие подобные страницы, которые имеют хорошую разметку.
11 Минимизируйте количество iframe:
Iframes позволяют документ HTML включить в основной документ. Важно понять, как фреймы работают, таким образом эффективно использовать их.
Плюсы
- Помогает при медленных сторонних приложениях: напр. баннеры
- Безопасность
- Скачивание сценариев параллельно
Минусы
- Дорогостоящие даже если пустой
- Блокирует загрузку страницы
- Не семантически
12 Оптимизация изображений:
Используйте GIF-файлы для очень маленькой или простой графики (например, менее чем 10x10 пикселей, или цветовой палитры менее 3-х цветов) и для изображений, которые содержат анимацию. Попробуйте преобразование GIF-файлы в PNG-и посмотрите, если есть сбережения. Чаще всего, есть. Разработчики часто не решаются использовать PNG-изображения из-за ограниченной поддержки в браузерах, но это уже дело прошлого. Единственной реальной проблемой является альфа-прозрачность PNG-изображений в истинном цвете, но с другой стороны, GIF тоже не истинный цвет и не поддерживает переменную прозрачность вообще. Так что все что можно сделать на GIF, PNG (PNG8) могут сделать тоже (за исключением анимации).
Используйте файлы JPG для всех изображений фотографического стиля.
Не используйте BMP или TIFF.
Используйте инструмент оптимизатора PNG на все ваши PNG-файлы и JPEG оптимизатор (например smush.it)
Вы должны видеть выгоду для любого файла, который может быть сокращен на 25 байт или больше (если меньше, это не приведет к заметному приросту производительности).
Организируйте изображения в спрайт горизонтально, в отличие от вертикального спрайта он обычно получается меньшый размер файла.
Сочетание цветов в аналогичных спрайт поможет вам сохранить количество цветов на низком уровне, идеально ниже 256 цветов так, чтобы вписаться в PNG8.
Не оставляйте большие пробелы между изображениями в спрайте. Это не сильно влияет на размер файла, но требует меньше памяти для браузера пользователя для распаковки изображения в пиксель карту. 100x100 изображения составляет 10 тыс. пикселей, а 1000x1000 составляет 1 млн. пикселей.
Не используйте большее изображение, чем нужно, то есть не переопределяйте размеры картинки с помощью HTML. Если вам нужно , Ваше изображение должно быть размерами 100x100px, а не 500x500px сжатое до 100x100 аттрибутами width & height.
Статья написана по материалам Best Practices for Speeding Up Your Web Site и Web Performance Best Practices.