Web Performance
===============

Производительность в web - это объективные измерения и пользовательские ощущения, связанные с загрузкой и работой приложения. Производительность - это о том, как долго сайт грузится, становится интерактивным и отзывчивым, о том, как плавно происходит взаимодействие с контентом. Плавный ли скролл страницы? Все ли кнопки кликабельны? Всплывающие окна загружаются и показываются быстро? А анимируются? Хорошая производительность требует учёта всех аспектов: как объективных, например, фактическое время загрузки страницы или частота смены кадров; так и субъективных - в буквальном смысле "как пользователь воспринимает систему".

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

Существуют инструменты измерения производительности, API и лучшие практики, которые помогут нам измерять и улучшать производительность. Мы постараемся раскрыть их в следующей секции:

Ключевые статьи о производительности
------------------------------------

Lazy loading**Lazy loading (ленивая загрузка)** - это стратегия, направленная на определение ресурсов как неблокирующих (не критических) для того, чтобы отложить загрузку этих ресурсов на тот момент, когда они действительно необходимы. Так можно сократить длину критических этапов рендеринга, что приводит к уменьшению времени загрузки приложения.

Бюджет производительностиБюджет производительности - это лимит для предотвращения регрессий. Этот бюджет может быть применён к файлам, типам файлов, всем ресурсам приложения, определённым общим показателям (например, Время до интерактивности) пользовательским показателям (например, Время до главного элемента) или к пороговым значениям к определённым точкам во времени.

Время загрузки страницы и ресурсов**Тайминги навигации (Navigation timings)** - это показатели, указывающие временные метки, в которые произошли события навигации. **Тайминги ресурсов (Resource timings)** - это детальные показатели по времени загрузки ресурсов.

Время ожидания (latency)**Latency** (дальше - **время ожидания**) - это время, которое требуется на доставку пакета данных от источника к пункту назначения. В деле оптимизации производительности важно сокращать проблемы, которые приводят к длительному времени ожидания. Также необходимо научиться тестировать работу приложения в условиях плохого соединения. В этой статье мы рассмотрим само понятие времени ожидание, его причины, способы детекции и исправления.

Использование dns-prefetch**`DNS-prefetch`** (предзагрузка DNS) - это попытка определить IP адрес по имени домена до того, как ресурс с этого домена будет фактически запрошен. Это может быть загрузчик файлов, который используется позже или ссылка, по которой, вероятно, перейдёт пользователь.

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

Критические этапы рендерингаКритические этапы рендеринга (Critical Rendering Path) - это последовательность шагов, которые выполняет браузер, когда преобразуется HTML, CSS и JavaScript в пиксели, которые вы видите на экране. Оптимизация этих шагов улучшает производительность рендера. Эти этапы включают в себя работу с Document Object Model(DOM), CSS Object Model(CSSOM), деревом рендера (render tree) и компоновкой объектов (layout)

Мониторинг производительности: реальные пользователи и их эмуляция**Синтетический мониторинг** и **мониторинг реальных пользователей (Real User Monitoring, RUM)** - два способа мониторинга и получения данных о веб-производительности. Эти два подхода дают два разных обзора производительности и каждый имеет свои преимущества, области применения и минусы. RUM, в основном, лучше подходит для понимания долгосрочных трендов, в то время как синтетический мониторинг хорошо подходит для тестирования регрессий, их быстрого обнаружения и быстрой реакции на них в процессе разработки. В этой статье мы определим и сравним оба подхода.

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

Основы производительностиАнглийское слово Performance, которое используется в статьях о производительности приложений, также можно перевести, как "эффективность". Этот документ объясняет основы производительности, того как браузеры помогают улучшить её и какие инструменты и процессы вы можете использовать, чтобы её улучшить.

Производительность CSS и JavaScript анимацииАнимация является критичным инструментом для улучшения пользовательского опыта во многих приложениях. Существует много путей создания анимации в web, например, основанные на CSS-свойствах `transition`/`animation` или на JavaScript (using `Window.requestAnimationFrame`). В этой статье мы проанализируем производительность CSS и JavaScript анимаций и сравним их.

Производительность анимации и частота кадровАнимация в Вебе может быть сделана с помощью `SVGAnimationElement`, `window.requestAnimationFrame`, включая `canvas` и `WebGL_API`, CSS `animation`, `video`, анимированных GIF и даже с помощью анимированных PNG и других типов изображений. Производительность CSS-анимации может отличаться от одного CSS-свойства к другому, а попытка анимировать некоторые "дорогие" CSS-свойства может привести к зависаниям (jank), даже несмотря на то, что браузер борется за то, чтобы смягчить частоту смены кадров frame rate.

Тайминги производительности: как долго - долго?Не существует чётко установленного набора правил, который определяет медленную скорость загрузки страниц, но существуют особые руководства, которые рекомендуют определённые тайминги: загрузка контента - 1 секунда, ожидание - 50мс, анимация - 16,7мс, ответ на действия пользователя - от 50 до 200мс.

Руководства для начинающих
--------------------------

