Статьи

Выполнение JavaScript и ограничения браузера

Пользовательский интерфейс браузера и код JavaScript ( эффективно * ) совместно используют один поток обработки. Неважно, нужно ли браузеру реагировать на щелчок своего меню, отображать HTML-страницу или выполнять вызов Ajax — каждое событие добавляется в одну очередь. Когда браузер становится бездействующим, следующий элемент в его списке дел извлекается и выполняется.

примечание: одиночные темы браузера

На самом деле, ни один современный браузер не работает в одном потоке. В качестве крайнего примера, IE9 и Chrome запускают новый процесс ОС для каждой вкладки. Однако для каждой просматриваемой страницы по-прежнему существует одна очередь событий, и одновременно можно выполнить только одну задачу. Это абсолютно необходимо, потому что браузер или ваш JavaScript может изменять отображаемый HTML-код до, во время или после его загрузки.

Понятно, что браузер должен ограничивать время выполнения кода JavaScript. Если сценарий занимает слишком много времени, он блокирует приложение и может вызвать нестабильность ОС. По этой причине вы увидите страшное предупреждение «Unresponsive Script»:

Сценарий не отвечает

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

Internet Explorer
IE ограничивает выполнение JavaScript до 5 миллионов операторов.

Fire Fox
Firefox использует ограничение по времени в 10 секунд.

Сафари
Safari использует ограничение по времени 5 секунд.

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

опера
Opera не реализует ограничение и будет выполнять JavaScript неограниченное время. Однако браузер не вызовет нестабильности системы — вы можете продолжать открывать другие вкладки или закрывать страницу, выполняющую код.

Несколько браузеров позволяют вам настраивать параметры ограничения выполнения, но я бы не рекомендовал это делать. Я не буду публиковать здесь детали, потому что кто-то где-то будет использовать это как «починку» для своей не отвечающей страницы! Google, если хотите, но настройка браузера для плохого поведения кода не устраняет корень проблемы.

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

Однако я осознаю, что минимизация обработки на стороне клиента не обязательно является жизнеспособным решением для современных приложений, насыщенных JavaScript. К счастью, есть ряд решений … следите за новостями в SitePoint, так как скоро появятся несколько альтернатив.

примечание: хотите больше?

Если вы хотите узнать больше от Крейга, подпишитесь на нашу еженедельную новостную рассылку Tech Times .