STATUS IS UPВИКИ ПО ОПТИМИЗАЦИИ САЙТОВ
25Ускорить
Производительность и доставка / Ускорить

Производительность JavaScript: уменьшите работу основного потока

Найдите JavaScript, который вызывает задержки на странице, устраните ненужную работу и защитите взаимодействия.

Производительность JavaScript: уменьшите работу основного потока — ВИЗУАЛЬНОЕ РУКОВОДСТВО
ЧИТАТЬ
8 мин
ИСТОЧНИКИ
5
ПОВТОРНО ПРОВЕРИТЬ
2027-03-27
проверено
Старший рецензент по веб‑производительности
КРАТКИЙ ОТВЕТ

Начните с решения.

Уменьшите нагрузку на основной поток, измерив работу реальной страницы и взаимодействие, а затем устранив самый затратный повторяющийся участок. Основной поток выполняет большую часть JavaScript и работы интерфейса последовательно, задача за задачей. Задача длительностью более 50 миллисекунд считается long task, поэтому отклик на касание, клик, прокрутку или отрисовку может задерживаться. Начните с критичных путей: оформления заказа, поиска, навигации, форм и других чувствительных сценариев.

Для каждой затратной операции удалите её, отложите до необходимости, разбейте на короткие пакеты или перенесите ограничённые вычисления в Web Worker. Сохраняйте немедленную реакцию в основном потоке, но откладывайте аналитику и другие несущественные последующие действия. Относитесь к каждому стороннему тегу как к зависимости с владельцем. Повторно тестируйте на ограниченном мобильном CPU и сохраняйте возможность отката для критичных потоков.

ВИЗУАЛЬНОЕ РУКОВОДСТВО

Видеть работу как систему.

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

SIUУскорить
01Профилируйте пользовательский путь перед изменением кода
02Читать трассу как очередь работы
03Отправляйте меньше кода в момент, когда это важно
04Разбивайте работу, чтобы браузер мог отвечать
01

Профилируйте пользовательский путь перед изменением кода

Выберите один важный маршрут и взаимодействие — например открытие навигации, фильтрацию результатов или отправку формы. Запишите его в панели Performance Chrome DevTools в чистом состоянии браузера. Повторите действие и снимите трассу с ограниченным CPU, а также с машины разработчика; десктопные трейсы могут скрывать работу, которая нарушает работу на менее мощном телефоне.

Используйте трассу для проверки узкой гипотезы, а не для поиска виновного компонента по отчёту по бандлу. В Main flame chart более широкие полосы означают больше времени, а сложенные полосы показывают стек вызовов. Красный треугольник на Task указывает на потенциальный long task — выберите его и следуйте ссылке на инициирующий код. Сохраняйте трассы «до» и «после» для осмысленных изменений.

Зафиксируйте момент

Записывайте чуть до действия и останавливайте после видимого результата.

Используйте повторяемый кейс

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

Назначьте владельца

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

02

Читать трассу как очередь работы

Long task — это порог для расследования, а не полноценный диагноз. Спецификация W3C Long Tasks фиксирует задачи длительностью 50 миллисекунд и более. Посмотрите, что происходит внутри задачи: это может быть выполнение JavaScript, обработчик события, пересчёт стилей, layout или paint. Стек вызовов показывает, с чего начать; тайминги подсказывают, связана ли проблема с кодом, отрисовкой или сторонним фреймом.

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

Разделяйте моменты

Парсинг при старте требует иного решения, чем обработчик после касания.

Проверяйте отрисовку

Найдите повторяющиеся паттерны «запись стилей — чтение layout» перед рефакторингом.

Сохраняйте базовую линию

Прикрепляйте трассу, сценарий и основные затраты к задаче в трекере.

03

Отправляйте меньше кода в момент, когда это важно

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

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

Сформируйте бюджет для маршрута

Документируйте, какие скрипты разрешены на маршруте и почему.

