セットアップ
2つのパッケージの役割
@riebeckite/plugin-analytics
Riebeckite のサイト側で動くプラグインです。主に次の機能を提供します。
- 計測対象のコンテンツを識別する
- ブラウザから
page_viewを送信する AnalyticsProviderの取り決めを定める- アクセス解析のクエリの取り決めを定める
Cloudflare、D1、KV、特定のデータベースには依存しません。
@riebeckite/analytics-cloudflare
Cloudflare 上でアクセス解析のイベントを受け取る、独立した Worker パッケージです。主に次の機能を提供します。
- イベントの受信
- リクエストの検証
- CORS
- レート制限
- D1 / KV への保存
- ページビューを読み取る API
Riebeckiteサイト
→ @riebeckite/plugin-analytics
Analytics Worker
→ @riebeckite/analytics-cloudflare
計測の仕組み
ページビューは、コンテンツに付けた**安定したコンテンツ ID**を基準に記録します。URL が変わっても、同じ記事を同じコンテンツとして扱いたいためです。
Diagram source
sequenceDiagram
participant C as コンテンツ
participant B as ビルド
participant S as 静的サイト
participant Browser as ブラウザ
participant W as Analytics Worker
C->>B: 安定したコンテンツID
B->>S: data-riebeckite-content-id
Browser->>S: ページの読み込み
Browser->>Browser: initAnalytics
Browser->>W: POST /events
計測は大きく3つの段階に分かれます。
1. コンテンツIDを付ける
計測対象の記事には、Frontmatter で安定した id を指定します。
---
id: guide-1
---
この ID は記事を識別するための値です。URL を変更しても同じコンテンツとして扱いたい場合があるため、/old-guide と /new-guide のような URL をアクセス解析の識別子には使いません。詳しくは[コンテンツシステム](../../framework/content-system/identity.ja.md#安定したコンテンツ id)を参照してください。
2. ビルド時に目印を埋め込む
ビルド時に、安定したコンテンツ ID を持つ公開エントリには隠し要素が追加されます。
<span
hidden
data-riebeckite-content-id="guide-1"
></span>
ブラウザ側のアクセス解析は、この目印からコンテンツ ID を取得します。
3. ブラウザからイベントを送る
initAnalytics は文書ごとに一度だけ実行されます。コンテンツ ID を取得すると、設定された collectorUrl へ page_view イベントを JSON で送信します。
{
"type": "page_view",
"contentId": "guide-1",
"occurredAt": "2026-01-01T00:00:00.000Z",
"path": "/guide",
"lang": "en"
}
識別子として使われるのは contentId だけです。path と lang は補助情報です。安定したコンテンツ ID を持たないコンテンツは計測されません。
ページビューの数え方
初回のページ表示では、initAnalytics が実行され、page_view を1件送ります。
ページの読み込み
↓
initAnalytics
↓
page_view × 1
その後は、初回のページ読み込みごと、および成功した SPA のページ移動ごとに1件の page_view を送ります。
サイト側の設定
サイトでは @riebeckite/plugin-analytics を設定します。
import {
analytics,
MemoryAnalyticsProvider,
} from "@riebeckite/plugin-analytics";
export default defineConfig({
// ...
plugins: [
analytics({
provider:
new MemoryAnalyticsProvider(),
publicConfig: {
collectorUrl:
"https://analytics.example.com/events",
},
}),
],
});
主な設定は provider と publicConfig.collectorUrl の2つです。
provider
provider は、AnalyticsProvider の取り決めを実装した実行環境です。プロバイダーは capabilities、capture、query を提供します。
認証情報やストレージのバインディングのような非公開情報は、プロバイダーの内部に保持してください。ブラウザへ渡してはいけません。
publicConfig.collectorUrl
collectorUrl は、ブラウザがイベントを送信する URL です。
publicConfig: {
collectorUrl:
"https://analytics.example.com/events",
}
指定できるのは、サイトからの相対パスか、JSON の POST を受け付ける HTTPS URL です。平文 HTTP は localhost だけで許可されます。
publicConfig は名前のとおりブラウザへ公開されます。秘密情報を含めないでください。
MemoryAnalyticsProvider
MemoryAnalyticsProvider は、テストとローカルでの試用向けです。本番環境でデータを永続的に保存する用途には使わないでください。本番では、Cloudflare Worker などの実際の収集先を使用します。
設定の検証
アクセス解析プラグインのオプションも、通常のプラグイン設定の検証対象です。provider や collectorUrl が不正でないかは、次のコマンドで確認できます。
pnpm exec riebeckite check
pnpm exec riebeckite doctor
AnalyticsProviderの役割
AnalyticsProvider は、プロバイダーがどのアクセス解析機能に対応しているかを capabilities で宣言します。主な対応機能は capture、content_page_views、popular_content です。
イベントの保存
await provider.capture(event);
capture はページビューのイベントを保存します。
コンテンツのページビュー取得
await provider.query({
type: "content_page_views",
contentId: "guide-1",
timeRange: {
from:
"2026-01-01T00:00:00.000Z",
},
});
特定のコンテンツの合計ページビューを取得します。期間は任意です。
人気コンテンツの取得
await provider.query({
type: "popular_content",
limit: 10,
});
ページビューをもとにしたランキングを取得します。limit と期間は任意です。
未対応のクエリ
プロバイダーが対応していないクエリには、UnsupportedAnalyticsQueryError を投げます。独自のプロバイダーを実装する場合は、assertAnalyticsQuerySupported(provider, query) を利用してください。
assertAnalyticsQuerySupported(
provider,
query,
);
対応機能とクエリのヘルパーは、パッケージのルートからエクスポートされています。