Лёгкий сайт или как посадить браузер на диету

Содержание

Лёгкий сайт или как посадить браузер на диету

А что если объединить профессионалов, работавших над крупными web проектами, чтобы создать исчерпывающее руководство по оптимизации front-end разработки?
И получить в результате не скучную инструкцию, а что то поинтереснее? А если позвать Briza Bueno (Americanas.com), Davidson Fellipe (Globo.com), Giovanni Keppelen (ex-Peixe Urbano), Jaydson Gomes (Terra), Marcel Duran (Twitter), Mike Taylor (Opera), Renato Mangini (Google), и Sérgio Lopes (Caelum) чтобы собрать лучшие практики?

Именно это мы и сделали! Мы научим вас создавать быстрые сайты.

— Zeno Rocha, руководитель проекта.

Неужели важно то, насколько быстро загружается сайт?
Несомненно! И не надо говорить, что это не так. Так почему же до сих пор появляются медленные сайты, оставляющие неприятный осадок на душе пользователя, который на них побывал? Соблюдая правила, описанные тут, можно заставить сайт загружаться быстрее. Не будем останавливаться на влиянии скорости загрузки у WEB гигантов, перейдем сразу к делу!

Читать статью  Программы и сервисы для продвижения сайта

HTML

25. Избегайте использование inline и вложенного кода
  1. Inline: Код пишется непосредственно в теге элемента. Для CSS в атрибуте style, а для JavaScript в атрибуте onclick.
  2. Вложенный: CSS и JavaScript код пишутся в блоках и соответственно.
    Внешний: Используя тег для CSS файла , или же с указанием атрибута src для JavaScript.

    Первые два варианта, несмотря на то, что уменьшают количество HTTP запросов, увеличивают объем самого HTML файла. Если объемы включаемых скриптов и файла не большие, первые два варианта могут оказаться быстрее третьего. Чтобы проверить так ли это, можно провести тесты. Так же, нужно учитывать назначение странички. Если вы уверены, что пользователь зайдет только единожды, то первые два варианта окажутся предпочтительнее, т.к. сократят количество HTTP запросов.

Старайтесь не включать CSS/JS в середине HTML файла. (Используйте инструменты для автоматизации этого процесса)

Третий вариант предпочтительнее для большинства случаев. При внешнем подключении не только улучшается структура сайта, но так же позволяет браузерам кэшировать эти файлы. Особенно это важно, если файлы тяжелые и их много.

24. Стили сверху, скрипты снизу

Если объявить стили в блоке

, то страница будет оформляться по мере загрузки стилей и пользователю будет казаться что всё грузится быстро. 
Сажаем браузер на диету

Но если объявить их в конце страницы, то она останется в неглиже, пока стили не загрузятся.
С другой стороны, лучше подключать JavaScript в конце, т.к. время загрузки скриптов можно потратить с пользой на оформление страницы.

  

Lorem ipsum dolor sit amet.

23. Сжимайте HTML код

Конечно же, для поддержки кода, лучше оставлять комментарии и расставлять отступы в нем.

 

Lorem ipsum dolor sit amet.

Но браузеру они совершенно не нужны. Поэтому лучше cжать HTML код.

 

Lorem ipsum dolor sit amet.

Это сократит размер страницы, а пользователи насладятся быстрой загрузкой сайта.
Несколько примеров работы HTML Compressor с настройками по умолчанию:

Название сайта Исходный размер В сжатом виде Процент сжатия
BBC 77,054b 55,324b 28.2%
CNet 86,492b 61,896b 28.4%
FOX News 75,266b 64,221b 14.7%
GameTrailers 112,199b 92,851b 17.2%
Kotaku 134,938b 116,280b 13.8%
National Post 75,006b 55,628b 25.8%
SlashDot 158,137b 142,346b 10.0%
StackOverflow 116,032b 100,478b 13.4%

Полезные инструменты и ссылки

22. Включайте асинхронно

Чтобы понять, как этот атрибут ускоряет загрузку, легче посмотреть, что происходит, если его не использовать.

В этом случае, браузер будет ждать полной загрузки скрипта, прежде чем начнет обрабатывать последующий HTML код. Это может серьезно увеличить время загрузки сайта. Но иногда такое поведение браузера оправдано.

