Vue实现Twitter Cards动态加载meta标签 无需服务端渲染方案问询
首先明确核心限制:Twitter 等社交平台的爬虫不会执行客户端 JavaScript,你当前基于 vue-head 的客户端动态写入 meta 逻辑,普通用户访问时展示正常,但爬虫无法抓取到动态生成的元标签内容,这是你需要服务端能力的根本原因。无需开发完整 SSR 服务的可行方案如下:
预渲染方案
针对需要支持社交卡片的固定路由,使用预渲染插件在打包阶段提前生成对应路由的静态 HTML 文件,构建过程会执行页面逻辑把 meta 标签直接写入静态 HTML 的 head 部分,爬虫可直接抓取到正确内容。该方案适合路由数量少、内容更新频率低的场景,你现有的 vue-head 业务逻辑几乎不需要调整,仅需新增预渲染路由配置即可。边缘函数动态注入
用边缘计算函数拦截站点请求,先通过 User-Agent 判断访问者是否为 Twitter 爬虫(Twitter 官方爬虫 UA 为Twitterbot):如果是爬虫,主动调用你获取元信息的业务 API,将拿到的标题、封面图、描述等内容动态注入到返回的 HTML head 标签中再返回;如果是普通用户访问,直接返回原本的 SPA 静态资源即可。该方案完全不需要修改现有前端业务逻辑,也不需要维护完整的 SSR 服务,开发和运维成本极低。静态站点生成(SSG)
如果你的站点属于内容更新频率不高的内容类站点,可以切换为 SSG 模式,在构建阶段就把所有页面的静态 HTML 生成完毕,对应 meta 标签会直接内置在每个页面的静态 HTML 中,直接托管静态资源即可支持社交卡片抓取,不需要额外运行服务端逻辑。
现有代码适配说明
你当前编写的 meta 生成逻辑没有问题,仅因为是客户端执行才无法被爬虫识别。如果选择预渲染或 SSG 方案,这段代码基本可以直接复用,仅需保证组件渲染时 meta 依赖的title、image、excerpt等数据已经完成加载,避免预渲染快照生成时数据还未返回导致 meta 内容为空。
内容的提问来源于stack exchange,提问作者Amir Khadem

