Трохи теорії про оптимізацію швидкості завантаження сторінки

30.03.2011
Some theory about page load speed optimization
Автор:

1 - Мінімізація HTTP запитів:

У момент запуску сторінки користувачем більшість часу в ході завантаження припадає на основні її компоненти, це HTML структура сторінки, JS скрипти, SSH, зображення, флеш і т.д. Зменшення числа компонентів  мінімізує число HTTP запитів у  рази і є> ключовим фактором, що впливає на швидкість завантаження. Об'єднуйте Javascript в один CSS файл і в одну цсс-ку.  Розрахунок тут простий: 10 JS-файлів = 10 HTTP запитів, 1 JS-файл = 1 запит, до того ж більшість браузерів призупиняють завантаження  решти елементів сторінки, допоки триває завантаження і обробка кожного файлу Javascript. Використовуйте CSS-спрайти, вони допомагають знизити кількість запитів  картинок, що використовуються як фонові.

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 - Правильний порядок підключення стилів і скриптів у документ:

Першими в тезі <head> сторінки повинні йти мета-теги і <title>. Після них повинні бути розташовані таблиці стилів. Це пояснюється тим, що багато браузерів, включаючи Internet Explorer блокує рендеринг,  аби  уникнути перемальовування елементів сторінки, якщо їх стилі змінюються. Користувач буде бачити білий екран, поки  не почнуть завантажуватися  стилі

Пропишіть JS-скрипти після всіх елементів <head>. Зміст проблеми, пов’язаної із сценаріями полягає в  тому, що вони блокують паралельне завантаження. Специфікація HTTP/1.1 передбачає, що браузери завантажують не більше двох компонентів паралельно з одного хоста. Якщо сценарій завантажується, браузер не  почне жодних інших завантажень, навіть з різних хостів. Тому, якщо це можливо, винесіть якомога більше скриптів на самий низ документа.

5 - Уникайте CSS виразів та фільтрів:

CSS вирази - це потужний і небезпечний інструмент динамічної зміни CSS. Ці вирази підтримуються Internet Explorer з 5 по 7 версії. Проблема тут полягає в тому, що вони виконуються частіше, ніж можна собі уявити - і тоді, коли сторінка відображається і змінюється, і навіть тоді, коли  на сторінці відбуваються  переміщення курсору мишки. Доданий в CSS вираз  лічильник  дозволить відслідковувати, коли і як часто CSS вирази виконуються. Переміщення мишки по сторінці може легко створювати більше 10000 виконань зображень. Якщо вам потрібно використовувати CSS зображення, пам'ятайте, що вони можуть впливати на продуктивність вашої сторінки.

Проблемою з фільтром AlphaImageLoader (виправлення проблеми з напівпрозорими PNG в ІЕ версій <7) є те, що цей фільтр блокує рендеринг і "заморожує" вікно браузера, коли зображення завантажується. Це також збільшує рівень використання пам'яті і застосовується до кожного елементу, а не для зображення, таким чином ускладнюючи ситуацію ще більше. Краще всього уникати AlphaImageLoader повністю і натомість використовувати PNG8, замість того щоб втрачати продуктивність в ІЕ. Якщо вам вкрай необхідний фільтр AlphaImageLoader, використовуйте хак з підкресленням _filter, аби не мучити ваших ІЕ7-користувачів (якщо у вас є окремий CSS для всіх ІЕ) чи, в якості оптимального варіанту, можна скористатись Javascript.

6 - Використовуйте внутрішні Javascript та CSS:

Використання зовнішніх файлів збільшує швидкість завантаження сторінки, оскільки Javascript та CSS кешуються в браузері. Javascript та CSS, які вбудовані в документ HTML, завантажуються кожен раз, коли надходить запит на HTML документ. Єдиним винятком, коли влаштовані стилі можуть бути переважаючими, це домашня сторінка, коли є декілька (можливо тільки один) переглядів сторінки за сесію, тоді ви можете побачити, що встроювання Javascript та CSS призводить до більш швидкого завантаження у кінцевих користувачів.

7 - Видалення скриптів, що повторюються: 

Досить сповільнює продуктивність подвійне включення Javascript файл на одній сторінці. Ситуація не така вже й надзвичайна, як це може видатись. Yahoo! пише, що в 2 з 10 рейтингових американських сайтів було знайдено повторення одного  й того ж Javascript. B Internet Explorer, якщо зовнішній скрипт включений двічі і не кешований, це спричиняє до утворення двох HTTP-запитів у ході завантаження сторінки. Навіть якщо сценарії кешуються, додаткові запити HTTP з'являються все одно, в момент коли користувач оновлює сторінку.

8 - Пост-загрузка компонентів:

JavaScript є ідеальним кандидатом для розщеплення до та після події. Наприклад, ви маєте JavaScript код та бібліотеки для перетягування та анімації елементів. Вони можуть зачекати, тому що перетягування елементів на сторінці відбувається після початкового рендерингу. Інші кандидати на пост-завантаження вміщують прихований вміст (контент, який з'являється після дій користувача) та випадаючі зображення. Пост-завантаження добре, якщо воно використовується разом з іншими найкращими практиками веб-розробки. В цьому випадку ідея прогресивного покращення каже нам, що JavaScript, якщо підтримується, може покращити юзабіліті, проте належить спершу переконатись у тому, що сторінка працює навіть без JavaScript. Лише після такої перевірки варто заходитись збільшувати юзабіліті, скориставшись деякими сценаріями пост-завантаження, які пропонують збільшення можливостей, таких як перетягування та анімації.

9 - Попереднє завантаження:

За допомогою попереднього завантаження можна передавати цсс-стилі, картинки, скрипти, які на даній сторінці не використовуються, але знадобляться для роботи із наступними. Це зменшує швидкість завантаження на даній сторінці, але на наступних ці елементи будуть вже закешовані браузером користувача.

Насправді є декілька типів попереднього завантаження:

Безумовне передзавантаження - як тільки відбувається підзавантаження елементів, ви йдете вперед та завантажуєте додаткові компоненти. Перевірте google.com на предмет того, як завантажується спрайт зображень. Наявність цього спрайту зображень на  головній сторінці  google.com не є обов’язкова, проте він необхідний на наступних сторінках результату пошуку.

- Умовні передзавантаження - на основі аналізу дій користувача робляться обгрунтовані припущення, про його майбутні дії та -  відповідно  - виконується передзавантаження.

- Очікувані передзавантаження - передзавантаження випереджає процес реорганізації. Часто трапляється так що після доробки можна почути: "новий сайт чудовий, але повільніший, ніж раніше". Частково, проблема може бути в тому, що користувачі мали можливість відвідати ваш старий сайт з повним кешем, але нові елементи, зазвичай, у кеші відсутні. Цей побічний ефект можна зменшити попереднього завантаживши деякі компоненти,  ще до того, як ви розпочали редизайн. Ваш старий сайт може використовувати час, протягом якого браузер знаходиться в режимі очікування та підзавантажувати стилі, картинки, сценарії, які будуть використовуватись на новому сайті.

10 - Скоротіть кількість елементів DOM:

Наявність чималої  кількості елементів DOM може свідчити про те що є щось, що повинно бути покращене на сторінці без необхідності видалення вмісту. Чи використовуєте ви вкладені таблиці для розмітки? Ви робили більше <div> лише для видалення питань по макету? Можливо є кращий та більш семантично правильний спосіб зробити розмітку? Наприклад, використання <div> лише за умови що він має сенс сематично, а не просто тому, що він робить новий рядок.

Кількість елементів DOM легко перевірити - просто введіть в консолі Chrome Devtools:

document.getElementsByTagName ('*'). lenght

А скільки DOM елементів занадто багато? Перевірте інші подібні сторінки, які мають хорошу розмітку.

11 - Мінімізуйте кількість iframe:

Iframes дозволяють включити HTML документ в основний документ. Важливо зрозуміти, як працюють фрейми, і використовувати їх належним чином.

Плюси <iframe>:

  • Допомагає у випадку повільних сторонніх додатків, це можуть бути наприклад банери
  • Безпека
  • Скачування сценаріїв паралельно 

Мінуси <iframe>:

  • Багато вартує, навіть якщо пустий 
  • Блокує завантаження сторінки
  • Не семантично

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. Якщо вам потрібно <img width="100" height="100" src="yolka.png" alt="Yolka" />,  ваше зображення повинне бути розміром 100x100px, а не 500x500px зжате до 100x100 атрибутами width & height.

Стаття написана за матеріалами Best Practices for Speeding Up Your Web Site.

Голосів: 1 Рейтинг: 5

Також по темі

1

SSH - мережевий протокол рівня сеансів, з його допомогою виконується віддалене управління операційною системою і тунелювання ТСР-з'єднань (наприклад, для передачі файлів).

...

2

Якщо ви знаєте що таке jQuery чи починаєте його вивчати, то напевне вас зацікавить знання про те, як написати свій jQuery плагін. Зробити це досить просто. Прочитавши цю статтю ви зможете...

3

В Drupal по замовчуванню поставлена перевірка пароля користувача при реєстрації. Для її усунення потрібно виконати наступне:

4
Дуже часто буває потрібно зробити сортування нод по якомусь критерію. Для цього часто використовують Views, Nodequeue, Flag та інші схожі модулі. Але часто буває так, що функціоналу цих модулів...
5
Pressflow - дистрибутив Drupal, який забезпечує покращену продуктивність і маштабування. Він розроблений хлопцями з Four Kitchens

Subscribe to our blog updates