The MDN Web Performance Learning Area contains modern, up-to-date tutorials covering Performance essentials. Start here if you are a newcomer to performance:

Производительность веба: краткий обзор (en-US)

Обзор пути обучения повышения веб-производительности.

Что такое производительность веба? (en-US)

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

Как пользователи воспринимают производительность? (en-US)

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

Основы производительности веба (en-US)

В дополнение к HTML, CSS, JavaScript и мультимедийным файлам существуют функции, которые могут замедлить работу приложений, и функции, которые могут сделать приложения субъективно и объективно быстрее. Существует множество API, инструментов разработчика, хороших и плохих практик, связанных с веб-производительностью. Здесь мы представим многие из этих функций на базовом уровне и предоставим ссылки на более подробные сведения для повышения производительности по каждой теме.

Производительность HTML (en-US)

Некоторые атрибуты и порядок элементов разметки могут повлиять на производительность вашего веб-сайта. Сведя к минимуму количество DOM-элементов, обеспечив использование наилучшего порядка и атрибутов для включения контента, такого как стили, скрипты, мультимедиа и сторонние скрипты, вы можете значительно улучшить опыт пользователя (англ. UX). В этой статье подробно рассматривается, как можно использовать HTML для обеспечения максимальной производительности.

Мультимедиа: изображения и видео (en-US)

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

Производительность CSS (en-US)

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

Производительность JavaScript (en-US)

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

Производительность на мобильных устройствах

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

Using Performance APIs
----------------------

Performance API

This guide describes how to use the `Performance` interfaces that are defined in the High-Resolution Time standard.

Resource Timing API (en-US)

Resource loading and timing (en-US) the loading of those resources, including managing the resource buffer and coping with CORS

The performance timeline

The Performance Timeline standard defines extensions to the `Performance` interface to support client-side latency measurements within applications. Together, these interfaces can be used to help identify an application's performance bottlenecks.

User Timing API (en-US)

Create application specific timestamps using the user timing API (en-US)'s "mark" and "measure" entry types - that are part of the browser's performance timeline.

Frame Timing API

The `PerformanceFrameTiming` interface provides *frame* timing data about the browser's event loop.

Beacon API (en-US)

The Beacon interface schedules an asynchronous and non-blocking request to a web server.

Intersection Observer API

Learn to time element visibility with the Intersection Observer API and be asynchronously notified when elements of interest becomes visible.

Other documentation
-------------------

Developer Tools Performance Features

This section provides information on how to use and understand the performance features in your developer tools, including Waterfall, Call Tree (en-US), and Flame Charts (en-US).

Profiling with the built-in profiler (en-US)

Learn how to profile app performance with Firefox's built-in profiler.

Glossary Terms
--------------

* Beacon (en-US)
* Brotli compression (en-US)
* Client hints (en-US)
* Code splitting (en-US)
* CSSOM (en-US)
* Domain sharding (en-US)
* Effective connection type (en-US)
* First contentful paint
* First CPU idle
* First input delay
* First interactive
* First meaningful paint
* First paint
* HTTP
* HTTP/2
* Jank (en-US)
* Latency (en-US)
* Lazy load (en-US)
* Long task (en-US)
* Lossless compression (en-US)
* Lossy compression (en-US)
* Main thread (en-US)
* Minification (en-US)
* Network throttling (en-US)
* Packet (en-US)
* Page load time (en-US)
* Page prediction (en-US)
* Parse (en-US)
* Perceived performance (en-US)
* Prefetch (en-US)
* Prerender (en-US)
* QUIC (en-US)
* RAIL (en-US)
* Real User Monitoring (en-US)
* Resource Timing (en-US)
* Round Trip Time (RTT)
* Server Timing (en-US)
* Speculative parsing
* Speed index (en-US)
* SSL (en-US)
* Synthetic monitoring (en-US)
* TCP handshake (en-US)
* TCP slow start (en-US)
* Time to first byte
* Time to interactive
* TLS
* Transmission Control Protocol (TCP)
* Tree shaking (en-US)
* Web performance (en-US)
Documents yet to be written
---------------------------

JavaScript performance best practices (en-US)

JavaScript, when used properly, can allow for interactive and immersive web experiences ... or it can significantly harm download time, render time, in app performance, battery life, and user experience. This article outlines some JavaScript best practices that can ensure even complex content's performance is the highest possible.

Mobile performance

With web access on mobile devices being so popular, and all mobile platforms having fully-fledged web browsers, but possibly limited bandwidth, CPU, and battery life, it is important to consider the performance of your web content on these platforms. This article also looks at mobile-specific performance considerations.

Web font performance

An often overlooked aspect of performance landscape are web fonts. Web fonts are more prominent in web design than ever, yet many developers simply embed them from a third party service and think nothing of it. In this article, we'll covers methods for getting your font files as small as possible with efficient file formats and sub setting. From there, we'll go on to talk about how browsers text, and how you can use CSS and JavaScript features to ensure your fonts render quickly, and with minimal disruption to the user experience.