Загружать по намерению

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

Защитите критичные пути

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

04

Разбивайте работу, чтобы браузер мог отвечать

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

При поддержке браузером scheduler.yield() позволяет текущей задаче уступить управление и позже продолжить работу; проверяйте наличие этой функции и предусмотрите запасной вариант для неподдерживаемых браузеров. Не уступайте управление после каждой мелкой операции: это создаёт накладные расходы и может увеличить время завершения. Выбирайте границы по результатам измерений, сохраняйте возможность отмены и не допускайте, чтобы устаревшие результаты заменяли более актуальное состояние.

Ставьте UI на первое место

Покажите подтверждение или прогресс до невидимых последующих действий.

Пакетируйте по времени выполнения

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

Избегайте устаревших приёмов

Текущее руководство web.dev не рекомендует новую стратегию, основанную на isInputPending().

05

Переносите вычисления, а не интерфейс, в воркер

Web Worker выполняет скрипт в фоновом потоке, отдельном от основного потока выполнения. Он подходит для дорогого парсинга, преобразования данных, индексирования поиска и других вычислений, которые не требуют прямого доступа к интерфейсу. Отправляйте определённый ввод, возвращайте определённый результат и оставляйте отрисовку и видимые изменения состояния в основном потоке.

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

Выбирайте изолированную работу

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

Версионируйте сообщения

Отбрасывайте результаты, созданные для старого фильтра, маршрута или действия.

Сохраняйте доступность

Сообщайте о значимом прогрессе через обычный интерфейс.

06

Управляйте сторонним JavaScript как зависимостью продакшна

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

Где позволяют условия и контракты, сравните репрезентативную страницу с одним сторонним происхождением и без него. Инструменты производительности покажут дорогое выполнение, payloadы и атрибуцию long task. Оставляйте лёгкую или отложенную интеграцию только если её документированная ценность оправдывает измеренные затраты. Подтвердите работу основного контента и основную транзакцию, когда опциональная зависимость медленная или отсутствует.

Ограничьте радиус поражения

Загружайте тег только на тех маршрутах и при тех условиях, где он нужен.

Пересмотрите управление изменениями

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

Держите переключатель удаления

Документируйте и тестируйте способ отключения некритичной интеграции.

07

Сделайте отзывчивость критерием готовности к релизу

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

Status Is UP использует эти доказательства для проактивной оптимизации и безопасной корректировки, а не чтобы заменить мониторинг доступности в реальном времени. Перед изменением с высоким риском подготовьте откат и проверьте критичный поток после релиза. Результаты зависят от устройства, сети, браузера, контента и состояния аккаунта; рассматривайте пороги как защитные ограждения, а не как гарантии.

Гейтируйте значимые изменения

Требуйте трассы «до» и «после» для общей навигации, оформления заказа, поиска или больших бандлов.

Тренируйте откат

Знайте feature flag, настройку тега или версию деплоя, которая восстанавливает известное хорошее поведение.

Пересматривайте регулярно

Профилируйте заново после крупных релизов, смены вендоров или изменений в наборе устройств.

ДЕЙСТВИЕ / ПРОВЕРКА

