动态设置的meta描述在SEO工具里显示为空怎么办?
我在用Vue开发博客页面时,想用JavaScript动态设置文章的meta description标签。但用 Screaming Frog 抓取时显示为空,这是为什么呢?
我尝试在组件mounted里这样写:
mounted() {
const metaDesc = document.querySelector('meta[name="description"]');
metaDesc.setAttribute('content', this.article.content.slice(0,150));
}
虽然浏览器里能看到meta标签更新了,但SEO工具完全没读到内容。是不是因为客户端渲染的问题?有没有更好的实现方式?
解决方案就一个字:服务端处理。
如果你用的是 Vue 2 + Vue Router,推荐用
vue-meta,但前提是你的应用得走 SSR(服务端渲染),比如用 Nuxt.js。只有服务端直接把 meta 标签拼进 HTML 返回,爬虫和 SEO 工具才能拿到真正的 content。如果现在是纯前端 SPA,几乎无解。你可以在 nginx 层做预渲染,或者上 SSR。最简单的过渡方案是用 Prerender.io 这类服务生成静态快照,让爬虫访问快照地址。
但长远来看,博客这种内容型页面,强烈建议上 Nuxt 或者换成 Vue 3 + Vite 的 SSR 方案,在服务端根据路由动态注入 meta。这样不管是 description 还是 title 都能正确输出,SEO 工具也能正常抓取。
你现在这个写法,浏览器能看到只是因为你开了 devtools 看的是运行后 DOM,不代表源码有。SEO 工具大部分看的是源码,所以空的。
Screaming Frog这类工具多数不执行JavaScript,只读原始HTML,所以你动态设的description它永远看不到。
想真正解决这个问题,必须在服务端就把meta标签塞进HTML里。如果你用Vue,上SSR(服务端渲染)最直接。简单点的话可以用Nuxt.js,它原生支持asyncData预取数据,然后直接注入到head。
代码给你:
这样生成的HTML源码里就有带content的description标签了,爬虫一抓一个准。
要是实在没法上SSR,退而求其次用Prerender SPA Plugin这种预渲染方案,至少静态页面能吐出正确meta。别再指望纯客户端操作JS去骗过搜索引擎了,行不通。