Performance bottlenecks

…

Understanding bandwidth

Bandwidth is the amount of data measured in Megabits(Mb) or Kilobits(Kb) that one can send per second. This article explains the role of bandwidth in media-rich internet applications, how you can measure it, and how you can optimize applications to make the best use of available bandwidth.

The role of TLS in performance

TLS—or HTTPS as we tend to call it—is crucial in creating secure and safe user experiences. While hardware has reduced the negative impacts TLS has had on server performance, it still represents a substantial slice of the time we spend waiting for browsers to connect to servers. This article explains the TLS handshake process, and offers some tips for reducing this time, such as OCSP stapling, HSTS preload headers, and the potential role of resource hints in masking TLS latency for third parties.

Reading performance charts

Developer tools provide information on performance, memory, and network requests. Knowing how to read waterfall charts, call trees (en-US), traces, flame charts (en-US) , and allocations (en-US) in your browser developer tools will help you understand waterfall and flame charts in other performance tools.

Alternative media formats

When it comes to images and videos, there are more formats than you're likely aware of. Some of these formats can take your highly optimized media-rich pages even further by offering additional reductions in file size. In this guide we'll discuss some alternative media formats, how to use them responsibly so that non-supporting browsers don't get left out in the cold, and some advanced guidance on transcoding your existing assets to them.

Analyzing JavaScript bundles

No doubt, JavaScript is a big part of modern web development. While you should always strive to reduce the amount of JavaScript you use in your applications, it can be difficult to know where to start. In this guide, we'll show you how to analyze your application's script bundles, so you know *what* you're using, as well how to detect if your app contains duplicated scripts between bundles.

Lazy loading

Lazy loading (ленивая загрузка) - это стратегия, направленная на определение ресурсов как неблокирующих (не критических) для того, чтобы отложить загрузку этих ресурсов на тот момент, когда они действительно необходимы.

Lazy-loading JavaScript with dynamic imports

When developers hear the term "lazy loading", they immediately think of below-the-fold imagery that loads when it scrolls into the viewport. But did you know you can lazy load JavaScript as well? In this guide we'll talk about the dynamic import() statement, which is a feature in modern browsers that loads a JavaScript module on demand. Of course, since this feature isn't available everywhere, we'll also show you how you can configure your tooling to use this feature in a widely compatible fashion.

Controlling resource delivery with resource hints

Browsers often know better than we do when it comes to resource prioritization and delivery however they're far from clairyovant. Native browser features enable us to hint to the browser when it should connect to another server, or preload a resource before the browser knows it ever needs it. When used judiciously, this can make fast experience seem even faster. In this article, we cover native browser features like rel=preconnect, rel=dns-prefetch, rel=prefetch, and rel=preload, and how to use them to your advantage.

Performance Budgets

Marketing, design, and sales needs, and developer experience, often ad bloat, third-party scripts, and other features that can slow down web performance. To help set priorities, it is helpful to set a performance budget: a set of restrictions to not exceed during the development phase. In this article, we'll discuss creating and sticking to a performance budget.

Web performance checklist

A performance checklist of features to consider when developing applications with links to tutorials on how to implement each feature, include service workers, diagnosing performance problems, font loading best practices, client hints, creating performant animations, etc.

Mobile performance checklist

A concise checklist of performance considerations impacting mobile network users on hand-held, battery operated devices.

See also
--------

HTML

* The `<picture>` Element
* The `<video>` Element
* The `<source>` Element
* The `<img> srcset` attribute
    + Responsive images
* Preloading content with `rel="preload"` (en-US) - (https://w3c.github.io/preload/)

CSS

* will-change
* GPU v CPU
* Measuring layout
* Font-loading best practices

JavaScript

* DOMContentLoaded (en-US)
* Garbage collection (en-US)
* requestAnimationFrame

APIs

* Performance API (en-US)
* Navigation Timing API
* Media Capabilities API (en-US)
* Network Information API
* PerformanceNavigationTiming (en-US)
* Battery Status API (en-US)
* Navigator.deviceMemory (en-US)
* Intersection Observer
* Using the User Timing AP (en-US)I
* Long Tasks API (en-US)
* High Resolution Timing API (https://w3c.github.io/hr-time/)
* Resource Timing API (en-US)
* Page Visibility
* Cooperative Scheduling of Background Tasks API (en-US)
    + requestIdleCallback()
* Beacon API (en-US)
* Resource Hints - dns-prefetch (en-US), preconnect, prefetch (en-US), and prerender
* Fetchevent.navigationPreload (en-US)
* Performance Server Timing API (en-US)

Headers

* Content-encoding
* HTTP/2
* gZip (en-US)
* Client Hints

Tools

* Performance in Firefox Developer Tools
* Flame charts
* The Network panel
* Waterfall charts

Additional Metrics

* Speed Index and Perceptual Speed Index

Best Practices

* Using Service Workers
* Using Web Workers
    + Web Workers API
* PWA (en-US)
* Caching
* Content Delivery Networks (CDN)