UniApp ミニアプリ JavaScript SDK パフォーマンス問題分析¶
本ドキュメントでは、@cloudcare/rum-uniapp 2.2.21 以降が収集するページパフォーマンスフィールドと、それらを使って初回レンダリングの遅延やページ退出前の未レンダリングなどの白画面候補問題を識別する方法について説明します。
このドキュメントは UniApp ミニアプリ JavaScript SDK を対象としており、
GCUniPlugin-*ネイティブモジュールには適用されません。すべての所要時間フィールドは、Guance に報告されるときにナノ秒(ns)に統一されます。
収集範囲¶
SDK は以下のパフォーマンスシグナルを収集できます。
- ページロード、
onReady、初回レンダリング、FP、FCP、LCP - ページ退出前に
onReadyまたはプラットフォームの初回レンダリングシグナルがトリガーされたかどうか setDataの回数、累計所要時間、最大所要時間、待機所要時間、更新所要時間、マージ回数- 起動試行、ネイティブ起動、スクリプト実行、コードパッケージダウンロード
- 遅いページに関連付けられた Resource および Error データ
SDK はスクリーンショットを収集せず、ビジネススケルトンスクリーン後のコアコンテンツが利用可能かどうかを判断することもできません。そのため、いずれかのパフォーマンスフィールドが欠落していても、直接白画面と等価になるわけではありません。
プラットフォームパフォーマンスデータ¶
SDK は可能な限りミニアプリプラットフォームが提供する Performance API を使用します。Observer が正常にサブスクライブされた場合、performance_supported=true となります。プラットフォームが同時に利用可能な初回レンダリングシグナルを提供する場合、first_render_supported=true となります。
微信と互換プラットフォーム¶
微信形式のエントリは、以下の指標に直接マッピングされます。
| Performance entry | RUM フィールド |
|---|---|
navigation.duration |
loading_time |
render:firstRender.duration |
first_render_time |
render:firstPaint.startTime - navigationStart |
page_fp |
render:firstContentfulPaint.startTime - navigationStart |
page_fcp |
render:largestContentfulPaint.startTime - navigationStart |
page_lcp |
コールドスタート時の appLaunch と通常の route navigation の両方で、ファーストビューページの識別が可能です。SDK は route、pageId、最新の navigationStart に基づいて現在のページインスタンスを選択します。paint が navigation より先に到着した場合は一時保存され、entry の絶対 startTime が所要時間として誤って扱われることを防ぎます。
抖音ミニアプリ¶
抖音は paint、evaluate、navigation、resource、launch のエントリを使用します。SDK はまず統一口径に変換します。
| 抖音エントリ | 統一口径 |
|---|---|
paint:first-paint |
page_fp、first_render_time |
paint:first-contentful-paint |
page_fcp |
paint:largest-contentful-paint |
page_lcp |
evaluate:app-service |
action_type=script_insert |
resource:miniprogram-package |
action_type=package_download |
抖音には微信の firstRender エントリがないため、SDK は現在のページの first-paint - navigationStart をそのプラットフォームの初回レンダリングシグナルとして使用します。この口径は FCP またはビジネスコンテンツの可用性と同等ではありません。
View パフォーマンスフィールド¶
機能とライフサイクル属性¶
| フィールド | 型 | 説明 |
|---|---|---|
performance_supported |
boolean | 現在のプラットフォームの Performance Observer が正常にサブスクライブされたかどうか |
first_render_supported |
boolean | 現在のプラットフォームに SDK が利用可能な初回レンダリングシグナルが存在するかどうか |
view_start_reason |
string | page_load、page_show、または session_renewal |
view_end_reason |
string | onHide、onUnload、または session_renewal |
ready_reached |
boolean | 現在のページのライフサイクルが onReady に到達したかどうか |
first_render_reached |
boolean | 現在のページがプラットフォームの初回レンダリングシグナルを受信したかどうか |
ended_before_ready |
boolean | page_load View の終了時にまだ onReady に到達していないかどうか |
ended_before_render |
boolean | 初回レンダリングシグナルがサポートされている場合、page_load View が初回レンダリング前に終了したかどうか |
view_is_active |
boolean | View がまだアクティブ状態かどうか |
ended_before_render は、first_render_supported=true の場合にのみ統計的に意味を持ちます。セッション更新は RUM View を分割するだけで、ページの再読み込みを意味しないため、ページの早期退出の結論は生成されません。
レンダリング所要時間¶
| フィールド | 説明 |
|---|---|
loading_time |
ページ navigation とライフサイクルで観測された最大ロード所要時間 |
page_ready_time |
View 開始から onReady までの所要時間 |
first_render_time |
微信:firstRender.duration;抖音:first-paint - navigationStart |
page_fp |
現在のページの navigationStart に対する FP の相対所要時間 |
page_fcp |
現在のページの navigationStart に対する FCP の相対所要時間 |
page_lcp |
現在のページの最新の LCP の navigationStart に対する相対所要時間 |
first_render_data_transfer_time |
初回レンダリング初期化データの受信時間から送信時間を引いた値 |
first_render_wait_time |
データ受信完了からビュー層のレンダリング開始までの待機時間 |
first_render_view_layer_time |
ビュー層の初回レンダリング所要時間 |
first_paint_time と first_render_time は互換フィールドであり、いずれも SDK が選択した初回レンダリングシグナルを表します。実際の FP を分析する必要がある場合は page_fp を使用してください。
setData 所要時間¶
| フィールド | 説明 |
|---|---|
view_setdata_count |
有効な setData 更新サンプル数 |
view_setdata_duration |
すべての有効な更新の累計所要時間 |
view_setdata_max_duration |
単一更新の最大所要時間 |
view_setdata_pending_duration |
キューに入ってから更新が開始されるまでの累計待機時間 |
view_setdata_update_duration |
更新開始から終了までの累計実行時間 |
view_setdata_merged_count |
プラットフォームによってマージ処理された更新回数 |
SDK は、リスナーインストール時の所属ページを記録します。非表示のページや古いコンポーネントの遅延コールバックは現在の View に計上されず、ページがアンロードされたりコンポーネントが分離されたりすると、リスニングを停止します。
起動段階の指標¶
起動段階は action データとして報告されます。
action_type |
説明 |
|---|---|
launch_attempt |
最初の App.onLaunch 到達。SDK インスタンスごとに 1 回。duration は書き込まれず、app_launch_attempt=true を有効フィールドとして使用 |
launch |
プラットフォームの appLaunch navigation duration |
script_insert |
スクリプト実行所要時間 |
package_download |
ミニアプリコードパッケージのダウンロード所要時間 |
最後の 3 つはプラットフォームの Performance entry に依存します。launch / launch_attempt 比率を使用してネイティブ起動指標のカバレッジを観察することを推奨します。エントリがないことをゼロ所要時間と見なさないでください。
白画面候補統計¶
白画面分析は、カバレッジ、遅延レンダリング、早期退出の 3 つのカテゴリに分割することを推奨します。
統計サンプル¶
まず以下の条件でフィルタリングします。
初回レンダリングシグナルをサポートしていないプラットフォームは、カバレッジを個別に統計し、ended_before_render の分母に含めないでください。
推奨口径¶
| 問題 | 推奨条件 | 説明 |
|---|---|---|
| 遅延初回レンダリング | first_render_time がビジネスしきい値を超えている |
P75、P95、およびしきい値超過割合の統計に適している |
| 退出前に初回レンダリング未実行 | ended_before_render=true |
信頼度の高い白画面候補だが、ユーザーが素早く戻る操作を行った場合にも該当する |
| 長時間 Ready 未到達 | page_ready_time がしきい値を超えている |
ページライフサイクルまたは初期化のブロッキングを反映。視覚的な白画面と同等ではない |
| 退出前に Ready 未到達 | ended_before_ready=true |
view_end_reason と滞在時間を組み合わせて、素早い離脱を除外する必要がある |
| FCP/LCP が遅い | page_fcp または page_lcp がしきい値を超えている |
コンテンツ出現時間および主要コンテンツ安定時間により近い |
推奨ダッシュボードには少なくとも以下を含めてください。
- Performance と初回レンダリングシグナルのカバレッジ
- FP、FCP、LCP、firstRender の P50、P75、P95
ended_before_render、ended_before_readyの割合- 遅い View の Error、失敗 Resource、
5xx、TTFB の分布 - アプリケーションバージョン、プラットフォーム、OS、デバイスモデルで分割したトレンド
既知の制限¶
- SDK にはビジネス向けの
markViewReady()API がなく、コアビジネスコンテンツが利用可能であることを確認できません。 - Page の
onLoad前に発生する致命的なエラーには View Context がない可能性があります。 - 現在、Long Task、FPS、ページフリーズ、スクリーンショットは収集しません。
- プラットフォームの Performance API、ベースライブラリ、OS バージョンの違いにより、フィールドのカバレッジが影響を受ける可能性があります。
- データ送信失敗時のリトライやローカル永続化がない場合、脆弱なネットワーク環境で問題の割合が過小評価される可能性があります。