为什么Matomo跟踪代码是这样的?



在网站中包含Matomo分析的默认代码如下:

<!-- Matomo -->
<script type="text/javascript">
var _paq = window._paq = window._paq || [];
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//{$MATOMO_URL}/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', {$IDSITE}]);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->

我想知道为什么这是如此复杂:

  • matomo.js期望一个全局变量window._paq。为什么不直接初始化它呢?

    window._paq = [['trackPageView'], ['enableLinkTracking'], ...];

  • 立即调用的函数表达式在做什么?只是为了隐藏'u', 'd'等从全局作用域?

  • 通过DOM操作插入脚本。在这个块之后放置一个<script src="matomo.js"></script>标签不是更简单吗?

编辑我正在寻找的信息,因为我不能再回答自己了:

正如renRoth回答的那样,代码除了设置或扩展_paq之外什么都不做,并包括另一个脚本。它完全等价于下面的代码,这样看起来不会混淆:

<script type="text/javascript">
window._paq = [
['trackPageView'],
['enableLinkTracking'],
['setTrackerUrl', '//matomo.example.com/matomo.php'],
['setSiteId', '2'],
]
</script>
<script src="//matomo.example.com/matomo.js" type="text/javascript" async="true"></script>

matmo .js期望一个全局变量window._paq。为什么不直接初始化:

窗口。_paq = [[' trackPageView '], [' enableLinkTracking '], ...];

在某些情况下,_paq变量可能已经定义,并且包含一些您可能想要或需要的附加选项。在这种情况下,这种初始化方式可以防止重写预定义的选项。

立即调用的函数表达式在做什么?只是为了隐藏'u', 'd'等从全局作用域?

最好不要用变量污染全局命名空间,您可能已经在全局作用域中有一个名为ud的变量。

通过DOM操作插入脚本。这样不是更简单吗只是在这个块后面放一个标签?

您可以这样做,但是您需要确保在调用脚本之前定义_paq。这样,所有相关信息都在一个地方,并且在运行主matomo脚本之前确定设置了选项。

最新更新