为什么Matomo网站统计跟踪代码采用当前的编写结构?
关于Matomo默认跟踪代码设计疑问的解答
1. 为什么不直接赋值初始化window._paq
这种window._paq = window._paq || []再加push的写法是为了做兼容适配:如果页面上提前有其他代码已经初始化过_paq、插入了自定义跟踪指令,直接赋值会把之前的内容完全覆盖,而现有写法可以在已有实例基础上追加配置,不会丢失之前的跟踪设置,适配多段跟踪代码分散部署的场景。
2. 立即执行函数表达式(IIFE)的作用
你提到的变量隔离是核心作用之一:IIFE内部定义的u、d、g、s都是局部变量,执行完就销毁,不会污染全局命名空间,也不会和页面自有变量重名冲突。除此之外它还可以保证内部逻辑的稳定性,外部代码无法篡改IIFE内部用到的临时变量值,避免外部异常影响跟踪代码的执行。
3. 为什么动态插入matomo.js而不直接写script标签
有两个核心原因:
- 动态创建的script标签默认就是异步加载的,不会阻塞DOM解析和页面渲染,不会影响站点的加载速度体验。如果直接写script标签默认是同步加载,需要手动加
async属性才能达到同样的效果。 - 动态插入可以复用前面定义的服务地址变量
u,后台自动生成跟踪代码的时候只要替换{$MATOMO_URL}一个占位符即可,不用同时修改两处地址,降低写错的概率。
你查到的简化写法是完全可用的,只要满足两个前提:页面没有提前初始化过_paq、直接写的script标签加了async属性,两种写法的执行效果没有差异。
内容的提问来源于stack exchange,提问作者jdm
相关产品推荐
相关产品推荐

