【发布时间】:2022-07-18 22:50:17
【问题描述】:
我正在构建一个 Remix 应用程序,并希望根据用户正在查看的页面在我的数据库中记录一些用户分析。我还想逐个路由地这样做,而不仅仅是原始 URL。
例如:我想知道“用户查看的 URL /emails/123”以及“用户查看的路由 /emails/$emailId”
这个问题可以概括为“我想为每个用户导航运行一次服务器代码”
对于我的跟踪,我假设用户在他们的浏览器中启用了 javascript。
我尝试过的解决方案:
在加载器中记录
这可能是这样的:
export const loader: LoaderFunction = async ({ request, params }): Promise<LoaderData> => {
myDb.recordPageVisit(request.url);
}
这不起作用,因为每次页面访问都可以多次调用加载器(例如,在运行操作之后)
请求参数中可能隐藏了一些值,告诉我们这是初始页面加载还是稍后访问,但如果是这样,我找不到它,包括我检查原始 HTTP 请求时。
不得不把这段代码放在每个加载器中也很烦人。
在节点代码中记录URL
我使用@remix-run/node 作为我的基础混音服务器,所以我有设置节点中间件的逃生舱,我认为这可能是一个很好的答案:
const app = express();
app.use((req, res, next) => {
if (req.url.indexOf("_data") == -1) {
myDb.recordPageVisit(req.url);
}
next();
});
我尝试忽略其中包含 _data 的路由,但这不起作用,因为重新混合效率很高,并且当用户导航时,它使用 ajax-y 调用仅获取 loaderData 而不是获取完整渲染来自服务器的页面。我知道这是 Remix 的行为,但在我走这条路之前我不记得了:facepalm:
据我所知,不可能无状态地跟踪唯一的网页浏览量(即纯粹基于当前 URL)——您还需要查看用户的上一页。
我想知道referer 是否允许它无状态地工作,但看起来referer 的行为并不像我希望的那样:在第一个加载程序请求页面数据时,referer 标头已经设置为当前页面.因此,基于引用者,初始加载和变异后加载看起来是相同的。我不知道这在技术上是否是一个错误,但这肯定不是我所期望的行为。
【问题讨论】:
-
为了整合谷歌分析,我引用了存储库中的示例:github.com/remix-run/remix/tree/main/examples/google-analytics
-
另一种替代方法是使用 Fathom,这是一种尊重隐私的 Google Analytics 替代方法,对欧盟友好,请参阅 usefathom.com — 了解 Kent Dodds 网站如何使用
fathom-clientinentry.client.tsx: @987654322 @
标签: remix.run