Здесь же, скрипт будет скачиваться асинхронно, не мешая обработке HTML разметки страницы. Скрипт запустится как только полностью скачается. Главное помнить, что если асинхронных скриптов несколько, то они запустятся не обязательно в том же порядке что были объявлены.

21. Сжимайте стили

Как и в случае с HTML кодом, браузер не оценит ваши комментарии и отступы в стилях:

.center < width: 960px; margin: 0 auto; >/* --- Структура --- */ .intro

Поэтому сжимайте их с помощью инструментов, для этого предназначенных.

.center.intro

Если вы использует динамические языки стилей Sass, Less, Stylus и т.п., их можно настроить так, чтобы на выходе получать уже сжатые файлы.

20. Объединяйте CSS файлы

Для поддержки и разработки сайта удобно, чтобы стили хранились в разных файлах:

Но это отдельные HTTP запросы на загрузку каждого файла (так же у браузеров есть ограничение на количество параллельных загрузок).

Если объединить CSS файлы, они загрузятся быстрее.
Этот процесс можно автоматизировать при помощи различный инструментов.

19. Используйте link вместо @import

Подключить внешние стили можно двумя способами. Либо с помощью тега link :

Либо используя директиву @import (внутри внешних стилей или вложенных тегах

): 
@import url('style.css');

Если использовать второй способ внутри внешних стилей, браузер не может параллельно загружать этот файл, что может помешать загрузке остальных вложений.

JavaScript

18. Загружайте сторонний контент асинхронно

Вряд ли найдутся те, кто не использовал у себя на страницах Youtube видео или кнопки like/tweet.

Проблема в том, что мы не знаем как будут загружаться эти данные и загрузятся ли они вообще. Причины этому могут быть разные: интернет пользователя, сервер с которого эти данные поступают или же не дружелюбно настроенный корпоративный firewall.

Чтобы не допустить блокировки загрузки сайта из за проблем с внешними ресурсами, загружайте их асинхронно (или используйте Friendly iFrame)

var script = document.createElement('script'), scripts = document.getElementsByTagName('script')[0]; script.async = true; script.src = url; scripts.parentNode.insertBefore(script, scripts); 

Как вариант, вы можете асинхронно загружать сторонние виджеты с помощью этого скрипта.

17. Храните размер массива

Циклы играют важную роль в производительности JavaScript. Старайтесь оптимизировать каждую итерацию.

Например, можно запоминать размер обходимого массива, чтобы не вычислять его при каждой итерации.

var arr = new Array(1000), len, i; for (i = 0; i < arr.length; i++) < // Плохой цикл, будет считать размер массива 1000 раз >for (i = 0, len = arr.length; i < len; i++) < // Так лучше, размер массива посчитается только один раз >

Примечание: Большинство браузеров проделывают эти махинации сами.

Особенно это важно при обходе массивов данных DOM, таких как Node(NodeList), возвращаемых, например, функцией document.getElementsByTagName(‘a’) . Они собираются «на лету», т.к. при изменениях в разметке они так же меняются.

var links = document.getElementsByTagName('a'), len, i; for (i = 0; i < links.length; i++) < // При каждой итерации список ссылок будет пересчитываться, что есть плохо >for (i = 0, len = links.length; i < len; i++) < // Список ссылок считается единожды >// А это ужасный бесконечный цикл for (i = 0; i < links.length; i++) < document.body.appendChild(document.createElement('a')); // Каждую итерацию добавляется еще одна ссылка, при этом условие останова никогда не будет выполнено // Если сохранять длину массива в переменной, этого не произойдет. >
16. Избегайте использование document.write

При вызове document.write страница не будет полностью загружена, пока функция не завершит своё выполнение.

Использование этой функции искоренялось годами, но до сих пор есть некоторые случаи, когда приходится её применять, например, при синхронном подключении JavaScript файлов.

HTML5 Boilerplate, например, подключает с помощью этой функции локальный jQuery если Google не отвечает на запрос.

   

Важно: Если вызвать document.write во время или после события window.onload , она заменит всё содержимое страницы.

 foo  

