Рейтинг:0

Как оптимизировать доставку javascript на wordpress/apache/AWS?

флаг cv

Я в кроличьей норе оптимизации скорости сайта. У меня есть сайт, который получает ужасные оценки от всех обычных подозреваемых (в частности, PageSpeed ​​и GT Metrics; в инструментах Pingdom он выглядит нормально).

Моя установка представляет собой один сервер T3-Medium с Apache и Wordpress за AWS ELB с развертыванием в CloudFront в качестве CDN.

Мои первые попытки улучшить производительность включали

  • обновлен до Medium (на сервере работает около 1/2 дюжины веб-сайтов, но они крошечные — совокупный трафик на всех из них составляет всего несколько тысяч посещений в день — тем не менее, экземпляр «Small» был слишком вяло даже при одном ударе из-за нехватки памяти),
  • установил плагин WP Super Cache (я уже работал за CloudFront, но установил плагин для кэширования самих страниц)
  • В поведение CloudFront добавлены заголовки управления кешем.
  • Удалены строки запроса из ключа кеша (это не традиционный сайт электронной коммерции, и реклама в Твиттере добавляла уникальную строку для каждого пользователя, что в основном приводило к промаху кеша при каждом просмотре страницы)

Однако даже при этом производительность по умолчанию неприемлема. Виновником, кажется, является доставка (и выполнение) javascript. Вот некоторые результаты GT Metrics, основанные на том, сколько ручного вмешательства я выполняю:

            Cache-Miss Cache-Hit Cache-Miss Cache-Hit Cache-Miss Cache-Hit
            Молоток по умолчанию Молоток по умолчанию YouTube Молоток Кувалда на YouTube Кувалда
ТТФБ 1 100 91 75 66 75 72 | 74 74 122 74 54 75 | 76 86 104 86 63 45
FCP 2 200 1 100 4 200 494 519 383 | 1 100 2 700 1 400 710 415 622 | 1 200 1 200 1 200 388 338 256
LCP 3 300 2 000 6 300 1 900 1 700 1 800 | 1 800 3 500 2 000 2 700 881 1 600 | 1 900 2 000 2 500 684 617 490
Под нагрузкой 4 600 3 200 7 600 2 300 3 000 2 700 | 2 900 4 900 2 700 3 100 1 500 2 500 | 2 000 2 000 2 400 766 824 489
TTI 4 700 3 300 7 600 2 500 2 900 3 200 | 3 000 8 000 2 800 3 400 1 700 3 000 | 8 000 6 800 1 200 6 700 6 700 6 400

Как вы можете видеть, если я ничего не делаю (первые две подтаблицы «по умолчанию»), сайт загружается почти 3 секунды при попадании в кеш, и часто больше 4 секунд при промахе кеша.

Это действительно корень вопроса. Что мне делать отсюда? Ниже я опишу, что я сейчас делаю, но я не думаю, что то, что я собираюсь описать, является стандартной практикой в ​​Интернете, и, очевидно, Интернет в целом не страдает от такого рода производительности. .

Применение кувалды

Я не уверен, какая из этих метрик имеет наибольшее значение с точки зрения пользовательского опыта, но я подозреваю, что в моем случае это LCP и загрузка (я могу представить, что для некоторых веб-сайтов это TTI, но в моем случае нечего делать выше сгиба, так что старая метрика первого простоя ЦП была бы отличной, если бы Lighthouse все еще сообщала об этом).

То, что я делаю сейчас, это то, что у меня есть в разделе «Кувалда» таблицы. Я написал скрипт, который удаляет все несущественные теги src javascript и возвращает их только через 5 секунд или после первого взаимодействия с пользователем. Вы можете увидеть результаты. Даже при промахе кеша сайт загружается примерно за 2 секунды, а при попадании в кеш — намного меньше 1 секунды (мы можем игнорировать число TTI, потому что это моя 5-секундная задержка, и она не влияет на выше- складной внешний вид или интерактивность).

Хорошо, сайт «работает», но на самом деле не только кажется, что это не нужно делать в абстракции, но также есть некоторый javascript, который я бы очень хотел, чтобы он работал с самого начала.

Покопавшись, все проблемы кажутся сторонним JavaScript (т. Е. То, чего нет / не может быть в моем CDN). Некоторые из них просто вопиющие, и я могу справиться с этим внутри компании (например, я могу сказать маркетологам: «Используйте HotJar только тогда, когда вам действительно нужно, а затем выключайте его — он добавляет целую секунду к загрузке страницы». время"). Но некоторые из них являются просто «интернет-стандартами» — Stripe и Google Analytics добавляют ~ 500 мс между временем загрузки и временем выполнения.

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

Tim avatar
флаг gp
Tim
Читая ваше обновление, вся эта 5-секундная задержка действительно необычна. Вы можете загрузить js, размещенный где угодно, и разместить его на своем сервере / CDN, если хотите. Предлагаю вам попробовать мою идею, так как вы не дали нам достаточно информации, чтобы действительно помочь вам.Если вы действительно хотите помочь опубликовать URL.
philolegein avatar
флаг cv
@ Тим, я не могу найти сообщение, в котором я получил первоначальную идею задержки, но я думаю, что идея заключалась в том, «Подождите долго, чтобы начать загрузку, но сделайте это раньше, если пользователь прокручивает / щелкает / и т. д.. ". Тем не менее, я принял ваше предложение и уменьшил задержку до 650 мс, основываясь на данных, которые я поместил в ревизию. Вы можете увидеть рассматриваемую страницу здесь: [ссылка] (https://www.chrisrichardson.info/lp/prague-b/)
Tim avatar
флаг gp
Tim
Первая загрузка заняла у меня несколько секунд в Новой Зеландии, вторая и последующие загрузки были очень, очень быстрыми, поэтому CDN работает. Проверка веб-страницы говорит, что все в порядке. https://www.webpagetest.org/result/220531_BiDcPJ_7TB/. GTMetrix немного медленнее при первой загрузке https://gtmetrix.com/reports/www.chrisrichardson.info/8JdbxgoE/, но как только он кэшируется на узле CDN рядом с тестовой площадкой, он становится очень быстрым https://gtmetrix.com/reports/ www.chrisrichardson.info/4jXER8rm/. Так что я думаю, что первая загрузка - это ваша проблема. Я не думаю, что это проблема инфраструктуры. Различия, вероятно, связаны с географией. Я бы полностью потерял задержку
Tim avatar
флаг gp
Tim
Я бы удалил пятисекундную задержку загрузки JS и удостоверился, что кеширующие заголовки для статических ресурсов (js / jpg / и т. д.) настроены так, чтобы они могли кэшироваться CloudFront.

Ответить или комментировать

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