
Как избежать угловатого белого экрана смерти
Если вы когда-либо работали с angular или ionic, вы могли столкнуться с полной белой страницей, также известной как белый экран смерти. Скорее всего причина в несовместимости браузера из-за отсутствия полифилов или браузер вообще не поддерживается. Поэтому angular загружается неправильно, и страница остается пустой.
Если вы хотите попробовать это, просто сгенерируйте ошибку перед загрузкой файла main.ts.
if (environment.production) {
enableProdMode();
}
throw new Error('White screen, reveal yourself!');
platformBrowserDynamic()
.bootstrapModule(AppModule)
.catch((err) => console.error(err));
Это наихудший сценарий, так как не отображаются сообщения об ошибках или какие-либо инструкции. Многие из ваших пользователей могут просто уйти. Если пользователь просматривает ваш адрес электронной почты, вы можете получить информацию о том, что произошла ошибка, но у вас не будет никакой информации (например, трассировки стека), чтобы начать ее отладку. Для нативных приложений все еще хуже, так как вы получите рейтинг в одну звезду в магазинах приложений и комментарии типа «Не работает». И многие из них просто оставляют свой отзыв и не будут отвечать на ваши ответы.
Как мы можем это исправить?
Предупреждение о спойлере: я не знаю ни одного волшебного решения, которое исправило бы для нас подобные ошибки. Проблема в том, что angular работает неправильно, и поэтому его глобальный обработчик ошибок или какой-либо код внутри angular не справится с этим. Также есть разные причины в зависимости от версии браузера, операционной системы, а затем дело доходит до гибридных приложений, веб-просмотра и нативной специфики.
Но что мы можем сделать, так это, по крайней мере, показать сообщение об ошибке и некоторые инструкции, например следующие:

Решение
Мы расширяем index.html нашего одностраничного приложения с помощью CSS, HTML и VanillaJS для обнаружения белого экрана и отображения сообщения об ошибке.
Несколько замечаний по JS
JavaScript довольно понятен. У нас есть функция showWhitescreenError, которая регистрирует ошибку и отображает элемент div, если он еще не показан (возможно, возникает несколько ошибок). Функция также добавляет стек ошибок к отображаемому сообщению. Сам JS не использует никаких современных функций ES, так как мы хотим, чтобы он корректно работал на всех устройствах.
Для обнаружения белого экрана есть два типа ошибок, о которых я знаю:
- Неперехваченная ошибка
При запуске приложения возникает неперехваченная ошибка. Мы обрабатываем это с помощью глобального Event-Listener и показываем сообщение об ошибке через заданное время (например, 5 секунд). Мы ждем несколько секунд, потому что angular все еще может работать, и нам не нужно мигающее сообщение об ошибке. - Пустой корневой каталог приложения
Корневой каталог приложения остается пустым, но ошибка не возникает. Мы проверяем, есть ли у корневого приложения какие-либо дочерние элементы по прошествии заданного времени (например, 8 секунд), и показываем сообщение об ошибке, если нет.
Несколько замечаний по CSS
Конечно, вы можете изменить HTML и CSS сообщения об ошибке в соответствии с вашими потребностями. Как правило, вам следует избегать очень современного CSS, так как вы можете иметь дело со старыми версиями браузера. Я предлагаю установить отрицательный z-index для отображения сообщения за app-root (в случае, если приложение работает и исправление белого экрана запускается ложно). Также начните с `display: none`, чтобы скрыть сообщение до тех пор, пока не произойдет ошибка. Оставив необходимый CSS для этих двух строк:
.whitescreen {
display: none;
z-index: -1000;
}
Место для улучшений?
Мы могли бы добавить больше функциональности в обработку ошибок, например, добавить некоторую информацию о конкретной платформе (например, операционную систему, версию браузера) или отправить событие HttpRequest с отчетом об ошибке на наш сервер. Но добавление большего количества кода также может привести к новым ошибкам, и наша главная цель — отобразить что-то вместо пустого экрана.
Последние мысли
Это исправление действительно помогает? Я использовал этот подход в проектах angular и ionic, и это определенно привлекло к нам несколько пользователей, которые прислали скриншоты и попросили о помощи. В случае с ионным приложением мы предложили попробовать нашу PWA вместо AppStore-версии, и пока это работало для всех из них. Кроме того, с момента исправления белого экрана в магазинах не поступало новых отзывов «Не работает».
Спасибо, что прочитали. Мне очень приятно услышать ваше мнение. Не стесняйтесь комментировать, делиться своим опытом или предлагать какие-либо улучшения.