
本文系转载,转载链接:Typecho 博客统计脚本怎么装?同步 / 异步 + Head/Body 选择指南
给 Typecho 博客装统计脚本时,选 “同步还是异步”“放 Head 还是 Body”,不同的方式会直接影响页面加载速度和数据准确性。今天就从原理到实操,再根据各大统计工具的官方安装方案,来统一拆解一下在什么时候用什么方式会更好。
给博客装统计脚本,本质是 “让脚本在网页加载时运行”,但 “怎么加载” 的差异,会引发 “性能” 和 “数据” 的平衡难题,顺序不同,效率和结果也不同。
同步加载的脚本会 “插队”—— 网页加载时,会停下渲染内容,先等脚本下载、执行完,再继续加载其他内容。
异步加载的脚本像 “并行工作的工人”—— 网页渲染内容的同时,脚本在后台下载,下载完就执行,互不干扰。
不同异步方式适配不同需求,就像 “不同的交通工具适配不同路程”:
加载方式 | 代码示例 | 执行时机 | 适合场景 |
|---|---|---|---|
async |
| 脚本下载完立即执行,不等网页解析 | 独立统计脚本(如 Google Analytics),无需依赖其他脚本 |
defer |
| 等网页全部解析完再执行,按加载顺序排队 | 有依赖关系的脚本(比如先加载统计核心库,再加载自定义配置) |
动态插入 |
| 完全由代码控制加载时机,灵活性最高 | 百度统计、统计鸟等,需动态适配环境的场景 |
脚本放哪里,本质是 “让脚本什么时候开始工作”——Head 是 “网页刚启动就干活”,Body 底部是 “网页内容快加载完再干活”,各有侧重。
把脚本放在<head>标签里,网页一加载就开始下载脚本。
脚本放在</body>标签前,网页会先渲染完所有内容(文字、图片、样式),再加载脚本。
不同统计工具的 “最佳位置” 和 “加载方式”,官方有明确建议。
Google 明确建议把脚本放<head>,用 async 异步加载,平衡性能和数据:
<head>
<!-- Google Analytics 统计代码 -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXXXXXXXX'); // 替换成你的GA4 ID
</script>
</head>百度统计用 “分段操作”——Head 先声明全局变量(避免数据丢失),Body 底部再动态插入脚本(不影响首屏):
<head>
<!-- 第一步:Head声明全局变量 -->
<script>var _hmt = _hmt || [];</script>
</head>
<body>
<!-- 博客内容 -->
<!-- 第二步:Body底部动态加载脚本 -->
<script>
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?YOUR_BAIDU_SITE_ID"; // 替换成你的百度统计ID
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
</body>51.la 更新 V6 后,安装位置有变化:
V6 版本(推荐) :放<head>,支持同步 / 异步,官方建议同步(数据更准):
<head>
<!-- 51.la V6 同步统计代码(从后台获取专属代码) -->
<script>
/* 替换成51.la后台生成的V6代码 */
</script>
</head>V5 版本(旧版) :放<body>底部,异步加载:
<body>
<!-- 博客内容 -->
<!-- 51.la V5 统计代码 -->
<script>
!function(p){"use strict";!function(t){var s=window,e=document,i=p,c="".concat("https:"===e.location.protocol?"https://":"http://","sdk.51.la/js-sdk-pro.min.js"),n=e.createElement("script"),r=e.getElementsByTagName("script")[0];n.type="text/javascript",n.setAttribute("charset","UTF-8"),n.async=!0,n.src=c,n.id="LA_COLLECT",i.d=n;var o=function(){s.LA.ids.push(i)};s.LA?s.LA.ids&&o():(s.LA=p,s.LA.ids=[],o()),r.parentNode.insertBefore(n,r)}()}({id:"YOUR_SITE_ID",ck:"YOUR_SITE_ID"}); // 替换成你的51.la ID
</script>
</body>UStat:放<head>,用 async 异步,简单直接:
<head>
<!-- UStat 统计代码 -->
<script async src="https://YOUR-USTAT-ID.ustat1.com/ustat.js"></script>
</head>Umami(开源隐私友好型) :放<head>,支持 async+defer,兼顾性能和兼容性:
<head>
<!-- Umami 统计代码 -->
<script async defer
data-website-id="YOUR-UMAMI-WEBSITE-ID"
src="https://your-umami-domain.com/script.js">
</script>
</head>统计鸟:放<body>底部,动态异步加载,适配国产网络环境:
<!-- 统计鸟示例 -->
<script>
(function() {
"use strict";
var w = window, d = document, u = "//api.tongjiniao.com/c?_=YOUR_TONGJINIAO_ID",
s = document.createElement("script"), r = document.getElementsByTagName("script")[0];
s.type = "text/javascript";
s.setAttribute("charset", "UTF-8");
s.async = true;
s.src = u;
r.parentNode.insertBefore(s, r);
})();
</script>如果你的 Typecho 博客开了缓存(比如 HTML 缓存、CDN 缓存)或用了静态化插件,要注意 2 个细节,避免统计失效:
<script>
(function() {
var script = document.createElement('script');
script.async = true;
script.src = 'https://YOUR-USTAT-ID.ustat1.com/ustat.js'; // 替换ID
script.onerror = function() {
// 脚本加载失败,不做任何操作,不影响博客
};
document.head.appendChild(script);
})();
</script>其实没有 “绝对正确” 的选择,只有 “适合自己博客” 的方案。比如轻量博客可全用异步 + Body 底部,数据敏感的博客可把核心统计放 Head+async,辅助统计放 Body—— 按这个逻辑调,性能和数据都能兼顾。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。