Как мы получили идеальный PageSpeed на CimpleO.com

Reading time: 3 minutes

Last modified:

Сайт был медленным. Мобильный PageSpeed — 45, десктоп — 68. Вот что мы изменили, чтобы добраться до 98 и 100.

Исходное состояние

PageSpeed Insights до оптимизации — Mobile 45, Desktop 68
  • Мобильный рейтинг: 45/100
  • Десктопный рейтинг: 68/100
  • Largest Contentful Paint (LCP): 3,2 с (требовал улучшения)
  • Cumulative Layout Shift (CLS): 0,18 (требовал улучшения)
  • Блокирующие ресурсы: несколько CSS и JavaScript файлов, блокирующих рендеринг

1. Инлайнинг критического CSS

Блокирующий CSS существенно замедлял First Contentful Paint (FCP) и LCP. Вот как мы это устранили:

<!-- Инлайн критического CSS в head -->
<style id="critical-css">
  /* Критические стили для контента выше сгиба */
  .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
  body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; margin: 0; line-height: 1.6; color: #333; }
  .main-banner { position: relative; min-height: 100vh; display: flex; align-items: center; overflow: hidden; }
  /* Дополнительные критические стили */
</style>

<!-- Асинхронная загрузка некритического CSS -->
<link rel="preload" href="/css/main.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/css/main.css"></noscript>

2. Оптимизация шрифтов

Шрифты были ещё одним серьёзным узким местом. Мы применили следующие оптимизации:

<!-- Предзагрузка критических шрифтов -->
<link rel="preload" href="/fonts/Inter-Regular.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://fonts.googleapis.com/css2?family=Russo+One&display=swap" as="style">

<!-- Загрузка шрифтов с font-display: swap -->
<style>
  @font-face {
    font-family: 'Inter';
    src: url('/fonts/Inter-Regular.woff2') format('woff2'),
         url('/fonts/Inter-Regular.woff') format('woff');
    font-weight: 400;
    font-style: normal;
    font-display: swap;
  }
  
  @font-face {
    font-family: 'Inter';
    src: url('/fonts/Inter-SemiBold.woff2') format('woff2'),
         url('/fonts/Inter-SemiBold.woff') format('woff');
    font-weight: 600;
    font-style: normal;
    font-display: swap;
  }
</style>

3. Resource Hints и предзагрузка

Мы добавили resource hints для ускорения установки соединения с критическими сторонними доменами:

<!-- DNS Prefetching -->
<link rel="dns-prefetch" href="https://www.googletagmanager.com" />
<link rel="dns-prefetch" href="https://fonts.gstatic.com" />

<!-- Preconnect к критическим доменам -->
<link href="https://www.googletagmanager.com" rel="preconnect" crossorigin />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>

<!-- Предзагрузка критических ресурсов -->
<link rel="preload" as="image" href="/assets/awards/clutch_global_b2b_fall_2023-2x.webp" 
  imagesrcset="/assets/awards/clutch_global_b2b_fall_2023-2x.webp 1x, /assets/awards/clutch_global_b2b_fall_2023-2x.png 1x" 
  imagesizes="200px">

4. Оптимизация JavaScript

Мы пересмотрели стратегию загрузки JavaScript, чтобы минимизировать блокировку рендеринга:

<!-- Defer для некритичного JS -->
<script src="/js/main.js" defer></script>

<!-- Загрузка несущественных скриптов после загрузки страницы -->
<script>
  window.addEventListener('load', function() {
    // Загрузка некритичных скриптов
    const scripts = [
      'https://www.googletagmanager.com/gtag/js?id=G-4K42YN9T11',
      '/js/analytics.js'
    ];
    
    scripts.forEach(src => {
      const script = document.createElement('script');
      script.src = src;
      script.async = true;
      document.body.appendChild(script);
    });
  });
</script>

5. Оптимизация изображений

Мы внедрили адаптивные изображения и современные форматы:

<picture>
  <source 
    srcset="/images/hero-640w.webp 640w,
            /images/hero-1024w.webp 1024w,
            /images/hero-1920w.webp 1920w"
    sizes="100vw"
    type="image/webp">
  <img 
    src="/images/hero-1920w.jpg" 
    alt="CimpleO - Your Technology Partner"
    width="1920" 
    height="1080"
    loading="eager"
    decoding="async">
</picture>

6. Структурированные данные и метаданные

Мы доработали структурированные данные для улучшения SEO и rich results:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "CimpleO",
  "url": "https://cimpleo.com",
  "logo": "https://cimpleo.com/images/logo.png",
  "sameAs": [
    "https://www.linkedin.com/company/cimpleo",
    "https://github.com/cimpleo"
  ]
}
</script>

Результаты

После внедрения всех оптимизаций:

PageSpeed Insights после оптимизации — Mobile 98, Desktop 100
Метрика До После
Мобильный рейтинг 45/100 98/100
Десктопный рейтинг 68/100 100/100
LCP 3,2 с 1,1 с
CLS 0,18 0,02
TTI 5,4 с 1,9 с

Постоянный мониторинг

Мы запускаем проверки Lighthouse CI на каждом деплое и отслеживаем Core Web Vitals на реальных пользовательских сессиях. PageSpeed-оценки смещаются при изменении контента — новое изображение, дополнительный скрипт, более тяжёлый шрифт — поэтому автоматические проверки ловят деградацию до того, как она накапливается.

Те же техники применимы к любому Hugo-сайту или статическому сайту. Если ваши PageSpeed-оценки в диапазоне 40–70 и вы хотите понять, что их сдерживает, напишите нам на hello@cimpleo.com.

Table of Contents