В результате на странице будет только bar, а не foobar. Тоже самое произойдет, если сделать это после window.onload
Такое же поведение будет, если вызвать функцию ДО, но с задержкой во времени.

 foo  
15. Избегайте излишнего перерисовывания элементов

Каждый раз, когда изменяются определенные свойства элемента DOM, запускается процесс перерисовывания.

Это может быть изменение только внешнего вида элемента. Nicole Sullivan приводит в пример редактирование стиля элемента параметром background-color .

Но более медлительно происходят изменения в разметке, например, если редактировать ширину элемента.

Без сомнений, излишнее использование таких вмешательств не допустимо. Поэтому, вместо этого:

var div = document.getElementById("to-measure"), lis = document.getElementsByTagName('li'), i, len; for (i = 0, len = lis.length; i

Делайте так:

var div = document.getElementById("to-measure"), lis = document.getElementsByTagName('li'), widthToSet = div.offsetWidth, i, len; for (i = 0, len = lis.length; i

При изменении style.width , браузер лезет в разметку страницы. Обычно, изменения в стилях многих элементов происходит при одном перерисовывании, т.к. браузер делает это один раз при обновлении вида страницы. Но, в первом примере, в цикле идёт обращение к свойству offsetWidth , которая является частью внешнего вида, поэтому браузеру приходится каждый раз пересматривать разметку страницы.

Сохраняйте все необходимые данные о разметке страницы до того, как собираетесь менять её, как во втором примере.

14. Избегайте излишних манипуляций с DOM

При каждом не обоснованном обращении к DOM, погибает панда.

Серьезно, браузеру дорого обходится эта операция. Несмотря на то, что движки JavaScript становятся всё быстрее, предпочтительно оптимизировать обращения к дереву DOM.

Одно из простых правил: если к элементу надо обратиться несколько раз, то старайтесь это сделать одним обращением к DOM. Например, используя переменные:

// Очень и очень плохо! for (var i = 0; i < 100; i++) < document.getElementById("myList").innerHTML + + i + ""; > // А так гораздо лучше :) var myList = ""; for (var i = 0; i < 100; i++) < myList + + i + ""; > document.getElementById("myList").innerHTML = myList; 
13. Сжимайте скрипты

Так же как и в случае с CSS и HTML, браузеру совершенно безразличны комментарии и пробелы в скриптах.
Вместо этого:

BrowserDiet.app = function() < var foo = true; return < bar: function() < // тут что то происходит. >>; >; 

Браузеру легче обработать это:

BrowserDiet.app=function()>> 
12. Объединяйте несколько js файлов в один

Так же, как и в случае с CSS, чтобы сократить HTTP запросы, объединяйте файлы скриптов в один.

А если делать так, загрузка ускорится:

Хотите быть царём DOMа? Автоматизируйте и этот процесс.

jQuery

11. Всегда используйте последнюю версию jQuery

Команда jQuery непрерывно работает над развитием своей библиотеки, чтобы вносить разного рода улучшения.

Для локального подключения jQuery, можно взять последнюю версию библиотеки отсюда:

 http://code.jquery.com/jquery-latest.js 

Но не подключайте этот файл напрямую через тэг

. На вашем сайте могут возникнуть проблемы с обратной совместимостью, т.к. вы не успеете внести изменения для работы с новой версией библиотеки. Подключайте версию библиотеки, которая у вас поддерживается. 

Как говорил легендарный Барни Стинсон: "Новое всегда лучше" 😛

10. Селекторы

Как правило, при работе с jQuery, всегда возникают вопросы при выборе того или иного селектора. Их в библиотеке достаточно много. И не все они работают одинаково быстро. Например, можно выбрать элемент по классу, ID или же использовав такие методы как find() или children() .

Среди всех селекторов, выбор элемента по ID работает быстрее всего, т.к. использует нативные методы DOM:

9. Используйте for вместо each

Почти всегда функции самого JavaScript работают быстрее, чем аналогичные в библиотеке jQuery. Поэтому вместо перебора с помощью jQuery.each оптимальнее использовать циклы JavaScript.

Но важно отметить, что это так не всегда. Во многих случаях for in уступает по скорости jQuery.each .

И как уже говорилось, запоминайте размер массива, чтобы совершить обход быстрее.

for ( var i = 0, len = a.length; i

Многие считают, что использование циклов for и while с обратными счетчиками работают быстрее традиционных. Эта тема горячо обсуждается сообществом. Но такие циклы не используют ввиду того, что код становится менее понятным.

8. И не используйте jQuery.

. пока в этом нет необходимости 🙂

Иногда обычный JavaScript выглядит проще jQuery.

Зачем использовать метод attr() чтобы узнать ID элемента?

$('a').on('click', function() < console.log( $(this).attr('id') ); >); 

Когда его можно достать средствами самого языка:

$('a').on('click', function() < console.log( this.id ); >); 

И это работает намного быстрее.

Изображения

7. Используйте CSS спрайты

Техника применения спрайтов позволяет группировать изображения в один файл.

А затем указывать картинку с помощью позиции в CSS.

.icon-foo < background-image: url('mySprite.png'); background-position: -10px -10px; >.icon-bar

Таким образом, вы сократите количество HTTP запросов к серверу и задержек загрузки остальных ресурсов.

Между изображениями в спрайте, оставляйте минимум свободного места. Это не сильно отразится на размере файла, но сократит потребление памяти.

Даже не смотря на то, что все знают о спрайтах, эта техника не используется повсеместно. Разработчики зачастую забывают автоматизировать процесс создания спрайтов. В ссылках ниже, есть несколько таких инструментов.

6. Data URI

Эта техника - альтернатива CSS спрайтам.

Data-URI это способ включения данных, как кода картинки в строку, нежели как ссылку на него. В этом примере показано как использовать Data-URI для указания фонового изображения одного из элементов.
До:

.icon-foo
.icon-foo < background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII%3D'); >

Все браузеры начиная с IE8 поддерживают технологию кодирования base64.

Для обоих методов, нужны дополнительные инструменты для поддержки кода. Но у метода Data-URI преимущество в том, что каждый файл по сути хранится отдельно, что облегчает разработку. Тем не менее, из за того что код картинки включается непосредственно в CSS, размер файла увеличивается. Такой подход не стоит использовать без gzip сжатия ответов сервера, т.к. выигрыш в количестве HTTP запросов может увеличить время загрузки самого файла.

5. Не меняйте масштаб изображений

Указывайте атрибуты width и height для картинок, чтобы избежать лишних процессов обрисовки.

Зная это, верстальщик Джон Ку отображает изображение 700x700px как иконку размером 50х50px.
Но господин Ку и думать не хочет о дюжинах лишних килобайт, проносящихся в сети.

Запомните: Не надо изменять масштаб изображения, только потому что это можно сделать

4. Оптимизируйте

Файлы изображений часто включают в себя много бесполезной для Web информации. Например, в файле JPEG могут быть метаданные Exif камеры(дата, модель камеры, местоположение и т.п). А PNG может содержать информацию про цветовую палитру, метаданные и даже миниатюру изображения. Ничто из этого браузером не используется, а свой небольшой вес в размер файла вносит.

Существуют инструменты для такого рода оптимизации изображений. Это называется сжатием без потерь.

Другой способ оптимизации это редактирование качества картинки. Это называется сжатием с потерями. При создании JPEG, можно указать уровень качества (от 0 до 100). Для лучшей скорости загрузки, нужно выбирать наименее низкий позволительный уровень. А для PNG файла можно уменьшить цветовую палитру, например преобразовав PNG-24 в PNG-8.

Так же для увеличения скорости загрузки можно преобразовать JPEG файлы в прогрессивные. Прогрессивный JPEG поддерживается большинством браузеров и их очень просто создавать без значительной потери производительности. Такие изображения отображаются на странице быстрее (демо).

Сервер

3. Используйте умное кэширование

Лучший способ оптимизировать запросы к серверу - вообще их не делать. И один из самых действенных методов избавиться от лишних обращений к серверу - кэширование. По умолчанию, браузер сам решает, сколько времени хранить кэш. Но это можно контролировать.

Эта оптимизация выполняется на сервере (и зависит от типа сервера, на котором лежит сайт). В случае, например, с Apache, можно добавить следующие строки в файл .htaccess :

ExpiresActive On ExpiresByType image/gif "access plus 6 months" ExpiresByType image/jpeg "access plus 6 months" ExpiresByType image/png "access plus 6 months" ExpiresByType text/css "access plus 6 months" ExpiresByType text/javascript "access plus 6 months" ExpiresByType application/javascript "access plus 6 months" 

При такой конфигурации, браузер будет хранить изображения, CSS и JS файлы 6 месяцев - рекомендуется хранить их хотя бы месяц. Подобным образом конфигурируются и остальные типы серверов.

Важно: Если файл закэширован, браузер больше не будет загружать его, даже если содержимое файла поменяется. Один из способов загрузки измененного закэшированного файла, это переименовать его. Можно добавить к имени файла версию, либо timestamp. Например, вместо home.js , можно использовать home-v1.js , а когда файл изменится, переименовать в home-v2.js и т.д.

Другой способ заменить загрузку закэшированного файла это добавление параметра GET к URL. Например, home.js?v=1 и home.js?v=2 , но некоторые прокси игнорируют GET параметры.

2. gzip

Большая часть контента сайта приходится на текстовые данные (HTML, CSS, JavaScript, JSON, XML и т.п.). Такие данные легко сжимаются на стороне сервера при помощью GZIP и считается хорошим тоном это делать.

GZIP сжимает данные прежде чем отправить их браузеру пользователя, тот в свою очередь "на лету" декодирует их и отображает пользователю. Это как архивация файлов перед отправкой их кому либо. Все актуальные браузеры и серверы поддерживают технологию GZIP.

Технология включается на стороне сервера. Например, для сервера Apache, достаточно указать в файле .htaccess какие типы файлов нужно сжимать:

AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE application/javascript 

С такой же легкостью можно настроить и другие популярные серверы (читайте документацию!). И это один из самых эффективных способов по ускорению работы сайта.

Дополнительно

1. Инструмент диагностики - ваш верный друг

Если после всего прочитанного, вы решитесь окунуться в мир быстрых сайтов, то для вас будет полезно установить расширения для браузера YSlow и PageSpeed. Они станут для вас неотъемлемым инструментом.

А если вы предпочитаете онлайн сервисы, то WebPageTest, HTTP Archive или PageSpeed.

Вышеизложенные инструменты помогут проанализировать производительность вашего сайта, сформируют обобщенный отчёт и дадут ценные советы по дальнейшей оптимизации скорости загрузки.

0. На этом пока всё

Надеемся, после прочтения руководства, вы приведете сайт в атлетическую форму 🙂

И запомните: В оптимизации, как и в жизни, нет панацеи. Повышение скорости загрузки - это кропотливая работа, всегда придётся взвешивать все за и против прежде чем ускорять какой либо процесс в структуре сайта.

Тут вы найдете ссылки на материалы, которые были использованы при написании этого руководства.

Давайте уже начнём создавать быстрые сайты o/

Советы по оптимизации HTML-кода сайта

Несмотря на то, что сайты воспринимаются нами внешне, их внешняя составляющая строится, как и в Человеке, исходя из внутреннего мира под действием специальных законов и правил. Эти законы и правила для сайтов определяются стандартами W3C. Внешней составляющей сайта являются его дизайн и структура, внутренней составляющей – HTML -код и CSS -стили (не учитывая отдельный функционал).

Разрабатывая сайт или добавляя на него контент, мы часто заботимся лишь о внешнем его представлении. Это здорово! Однако, следует уделять внимание и внутреннему представлению страниц в виде HTML кода, особенно если речь идёт о будущем привлечении поискового трафика. Эта статья посвящена вопросам оптимизации кода сайта для улучшения его видимости в поисковых системах и построена на основе доклада автора с конференции All in Top Conf 2012 “Понятие SEO оптимизированной вёрстки”.

Каким сайтам нужна оптимизация кода

Советы по оптимизации вёрстки для SEO

При обсуждении вопросов о влиянии валидности HTML страниц на их ранжирование ряд оптимизаторов приводит в пример страницы популярных брендов, например, самих поисковых систем. И, действительно, главная страница Яндекса имеет порядка 30 ошибок и немного больше главная страница Google. Казалось бы, сами поисковые системы не заботятся о качестве HTML кода, подавая пример другим вебмастерам, и в нём можно найти много стилей и скриптов, не вынесенных во внешний файл, а также местами мусорный код.

Здесь следует понимать, что у подобных сервисов другие задачи, источники их входящего трафика это далеко не поисковые системы, а чаще постоянная аудитория. На них не следует равняться. Такие сервисы, как поисковики, социальные сети и ряд крупных порталов не нуждаются в SEO оптимизированной вёрстке, они оптимизируют код для других целей.

SEO оптимизированная вёрстка требуется, прежде всего, сайтам, основной источник трафика которых — поисковые системы.

Почему код имеет значение?

Оптимизация вёрстки является одним из элементов внутренней оптимизации сайта, которому, к сожалению, уделяют меньше внимания чем, например, редактированию заголовков страниц или их текстов. Часто это происходит из-за того, что клиент не предоставляет полный доступ к проекту или не имеет желания/возможностей переверстать свой сайт.

Ниже перечислены ряд пунктов (своего рода факторов), которые, так или иначе, влияют на видимость сайта в поиске и относятся к качеству HTML -кода.

Лёгкость распознавания (анализа) кода роботами

Чем проще код, тем легче его проанализировать и верно определить структуру страницы. Часто поисковые системы справляются с анализом сложного и невалидного кода, однако, для упрощения решения их задачи и уверенности, что поисковик поймёт вас правильно, лучше избавиться от ошибок, найденных валидатором и стараться делать код лёгким.

Быстрый поиск важных элементов

Какие важные элементы можно выделить на странице? Прежде всего, это заголовки, навигационные блоки, основной и вспомогательный контент. Если поисковик быстро найдёт важные элементы страницы, он лучше справится с задачей её индексации и последующего ранжирования.

Скорость загрузки страницы

В последнее время поисковики любят быстрые страницы, также как и пользователи. Улучшая этот показатель, можно иметь приоритет у своих конкурентов. В большей степени, скорость отдачи страницы будет зависеть от хостинга и используемой CMS , однако, также большую роль здесь играет и объем кода. Вынося всё лишнее из кода во внешние файлы и оптимизируя графику, можно существенно улучшить этот важный показатель.

Для ускорения загрузки страниц:

  • CSS и JS выносите во внешние файлы;
  • Элементы дизайна оформляйте в спрайты и выносите в листы стилей;
  • Используйте простой код.

Доступность важных элементов для поисковых роботов

Все важные элементы сайта должны быть легкодоступны. Затрудняют доступность робота к контенту использование флеша (в навигации или важном контенте) или яваскрипта, фреймов, некорректной кодировки и текстов в виде изображений.

Для улучшения доступности кода:

  • Проверьте код на валидацию с помощью validator.w3c.org
  • Старайтесь не использовать флеш и фреймы;
  • Всплывающую навигацию делайте открытой для индексации;
  • Для нестандартных шрифтов лучше использовать стили, а не изображения.

Показатель текстовой релевантности

Текстовая релевантность зависит не только от наличия ключевых слов, но и от их позиции в контенте и разнообразия тегов, в которых они используются.

Для повышения текстовой релевантности страницы:

  • Размещайте важный контент выше в коде;
  • Заголовки заключайте в теги — ;
  • Прописывайте ALT к изображениям;
  • Используйте семантическую разметку текста (каждый тег форматирования по своему назначению);
  • Не используйте текстовые портянки, форматируйте и разнообразьте текст.

Заключение

Следует подходить ответственно не только к внешней составляющей сайта, но также и к её внутренней составляющей в виде HTML -кода. Для анализа кода используйте Web Developer Toolbar, плагин Firebug и seo-чеклист.

Отключите CSS , JavaScript и изображения на странице, посмотрите, можно ли найти основные элементы текста – заголовки, абзацы, ссылки и фразы? Примерно так видит страницу робот, убедитесь, что он правильно поймёт ваши цели и приоритеты.

Источник https://habr.com/ru/articles/178561/

Источник https://devaka.info/articles/seo-slicing

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *