目前可以选择使用通用分析(Universal Analytics)和 Google Analytics 4。
为什么要使用 Google Analytics 4 的原因:
- 通用分析将于2023年7月1日停止服务,因此当我进行新的设置时,我认为选择 Google Analytics 4 已经是有意义的。
- react-ga 包不适用于 GA-4,而且看起来它也永远不会支持。
react-ga
正在进行被动维护,除非其他人发起请求,否则不会更新以支持 GA-4。 - 但是有一个 React Google Analytics 4,简称为
react-ga4
模块,可以与 GA-4 一起使用。
因此,我在 GA 上创建了一个属性,并按照这个 指南 进行了设置。
我安装了模块,并在我的主 index.tsx 文件中只需用 ReactGA.initialize
进行初始化。
ID 不存储在 env 文件中,因为根据这个 答案,它是公开的。
在 localhost 上测试显示 GA 可以捕获数据。
不需要其他代码了。 GA4 足够智能,可以自动测量所有交互。 您不必在项目中编写这些交互。 GA4 自动测量站点上的交互和内容,除标准页面视图测量外: 页面浏览量, 滚动量, 离站点击, 站内搜索, 视频互动 和 文件下载。 请参见: 增强测量事件
任何基于其他用例的事件,我们都必须自己编码。 这与通用分析基本相同。
因此,我的第一个问题是:我收集的信息是否正确?您会以其他方式集成它吗?或者我漏掉了什么?
总的来说,我想知道使用这个库的好处是什么?
--> 或者我可以为集成执行以下操作: 直接将全局站点标记添加到您的网页
哪种方法更好?
现在看第二部分,在第一个代码片段中,您可以看到我的index.tsx
文件中的react-ga4初始化。
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import ReactGA from 'react-ga4';
ReactGA.initialize('G-XXXXXXXX');
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root')
);
本地主机上的测试显示数据已在 GA 仪表板中被捕获。完美!
但是有一个与 Adblocker 崩溃有关的问题。如果某人使用广告拦截器(广告拦截器阻止分析请求端点,没有错误处理等),它通常会导致应用程序崩溃,为了减轻这个问题,我们检测是否脚本未加载,因此可以推断用户是否有使用阻止 GA 脚本加载的广告拦截器。在我的示例代码中,我只是忽略它并加载应用程序...在其他情况下,我想你可以调用一个模态框来告诉他们禁用它(当然,那将带来额外的代码)。取自 spencer741 的回答
index.tsx
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import ReactGA from 'react-ga4';
(async _ => {
await ReactGA.initialize('G-XXXXXXXXX')
.then(res => console.log("Analytics Success."))
.catch(err => console.log("Analytics Failure."))
.finally(() => {
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root')
);
});
})();
我知道这在Typescript中会抛出错误:
Property 'then' does not exist on type 'void'.
Property 'catch' does not exist on type 'void'.
Property 'finally' does not exist on type 'void'.
'res' is declared but its value is never read.
Parameter 'res' implicitly has an 'any' type.
'err' is declared but its value is never read.
Parameter 'err' implicitly has an 'any' type.
但在我尝试解决这些错误之前,我想知道这是规避广告拦截器潜在错误的可行解决方案吗?
Promise
没有返回任何内容所致。您可能希望避免对console.log
进行隐式返回。关于res
和err
抛出的问题,您可以只需键入res: any
和err: any
。所以,当前的TS错误已经解决了。我会尝试使用useEffect
在app.tsx
中有条件地包装ReactGA
初始化,并在那里进行trycatch
,而不是在index.tsx
中进行。 - MoaGA
逻辑包装起来。 - Moa