Практический чек‑лист

  1. 01

    Выберите критичное взаимодействие

    Назовите маршрут, действие, ожидаемый отклик и влияние на клиента.

    ПРОВЕРИТЬ: Тестовая заметка фиксирует маршрут, состояние аккаунта, действие, браузер и настройку устройства или CPU.
  2. 02

    Запишите базовую трассу

    Запишите взаимодействие в DevTools Performance из чистого состояния.

    ПРОВЕРИТЬ: Команда может вновь открыть трассу с Main flame chart.
  3. 03

    Найдите блокирующую работу

    Проинспектируйте long tasks, стеки вызовов, отрисовку и активность сторонних скриптов.

    ПРОВЕРИТЬ: Каждый верхний источник затрат имеет длительность, источник или origin, маршрут и владельца.
  4. 04

    Удалите ненужные скрипты

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

    ПРОВЕРИТЬ: Сборка и критичный сценарий работают после удаления.
  5. 05

    Отложите необязательные функции

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

    ПРОВЕРИТЬ: Тест на свежей странице покрывает загрузку, отказ или запасной вариант.
  6. 06

    Разбейте длинные задачи

    Пакетируйте работу и уступайте после немедленного ответа интерфейса.

    ПРОВЕРИТЬ: Новая трасса устраняет сопоставимый long task по пути взаимодействия и сохраняет корректные результаты.
  7. 07

    Оцените воркер

    Переносите только ограниченные вычисления с определёнными сообщениями.

    ПРОВЕРИТЬ: Тестируйте сквозное время, ошибки, устаревшие результаты и очистку.
  8. 08

    Аудит сторонних сервисов

    Запишите назначение, владельца, условие, требование согласия, стоимость и процедуру отключения.

    ПРОВЕРИТЬ: Каждый тег на критичном маршруте имеет решение: оставить, ограничить, отложить или удалить.
  9. 09

    Тестируйте в ограниченных условиях

    Повторите на CPU с троттлингом и в репрезентативных браузерах или устройствах, где возможно.

    ПРОВЕРИТЬ: Сравнение использует один и тот же сценарий и фиксирует существенные различия.
  10. 10

    Релиз с возможностью отката

    Прикрепите трассу, проверку приёмки и инструкцию по откату к релизу.

    ПРОВЕРИТЬ: Назначенный владелец может восстановить известное рабочее поведение без обращения к недокументированным источникам.
ВОПРОСЫ ДЛЯ ОБСУЖДЕНИЯ

Сравнивайте компромиссы, а не приватные данные.

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

  1. 01

    Какое взаимодействие выглядело приемлемо в отчёте о загрузке, но оказалось медленным, когда вы профилировали реальное касание или клик?

  2. 02

    Как вы решаете, оправдывает ли сторонняя функция её измеренную цену для основного потока?

  3. 03

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

ПОПУЛЯРНЫЕ / АВТОРИТЕТНЫЕ РЕСУРСЫ

Откройте исходные материалы.

web.devOptimize long tasks ↗

Объясняет long tasks, yield-ы, scheduler.yield(), запасные варианты и накладные расходы при уступке.

Проверено 2026-09-27
Chrome for DevelopersAnalyze runtime performance ↗

Показывает запись, анализ flame chart, идентификацию long task и исследование исходника.

Проверено 2026-09-27
MDN Web DocsWeb Workers API ↗

Определяет воркеры, обмен сообщениями и ограничение прямого доступа к DOM.

Проверено 2026-09-27
web.devLoad Third-Party JavaScript ↗

Предоставляет руководство по аудиту и измерению сторонних скриптов.

Проверено 2026-09-27
W3CLong Tasks API ↗

Описывает long tasks, порог и атрибуцию.

Проверено 2026-09-27

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

КРАТКИЕ УТОЧНЕНИЯ

Частые вопросы.

Что считается длинной JavaScript‑задачей?

Спецификация W3C Long Tasks использует порог 50 миллисекунд и более для отчётности. Это сигнал для расследования, а не доказательство того, что более короткие задачи безвредны. Подтвердите причину в трассе.

Всегда ли разделение кода улучшает производительность JavaScript?

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

Должна ли каждая дорогая функция выполняться в Web Worker?

Нет. Воркеры подходят для изолированных, CPU‑ёмких вычислений с определёнными сообщениями. Они не могут напрямую менять DOM, передача данных занимает время, и небольшие задачи могут завершиться быстрее в основном потоке.

Status Is UP Editorial Team · Редакторы Uptime Enablement

Проверено Старший рецензент по веб‑производительности. Опубликовано 2026-09-27; обновлено 2026-09-30.