非同期データ送信のメソッドである`sendBeacon()`の使い方について、実践的なコード例を交えながら解説します。
sendBeacon()とは
`sendBeacon()`は、WebブラウザのNavigator APIが提供する非同期データ送信メソッドです。主にユーザーがページを離れる際のアクセス解析データの送信などに使用されます。
通常のXHR(XMLHttpRequest)やFetch APIと異なり、ページ遷移やブラウザ終了時でもバックグラウンドでデータ送信を完了できる特徴があります。
基本的な使い方
navigator.sendBeacon(url, data);- `url`: データを送信する宛先のURL(文字列)
- `data`: 送信するデータ(文字列、Blob、FormData等)
実装例
基本的な実装
// 文字列データを送信
const data = "sample_data";
navigator.sendBeacon('/api/analytics', data);
// JSONデータを送信
const jsonData = {
eventType: 'pageExit',
timestamp: new Date().toISOString()
};
navigator.sendBeacon('/api/analytics', JSON.stringify(jsonData));ページ離脱時のデータ送信
window.addEventListener('unload', function() {
const analyticsData = {
pageId: 'home',
sessionTime: calculateSessionTime(),
userAgent: navigator.userAgent
};
navigator.sendBeacon('/api/analytics', JSON.stringify(analyticsData));
});FormDataを使用した送信
const formData = new FormData();
formData.append('eventType', 'userAction');
formData.append('timestamp', new Date().toISOString());
navigator.sendBeacon('/api/collect', formData);ブラウザ対応確認
`sendBeacon()`をサポートしていないブラウザのためのフォールバック実装も重要です。
function sendAnalytics(url, data) {
if (navigator.sendBeacon) {
return navigator.sendBeacon(url, data);
}
// フォールバック:同期的なXHR
const xhr = new XMLHttpRequest();
xhr.open('POST', url, false);
xhr.send(data);
}実践的なユースケース
アクセス解析の実装例
class Analytics {
static trackPageView() {
const data = {
type: 'pageview',
url: window.location.href,
referrer: document.referrer,
timestamp: new Date().toISOString()
};
navigator.sendBeacon('/analytics', JSON.stringify(data));
}
static trackEvent(category, action) {
const data = {
type: 'event',
category,
action,
timestamp: new Date().toISOString()
};
navigator.sendBeacon('/analytics', JSON.stringify(data));
}
}
// 使用例
Analytics.trackPageView();
Analytics.trackEvent('button', 'click');注意点
1. 送信データのサイズ制限があります(ブラウザによって異なる)
2. レスポンスを受け取ることはできません
3. HTTP POSTメソッドのみ使用可能です
4. CORSの制限は通常のXHRと同様に適用されます
まとめ
`sendBeacon()`は、特にページ離脱時のデータ送信に最適なメソッドです。実装が簡単で、ユーザー体験を損なうことなくデータを確実に送信できる利点があります。アクセス解析やログ収集などのユースケースで積極的に活用することをお勧めします。