Skip to content
⚠️ This article was written in 2020. Some content may be outdated.

Web Vitals コアパフォーマンス指標の詳解

Web Vitals の中核となるパフォーマンス指標の詳解について、多くの開発者は API 呼び出しのレイヤーにとどまっている。本記事では本番環境の視点から、実際に直面する問題とその解決策を議論する。

基本原理 ​

これをベースにさらに最適化できる:

javascript
const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    if (entry.entryType === 'largest-contentful-paint') {
      reportMetric('LCP', entry.startTime)
    }
    if (entry.entryType === 'first-input') {
      reportMetric('FID', entry.processingStart - entry.startTime)
    }
  }
})
observer.observe({ entryTypes: ['largest-contentful-paint', 'first-input'] })

このパターンは大規模なプロジェクトで非常に実用的で、保守コストを大幅に下げられる。

高度な機能 ​

実際のプロジェクトでは使い方はもう少し複雑になる:

javascript
const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    if (entry.entryType === 'largest-contentful-paint') {
      reportMetric('LCP', entry.startTime)
    }
    if (entry.entryType === 'first-input') {
      reportMetric('FID', entry.processingStart - entry.startTime)
    }
  }
})
observer.observe({ entryTypes: ['largest-contentful-paint', 'first-input'] })

この方法により、コードのテスタビリティと拡張性の両方が向上する。

プロジェクト実践 ​

以下に完全なサンプルを示す:

javascript
const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    if (entry.entryType === 'largest-contentful-paint') {
      reportMetric('LCP', entry.startTime)
    }
    if (entry.entryType === 'first-input') {
      reportMetric('FID', entry.processingStart - entry.startTime)
    }
  }
})
observer.observe({ entryTypes: ['largest-contentful-paint', 'first-input'] })

境界条件の処理に注意すること。これは本番環境では極めて重要だ。

ベストプラクティス ​

重要なのはコアとなるロジックを理解することだ:

javascript
const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    if (entry.entryType === 'largest-contentful-paint') {
      reportMetric('LCP', entry.startTime)
    }
    if (entry.entryType === 'first-input') {
      reportMetric('FID', entry.processingStart - entry.startTime)
    }
  }
})
observer.observe({ entryTypes: ['largest-contentful-paint', 'first-input'] })

パフォーマンス最適化は具体的なシナリオに応じて行う必要があり、すべてのケースで過度な最適化が必要なわけではない。

ハマりやすい注意点 ​

以下のアプローチで改善できる:

javascript
const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    if (entry.entryType === 'largest-contentful-paint') {
      reportMetric('LCP', entry.startTime)
    }
    if (entry.entryType === 'first-input') {
      reportMetric('FID', entry.processingStart - entry.startTime)
    }
  }
})
observer.observe({ entryTypes: ['largest-contentful-paint', 'first-input'] })

このアプローチは本番環境で半年以上安定稼働しており、実際に検証済みだ。

まとめ ​

  • Web Vitals の中核となるパフォーマンス指標の詳解は銀の弾丸ではなく、プロジェクトの規模と技術スタックに応じて選択する必要がある
  • API を覚えることよりも、背後にある原理を理解することが重要だ
  • 本番環境で使う前には必ず互換性の検証を行うこと
  • チームでの合意とドキュメントは、技術そのものよりも重要だ

MIT Licensed