Webサイトの表示速度が遅い、ユーザーがクリックしても反応しない、ページがカクカクする…こんな経験はありませんか?これらの問題の多くは、「メインスレッドでタスクが長時間実行されている」ことが原因です。
PageSpeed InsightsやLighthouseで「メインスレッドでタスクが長時間実行されないようにしてください」という警告を見たことがある方も多いでしょう。でも実際のところ、「メインスレッドって何?」「どうやって改善すればいいの?」と疑問に思う方がほとんどだと思います。
この記事では、メインスレッドの基本概念から具体的な改善方法まで、初心者の方でも理解できるよう詳しく解説していきます。表示速度の改善は、ユーザー体験の向上だけでなく、SEO効果や離脱率の改善にも直結する重要なポイントです。
目次
メインスレッドとは?基本概念を理解しよう
メインスレッドの役割
メインスレッドとは、簡単に言えばWebブラウザの「司令塔」のような存在です。WebページがブラウザーでHTMLを解析し、CSSでスタイルを適用し、JavaScriptを実行するという一連の作業を統括しています。
具体的には、メインスレッドは以下のような重要な処理を担当しています:
- HTMLの解析とDOM構築
- CSSの解析とスタイル計算
- JavaScriptの実行
- レイアウトの計算
- 画面への描画
- ユーザーからの入力(クリック、タップ、スクロール等)への応答
なぜメインスレッドがブロックされるのか
メインスレッドは一度に一つのタスクしか処理できません。これは、料理人が一人しかいないキッチンで複数の料理を作ろうとしている状況に似ています。一つの料理(タスク)に時間がかかりすぎると、他の料理(タスク)が待たされてしまいます。
Webページでは、重いJavaScriptの処理やサードパーティのスクリプトなどが長時間実行されると、メインスレッドが「ブロック」された状態になります。この間、ユーザーがボタンをクリックしても、スクロールしても、ページは反応しません。
50ミリ秒の重要性
Googleは、50ミリ秒を超えるタスクを「長時間タスク」として定義しています。これは人間の知覚に基づいた基準で、50ミリ秒以内であればユーザーは遅延を感じにくいとされています。
逆に言えば、50ミリ秒を超えるタスクが連続して実行されると、ユーザーは「サイトが重い」「反応が悪い」と感じてしまうのです。
長時間タスクがWebサイトに与える影響
ユーザー体験への悪影響
長時間タスクの最も直接的な影響は、ユーザー体験の悪化です。具体的には:
応答性の低下 ユーザーがボタンをクリックしたり、フォームに入力したりしても、すぐに反応しない状態が続きます。これにより、ユーザーは「サイトが壊れているのかな?」と不安になったり、複数回クリックしてしまったりします。
視覚的な問題 スクロールがカクカクしたり、アニメーションが滑らかでなくなったりします。特にスマートフォンでは、スクロールの滑らかさは重要な要素です。
読み込み時間の増加 ページが完全に使用可能になるまでの時間が長くなります。これにより、ユーザーの離脱率が増加する可能性があります。
SEOへの影響
Googleは2021年にCore Web Vitalsを検索ランキングの要因として導入しました。長時間タスクは、以下のCore Web Vitals指標に直接影響します:
FID(First Input Delay) ユーザーの最初の操作に対する応答時間です。メインスレッドがブロックされていると、この値が悪化します。
INP(Interaction to Next Paint) 2024年3月にFIDに代わって導入された指標で、ユーザーの操作に対する応答性を測定します。
TBT(Total Blocking Time) FCPとTTIの間でメインスレッドがブロックされている時間の合計です。この指標が高いと、サイトの評価が下がる可能性があります。
離脱率への影響
Googleの調査によると、モバイルサイトの読み込みに3秒以上かかると、53%のユーザーがサイトから離脱するとされています。長時間タスクは読み込み時間の増加に直結するため、ビジネスにとって重要な損失となる可能性があります。
PageSpeed InsightsとLighthouseで問題を発見する方法
PageSpeed Insightsでの確認方法
PageSpeed Insightsは、Googleが無料で提供している表示速度分析ツールです。URLを入力するだけで、サイトのパフォーマンスを詳細に分析できます。
手順:
- PageSpeed Insights(https://pagespeed.web.dev/)にアクセス
- 分析したいURLを入力
- 「分析」ボタンをクリック
- 結果が表示されるまで待機(通常30秒〜1分程度)
結果画面で「メインスレッドでタスクが長時間実行されないようにしてください」という項目が表示されている場合、サイトに長時間タスクの問題があることを示しています。
Lighthouseでの詳細分析
Lighthouseは、Chrome DevToolsに組み込まれているパフォーマンス分析ツールです。PageSpeed Insightsよりも詳細な情報を取得できます。
手順:
- Chromeブラウザで対象サイトを開く
- F12キーを押してDevToolsを開く
- 「Lighthouse」タブを選択
- 「Generate report」をクリック
Lighthouseでは、具体的にどのスクリプトが長時間実行されているかを詳細に確認できます。
問題の特定方法
分析結果で注目すべきポイントは以下の通りです:
TBT(Total Blocking Time)の数値
- 200ms以下:良好
- 200ms-600ms:改善が必要
- 600ms以上:不良
長時間タスクの一覧 具体的にどのスクリプトやリソースが問題となっているかが表示されます。
具体的な改善方法
1. JavaScriptの最適化
JavaScriptの最適化は、長時間タスクの解決において最も効果的な方法の一つです。
コード分割(Code Splitting) 大きなJavaScriptファイルを小さな単位に分割することで、メインスレッドの負荷を分散できます。
Copy// 悪い例:一つの大きな関数
function processLargeData() {
for (let i = 0; i < 100000; i++) {
// 重い処理
}
}
// 良い例:処理を分割
async function processLargeDataOptimized() {
for (let i = 0; i < 100000; i += 1000) {
// 1000件ずつ処理
await new Promise(resolve => setTimeout(resolve, 0));
}
}
scheduler.yield()の活用 最新のブラウザでは、scheduler.yield()を使用してメインスレッドを効率的に開放できます。
Copyasync function heavyTask() {
for (let i = 0; i < items.length; i++) {
processItem(items[i]);
// 定期的にメインスレッドを開放
if (i % 100 === 0) {
await scheduler.yield();
}
}
}
Web Workersの活用 重い計算処理をメインスレッドから分離することで、UI応答性を維持できます。
Copy// メインスレッド
const worker = new Worker('calculation-worker.js');
worker.postMessage({data: largeDataSet});
worker.onmessage = function(e) {
console.log('計算結果:', e.data);
};
// calculation-worker.js
self.onmessage = function(e) {
const result = performHeavyCalculation(e.data);
self.postMessage(result);
};
2. サードパーティスクリプトの最適化
多くのWebサイトでは、Google Analytics、SNSウィジェット、広告スクリプトなどのサードパーティスクリプトを使用しています。これらは便利ですが、パフォーマンスに大きな影響を与える可能性があります。
不要なスクリプトの削除 まずは本当に必要なスクリプトかどうかを見直しましょう。使用していないSNSシェアボタンや、効果が不明な分析ツールは削除を検討してください。
遅延読み込み(Lazy Loading) すぐに必要でないスクリプトは、ユーザーが操作したタイミングで読み込むように設定できます。
Copy// ユーザーが操作した時にだけ読み込む
document.addEventListener('click', function() {
if (!window.analyticsLoaded) {
loadAnalyticsScript();
window.analyticsLoaded = true;
}
}, { once: true });
非同期読み込みの活用 スクリプトタグにasyncやdeferを追加することで、メインスレッドのブロックを防げます。
Copy<!-- 非同期読み込み -->
<script async src="analytics.js"></script>
<!-- 遅延読み込み -->
<script defer src="widget.js"></script>
3. CSS最適化
CSSも長時間タスクの原因になることがあります。特に、複雑なセレクターや大量のスタイル計算が問題となります。
重要なCSSのインライン化 ファーストビューで必要な最小限のCSSは、HTMLに直接記述することで読み込み時間を短縮できます。
Copy<style>
/* ファーストビューに必要な最小限のCSS */
.hero-section {
background: #f0f0f0;
padding: 20px;
}
</style>
セレクターの最適化 複雑なCSSセレクターは、ブラウザの処理時間を増加させます。
Copy/* 非効率な例 */
.container .content .article .title h1 {
color: blue;
}
/* 効率的な例 */
.article-title {
color: blue;
}
4. 画像最適化
画像は直接メインスレッドをブロックしませんが、読み込み時間やレイアウトシフトを通じて間接的に影響を与えます。
次世代画像フォーマットの活用 WebPやAVIFなどの次世代フォーマットを使用することで、ファイルサイズを大幅に削減できます。
Copy<picture>
<source srcset="image.avif" type="image/avif">
<source srcset="image.webp" type="image/webp">
<img src="image.jpg" alt="サンプル画像">
</picture>
適切なサイズの画像を使用 表示サイズに対して過度に大きな画像を使用しないよう注意しましょう。
5. リソースの最適化
HTTPリクエストの最小化 CSS、JavaScriptファイルを結合することで、リクエスト数を削減できます。
キャッシュ設定の最適化 適切なキャッシュヘッダーを設定することで、再訪問時の読み込み時間を短縮できます。
Copy# .htaccess
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
</IfModule>
具体的な改善事例
事例1:ECサイトの商品一覧ページ
問題: 商品データの読み込みに時間がかかり、TBTが800msに達していました。
解決策:
- 商品データの取得を非同期化
- 仮想スクロールを実装し、表示される商品のみを描画
- 商品画像の遅延読み込みを実装
結果: TBTが800msから150msに改善され、ユーザーの操作に対する応答性が大幅に向上しました。
事例2:コーポレートサイトのトップページ
問題: 多数のサードパーティスクリプト(分析ツール、チャットボット、SNSウィジェット)により、TBTが600msを超えていました。
解決策:
- 不要な分析ツールを削除
- チャットボットの読み込みを遅延化
- SNSウィジェットを軽量版に変更
結果: TBTが600msから180msに改善され、ページの読み込み体験が大幅に向上しました。
事例3:ブログサイト
問題: 記事内の多数の画像と、重いJavaScriptライブラリにより、モバイルでのTBTが1000ms以上となっていました。
解決策:
- 画像の最適化(WebP化、適切なサイズ調整)
- JavaScriptライブラリの軽量化
- 重要でないスクリプトの遅延読み込み
結果: TBTが1000msから200msに改善され、特にモバイルでの読み込み体験が劇的に向上しました。
高速化ツールの活用
自動最適化ツール
手動での最適化は時間がかかりますが、自動最適化ツールを使用することで効率的に改善できます。
Webサイトの表示速度改善をお考えの場合、LandingHub(https://www.landinghub.net/)のような高速化ツールの活用も検討してみてください。これらのツールは、画像の最適化、CSSやJavaScriptの最適化、キャッシュ設定などを自動化し、専門知識がなくても効果的な改善を実現できます。
WordPress向けプラグイン
WordPressサイトの場合、以下のようなプラグインが効果的です:
WP Rocket
- JavaScriptの最適化
- 画像の遅延読み込み
- キャッシュ機能
Autoptimize
- CSS、JavaScriptの最適化
- HTML最適化
- 画像最適化
EWWW Image Optimizer
- 画像の自動最適化
- 次世代フォーマット対応
- 遅延読み込み機能
モニタリングと継続的改善
定期的なパフォーマンス測定
Webサイトのパフォーマンスは、コンテンツの追加や機能の更新により変化します。定期的な測定を行い、問題を早期発見することが重要です。
推奨測定頻度:
- 新機能リリース後:必須
- 月次:推奨
- 四半期:最低限
測定すべき指標
Core Web Vitals
- LCP(Largest Contentful Paint)
- FID(First Input Delay)/INP(Interaction to Next Paint)
- CLS(Cumulative Layout Shift)
その他の重要指標
- TBT(Total Blocking Time)
- FCP(First Contentful Paint)
- TTI(Time to Interactive)
改善効果の追跡
改善施策の効果を適切に測定し、継続的な改善につなげましょう。
追跡すべき指標:
- パフォーマンス指標の変化
- ユーザー行動の変化(離脱率、滞在時間など)
- ビジネス指標への影響(コンバージョン率、売上など)
まとめ
「メインスレッドでタスクが長時間実行されないようにしてください」という警告は、単なる技術的な問題ではなく、ユーザー体験とビジネス成果に直接影響する重要な課題です。
この記事で解説した改善方法を実践することで、以下のような効果が期待できます:
- ユーザー体験の大幅な改善
- SEOランキングの向上
- 離脱率の減少
- コンバージョン率の向上
改善は一度きりの作業ではなく、継続的なプロセスです。定期的な測定と最適化を通じて、常に最高のユーザー体験を提供できるWebサイトを維持していきましょう。
技術的な知識がない場合でも、専門の高速化ツールやプラグインを活用することで、効果的な改善が可能です。まずは現在のサイトの状況を測定し、最も効果的な改善策から実装していくことをお勧めします。
Webサイトの表示速度改善は、今や必須の取り組みとなっています。ユーザーのために、そしてビジネスの成功のために、ぜひ積極的に取り組んでいきましょう。