如何跟踪网站的离线使用情况,以便说明网站为何需要更好的离线体验。
了解如何跟踪网站的离线使用情况,以便说明网站为何需要更好的离线模式。了解在实现离线使用情况分析时应避免哪些陷阱和问题。
在线和离线浏览器事件的陷阱
跟踪离线使用情况的显而易见的解决方案是为
online和
offline
事件(许多浏览器都支持这些事件)
创建事件监听器,并将分析跟踪逻辑放入这些监听器中。遗憾的是,这种方法存在几个问题和限制:
- 一般来说,跟踪每个网络连接状态事件可能过于频繁,并且在以隐私为中心的世界中,应尽可能少地收集数据,因此这种做法适得其反。此外,
online和offline事件可能会在网络丢失的一瞬间触发,用户可能甚至看不到或注意到这一点。 - 离线活动的分析跟踪不会到达分析服务器。
- 当用户离线时在本地跟踪时间戳,并在用户重新上线时将离线活动发送到分析服务器,这取决于用户是否会重新访问您的网站。如果用户因缺少离线模式而离开您的网站,并且永远不会重新访问,您将无法跟踪该用户。跟踪离线用户流失情况的能力是说明网站为何需要更好的离线模式的关键数据。
- `
online` 事件不是很可靠,因为它 只了解网络访问, 而不了解互联网访问。因此,用户可能仍处于离线状态,并且发送跟踪 ping 仍可能会失败。 - 即使用户在离线时仍停留在当前页面,系统也不会跟踪任何其他分析事件(例如滚动事件、点击等),而这些事件可能更相关且更有用。
- 仅仅处于离线状态意义不大。最重要的是了解哪些资源加载失败。这对于单页应用 (SPA) 尤其重要,因为在单页应用中,网络连接中断可能不会导致浏览器离线错误页面(用户可以理解)。相反,它可能会导致页面的随机动态部分静默失败。
您仍然可以使用此解决方案来大致了解离线使用情况,但需要仔细考虑许多缺点和限制。
更好的方法:Service Worker
启用离线模式的解决方案也是跟踪离线使用情况的更好解决方案。只要用户处于离线状态,您就可以将分析 ping 存储在 IndexedDB 中,并在用户重新上线时重新发送这些 ping。对于 Google Analytics, 这已在 Workbox 模块中提供, 但请注意,延迟超过 4 小时发送 的命中可能不会被处理。
最简单的形式是,它可以在基于 Workbox 的 Service Worker 中使用以下两行代码激活:
import * as googleAnalytics from 'workbox-google-analytics';
googleAnalytics.initialize();
这会跟踪离线时的所有现有事件和网页浏览 ping,但您
不会知道它们是离线发生的,因为它们只是按原样重放。您
可以使用 Workbox 操纵跟踪请求
,方法是向分析 ping 添加 offline 标志(使用自定义维度):
import * as googleAnalytics from 'workbox-google-analytics';
googleAnalytics.initialize({
parameterOverrides: {
customDimension1: 'offline',
},
});
如果用户因离线而在互联网连接恢复之前离开页面,会发生什么情况?虽然这通常会让 Service Worker 进入休眠状态,因为 它无法在连接恢复时发送数据,但 Workbox Google Analytics 模块会使用 Background Sync API。即使在用户关闭标签页或浏览器后,Background Sync 也会在连接恢复时发送分析数据。
这仍然存在一个缺点:虽然这使得现有跟踪能够离线进行,但您很可能在实现基本的离线模式之前看不到太多相关数据。当连接中断时,用户仍然会快速离开您的网站。但现在,您至少可以通过比较应用了离线维度的用户的平均会话时长和用户互动与常规用户的平均会话时长和用户互动,来衡量和量化这一点。
SPA 和延迟加载
如果访问以多页网站形式构建的页面的用户离线并尝试导航,则会显示浏览器的默认离线页面,帮助用户了解发生了什么情况。但是,以单页应用形式构建的页面的工作方式有所不同。用户停留在同一页面上,并且通过 AJAX 动态加载新内容,而无需任何浏览器导航。用户在离线时不会看到浏览器错误页面。相反,页面的动态部分会呈现错误、进入未定义状态,或者只是停止动态。
由于延迟加载,多页网站中可能会发生类似的效果。例如,初始加载可能是在线进行的,但用户在滚动之前离线了。非首屏的所有延迟加载内容都会静默失败并丢失。
由于这些情况确实会让用户感到恼火,因此跟踪这些情况是有意义的。Service Worker 是捕获网络错误的理想位置,最终可以使用分析来跟踪这些错误。借助 Workbox,您可以配置 a 全局捕获处理程序 ,通过发送消息事件来通知页面有关失败的请求:
import { setCatchHandler } from 'workbox-routing';
setCatchHandler(({ event }) => {
// https://developer.mozilla.org/docs/Web/API/Client/postMessage
event.waitUntil(async function () {
// Exit early if we don't have access to the client.
// Eg, if it's cross-origin.
if (!event.clientId) return;
// Get the client.
const client = await clients.get(event.clientId);
// Exit early if we don't get the client.
// Eg, if it closed.
if (!client) return;
// Send a message to the client.
client.postMessage({
action: "network_fail",
url: event.request.url,
destination: event.request.destination
});
return Response.error();
}());
});
除了监听所有失败的请求之外,另一种方法是仅捕获特定路由上的错误。例如,如果我们只想报告在 /products/* 路由上发生的错误,可以在 setCatchHandler 中添加检查,以使用正则表达式过滤 URI。
更简洁的解决方案是使用自定义处理程序实现 registerRoute。这会将业务逻辑封装到单独的路由中,从而在更复杂的 Service Worker 中实现更好的可维护性:
import { registerRoute } from 'workbox-routing';
import { NetworkOnly } from 'workbox-strategies';
const networkOnly = new NetworkOnly();
registerRoute(
new RegExp('https:\/\/example\.com\/products\/.+'),
async (params) => {
try {
// Attempt a network request.
return await networkOnly.handle(params);
} catch (error) {
// If it fails, report the error.
const event = params.event;
if (!event.clientId) return;
const client = await clients.get(event.clientId);
if (!client) return;
client.postMessage({
action: "network_fail",
url: event.request.url,
destination: "products"
});
return Response.error();
}
}
);
最后一步是,页面需要监听 message 事件,并发送分析 ping。同样,请务必在 Service Worker 中缓冲离线发生的分析请求。如前所述,初始化 workbox-google-analytics 插件以获得内置的 Google Analytics 支持。
以下示例使用 Google Analytics,但可以以相同的方式应用于其他分析供应商。
if ("serviceWorker" in navigator) {
// ... SW registration here
// track offline error events
navigator.serviceWorker.addEventListener("message", event => {
if (gtag && event.data && event.data.action === "network_fail") {
gtag("event", "network_fail", {
event_category: event.data.destination,
// event_label: event.data.url,
// value: event.data.value
});
}
});
}
这将在 Google Analytics 中跟踪失败的资源加载,您可以在其中使用 报告对其进行分析。得出的洞见可用于改进 Service Worker 缓存和一般错误处理,从而在不稳定的网络条件下使页面更稳健可靠。
后续步骤
您了解了不同的离线使用情况跟踪方法及其优缺点。 虽然这有助于量化有多少用户离线并因此遇到问题,但这仅仅是一个开始。只要您的网站不提供精心构建的离线模式,您显然就不会在分析中看到太多离线使用情况。
我们建议您先全面跟踪,然后以迭代方式扩展离线功能,重点是跟踪。首先从离线错误页面开始。使用 Workbox 创建此页面 非常简单,并且与自定义 404 页面类似,是一种提升用户体验的最佳做法。然后,逐步实现 更高级的离线回退 ,最后实现真正的离线内容。请务必向用户宣传并解释这一点,您会看到使用量不断增加。毕竟,每个人都会时不时地离线。
如需获得有关说服跨职能利益相关方加大对网站的投资的提示,请参阅如何报告指标和打造绩效文化 以及跨职能修复网站速度。虽然这些帖子侧重于性能,但它们应该有助于您了解如何与利益相关者互动。