#javascript #lighthouse
Вопрос:
Я создаю плагин для ведения блога, который позволяет комментировать определенные страницы. На данный момент это работает так: вы включаете js
скрипт на свою html-страницу, который затем запускается во время загрузки и добавляет поле для комментариев на страницу.
Все работает правильно, однако при запуске отчетов Lighthouse я все равно получаю «Удалить неиспользуемый Javascript».
Я предполагаю, что это происходит потому, что код используется не сразу, а скорее инициируется после полной загрузки страницы?
Есть идеи, как я мог бы это исправить?
Ответ №1:
«Удалить неиспользуемый JavaScript» не означает, что сценарий не используется, он говорит вам, что в этом сценарии у вас есть JavaScript, который не нужен для загрузки страницы.
То, что он призывает вас сделать, — это «разделение кода», что означает, что вы сначала предоставляете JS, необходимые для начального содержимого страницы (известного как содержимое, указанное выше), а затем отправляете любые другие JS, необходимые для постоянного использования на сайте.
Если вы посмотрите на отчет и откроете запись, вы увидите, что в ней есть значение, показывающее, какая часть базы кода изначально не нужна.
Если скрипт небольшой (менее 5 кб), что я бы предположил, если все, что он делает, — это создает поле для комментариев, просто проигнорируйте этот момент. Если он больше (и вы не можете легко сделать его меньше) — разделите его на код «инициализации» и код «использования» / остальную часть кода и подайте код «инициализации» на ранней стадии, а остальные-после загрузки всех необходимых элементов или по назначению.
Это не влияет на ваш результат напрямую и предназначено исключительно для того, чтобы указать лучшие практики и выделить потенциальные проблемы, которые замедляют работу вашего сайта.
Дополнительный
Из комментариев автор указал, что библиотека довольно большая-70 кб, из-за того, что в ней есть WYSIWYG и т. Д.
Если вы пытаетесь загрузить большую библиотеку, но также учитываете производительность, хитрость заключается в том, чтобы загрузить библиотеку либо «намеренно», либо после загрузки важных файлов.
Есть несколько способов добиться этого.
по намерению
Если у вас есть сложный элемент, который должен отображаться «выше сгиба», и вы хотите получить высокие показатели производительности, вам нужно пойти на компромисс.
Один из способов сделать это-вместо немедленной инициализации компонента отложить инициализацию библиотеки / компонента до тех пор, пока кому-то не понадобится его использовать.
Например, у вас может быть кнопка на странице с надписью «оставить комментарий» (или что-то подходящее), связанная с функцией, которая загружает библиотеку только после ее нажатия.
Очевидно, что компромисс здесь заключается в том, что у вас будет небольшая задержка при загрузке и инициализации библиотеки (но простого счетчика загрузки будет достаточно, так как даже библиотека объемом 70 Кб должна загружаться всего за секунду или около того даже при медленном подключении).
Вы даже можете извлечь сценарий, как только чей-то курсор мыши наведет на кнопку, эти дополнительные несколько миллисекунд могут привести к ощутимой разнице.
Отсроченный
У нас, очевидно async
, есть атрибут defer
и.
Проблема в том, что и то, и другое означает, что вы загружаете библиотеку вместе с критически важными ресурсами, разница в том, когда они выполняются.
Вместо этого вы можете использовать функцию, которая прослушивает событие загрузки страницы (или прослушивает все загружаемые важные ресурсы, если у вас есть способ их идентификации), а затем динамически добавляет сценарий на страницу.
Таким образом, он не отнимает ценные сетевые ресурсы в то время, когда другим элементам, необходимым для загрузки страницы, требуется этот слот для пропускной способности / сетевых запросов.
Очевидно, что компромисс здесь заключается в том, что библиотека будет готова немного позже, чем основной контент «выше складки». Еще раз, простой загрузочной вертушки должно быть достаточно, чтобы решить эту проблему.
Комментарии:
1. Я попытался разделить его, но в этот момент он начал жаловаться, что мои разделенные куски не используются. Я думаю, я знаю, что люди, которые устанавливают это, в конечном итоге будут жаловаться на свои оценки по маяку, поэтому я пытаюсь исправить это заранее.
2. Это не влияет на ваш счет напрямую, как я уже сказал. Насколько велика библиотека, которую вы построили? Если он небольшой и обслуживается с
async
помощью илиdefer
он загрузится за миллисекунды даже на мобильном устройстве и не окажет негативного влияния на их оценку. Если они этого не понимают, я рад сообщить вам, что это не ваша проблема… вероятно, это те же люди, которые создают сайт-брошюру со 100 кб React и React DOM, а затем задаются вопросом, почему это происходит медленно. Если это ваши конечные клиенты, просто объясните им, что это имеет минимальный эффект. Очевидно, что если ваша библиотека составляет 30 КБ для отображения поля комментариев, совет будет другим.3. С удовольствием взгляну на него, если он у вас есть на общедоступном URL-адресе
4. Библиотека занимает около 70 кб. Это в основном потому, что я использую не текстовую область, а скорее более сложный редактор. Вы можете найти источник здесь ( github.com/creativiii/commentcarp-editor/blob/master/src/… ). Скомпилированный код можно найти здесь ( editor.commentcarp.club/assets/commentcarp.js ).
5. Я добавил дополнительный бит к своему ответу, возможно, один из этих методов может быть легко реализован в вашей текущей реализации путем создания простого сценария инициализации, который затем загружает основной сценарий в соответствующее время. Я использую этот метод для таких вещей, как Google Analytics, поскольку он (по сравнению с другими полезными нагрузками на моем сайте) очень большой-более 30 кб. Я слушаю, как завершается и выполняется загрузка JS моего сайта, а затем запускаю сценарий включения GA.