[Lv2] SEO 进阶优化:动态 Meta Tags 与追踪整合
在多品牌平台项目中,实现动态 SEO 管理机制:动态 Meta Tags 注入、第三方追踪整合(Google Analytics、Facebook Pixel),以及集中化的 SEO 设定管理。
1. 面试回答主轴
- 动态 Meta Tags 注入:实现可通过后台 API 动态更新 Meta Tags 的机制,支持多品牌/多站点配置。
- 第三方追踪整合:整合 Google Tag Manager、Google Analytics 和 Facebook Pixel,支持非同步加载不阻塞页面。
- 集中化管理:使用 Pinia Store 集中管理 SEO 设定,易于维护和扩展。
2. 动态 Meta Tags 注入机制
2.1 为什么需要动态 Meta Tags?
问题情境:
- 多品牌平台,每个品牌需要不同的 SEO 设定
- 需要通过后台管理系统动态更新 SEO 内容
- 避免每次修改都要重新部署前端
解决方案: 实现动态 Meta Tags 注入机制
2.2 实现细节
文件位置: src/common/hooks/useTrafficAnalysis.ts
// 第 38-47 行
case TRAFFIC_ANALYSIS.Enums.meta_tag:
Object.keys(trafficAnalysisConfig).forEach((name) => {
const metaObj = trafficAnalysisConfig as { [key: string]: string }
const content = metaObj[name]
const meta = document.createElement("meta")
meta.setAttribute("name", name)
meta.setAttribute("content", content)
document.head.appendChild(meta)
})
break
功能说明:
- 支持动态注入多种 meta tags
- 可通过后台设定配置不同的 meta 内容
- 支持不同品牌/站点的定制化 SEO 设定
- 在客户端执行时动态插入到
<head>中
2.3 使用范例
// 从后台 API 获取的设定
const trafficAnalysisConfig = {
description: '多品牌游戏平台',
keywords: '游戏,娱乐,在线游戏',
author: 'Company Name',
};
// 动态注入 Meta Tags
trafficAnalysisConfig.forEach((config) => {
// 创建并插入 meta tag
});
优点:
- ✅ 无需重新部署即可更新 SEO 内容
- ✅ 支持多品牌配置
- ✅ 集中化管理
限制:
- ⚠️ 客户端注入,搜索引擎可能无法完整抓取
- ⚠️ 建议搭配 SSR 使用效果更佳
3. Google Tag Manager / Google Analytics 整合
3.1 非同步加载机制
文件位置: src/common/hooks/useTrafficAnalysis.ts
// 第 13-35 行
case TRAFFIC_ANALYSIS.Enums.google_tag:
if (!trafficAnalysisConfig.tag_id) {
console.warn("tag_id is empty")
return
}
try {
const script = document.createElement("script")
script.async = true
script.src = `https://www.googletagmanager.com/gtag/js?id=${trafficAnalysisConfig.tag_id}`
document.head.appendChild(script)
const script2 = document.createElement("script")
script2.textContent = `
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '${trafficAnalysisConfig.tag_id}');
`
document.head.appendChild(script2)
} catch (error) {
console.error("Error loading GTM:", error)
}
break
关键实现:
- 使用
script.async = true非同步加载,不阻塞页面渲染 - 动态创建
<script>标签并插入 - 支持通过后台配置不同的追踪 ID
- 包含错误处理机制
3.2 为什么使用非同步加载?
| 加载方式 | 影响 | 建议 |
|---|---|---|
| 同步加载 | ❌ 阻塞页面渲染 | 不建议 |
| 非同步加载 | ✅ 不阻塞页面 | ✅ 推荐 |
| 延迟加载 | ✅ 页面加载后再加载 | 可考虑 |
性能考量:
- 追踪脚本不应影响页面加载速度
- 使用
async属性确保非阻塞 - 错误处理避免加载失败影响页面
4. Facebook Pixel 追踪
4.1 页面浏览追踪
文件位置: src/router/index.ts
// 第 102-106 行
router.afterEach(() => {
if (window.fbq) {
window.fbq('track', 'PageView');
}
});
功能说明:
- 在每个路由切换后触发 Facebook Pixel 页面浏览追踪
- 支持 Facebook 广告转换追踪
- 使用
router.afterEach确保路由切换完成后才触发
4.2 为什么在 Router 中实现?
优点:
- ✅ 集中管理,所有路由自动追踪
- ✅ 不需要在每个页面手动加入追踪代码
- ✅ 确保追踪的一致性
注意事项:
- 需要确认
window.fbq已加载 - 避免在 SSR 环境中执行(需要检查环境)