谷歌vue3 seo解决方案怎么优化?有哪些实用方法

文章摘要

谷歌vue3 seo解决方案常见问题做前端开发的都知道,vue3是个好东西,轻量、灵活、组件化玩得溜,但一提SEO,很多人就头大——谷歌爬虫好像对vue3单页应用不太“感冒”,这问题到底出在哪?我去年帮朋友搭一个产品展示网站,用的就是vue3,页面交互做得飞起,动画丝滑得像德芙,结果上线半个月,谷歌搜索“他们家……

谷歌vue3 seo解决方案常见问题

做前端开发的都知道,vue3是个好东西,轻量、灵活、组件化玩得溜,但一提SEO,很多人就头大——谷歌爬虫好像对vue3单页应用不太“感冒”,这问题到底出在哪?我去年帮朋友搭一个产品展示网站,用的就是vue3,页面交互做得飞起,动画丝滑得像德芙,结果上线半个月,谷歌搜索“他们家产品名”,翻了好几页都找不到影子,朋友急得天天催我,说“这网站做了跟没做一样,客户都搜不到”,后来一排查才发现,问题就出在vue3的“客户端渲染”上。

传统的多页应用,服务器直接把完整的HTML内容发给浏览器,谷歌爬虫爬过来,一眼就能看到标题、正文、关键词,收录自然快,但vue3单页应用默认是客户端渲染,用户打开网页时,服务器先扔过来一个空壳HTML,然后靠JavaScript动态加载数据、渲染页面,谷歌爬虫虽然现在能执行JS,但它爬取的时间有限,有时候JS还没跑完,爬虫就已经“溜”了,结果就是抓取到的内容要么不完整,要么全是空白,这就像你给朋友寄快递,箱子是空的,里面的东西让他自己到仓库取,朋友哪有那耐心等?

除了渲染方式,路由模式也是个坑,vue3常用的history模式,URL看着干净(/product”),但对于爬虫来说,它可能识别不出这是个独立页面,以为还是同一个页面的不同状态,还有动态数据加载,比如用axios请求接口拿商品列表,爬虫爬的时候接口还没返回数据,页面上自然啥都没有,这些问题堆在一起,谷歌想给你的vue3网站好排名都难。

谷歌vue3 seo解决方案类型有哪些

遇到问题咱不能干瞪眼,总得想办法解决,目前市面上针对谷歌vue3 seo的解决方案,主要有这么几种,各有各的脾气,得按需挑选。

服务端渲染(SSR)是最“硬核”的一种,简单说,就是把vue组件在服务器端先渲染成完整的HTML,再发给浏览器,谷歌爬虫爬过来,拿到的是直接能看的内容,就像去餐厅直接端上做好的菜,不用等厨师现炒,现在用得最多的就是Nuxt.js,它是基于vue的SSR框架,对vue3支持很友好,不过这玩意儿对服务器要求高,配置起来也得花点心思,适合流量大、对SEO要求高的项目。

静态站点生成(SSG)比SSR更“懒”一点,但也更省事儿,它在构建的时候就把页面提前渲染成静态HTML文件,用户访问时直接加载静态文件,速度快得飞起,VitePress就是个典型,很多技术文档网站都用它,比如vue官网自己的文档,这种方式适合内容不怎么变动的网站,像博客、产品介绍页,更新内容得重新构建,要是天天改,那可就麻烦了。

谷歌vue3 seo解决方案怎么优化?有哪些实用方法

预渲染(Prerendering)算是SSR的“轻量版”,它会在打包时,把指定的路由页面预先生成HTML,比如你有“首页”“产品页”“关于我们”三个页面,打包时就生成三个静态HTML,它不像SSR那样实时渲染,也不像SSG那样全量生成,适合页面数量不多、动态内容少的项目,Prerender SPA Plugin这个插件就能实现,配置起来相对简单,对服务器压力也小。

还有个“曲线救国”的方法——动态渲染(Dynamic Rendering),简单说就是搞个中间件,判断访问者是普通用户还是爬虫,如果是爬虫,就用工具(比如Puppeteer)把页面渲染成HTML再返回;如果是用户,就走正常的客户端渲染,这种方式不用改太多代码,适合已经上线的项目临时救急,但长期用的话,服务器成本可能会高一些,毕竟多了一层渲染步骤。

谷歌vue3 seo解决方案具体优化步骤

光知道方案还不够,得知道怎么一步步操作,以最常用的Nuxt.js(SSR方案)为例,我去年帮朋友解决SEO问题时,就是按这几步走的,最后效果还不错,谷歌收录量一个月涨了30%。

第一步,搭建Nuxt3项目,先确保电脑装了Node.js(16.0以上版本),然后打开命令行,输入“npx nuxi init my-nuxt-app”,一路回车,项目就建好了,接着进入项目文件夹,安装依赖“npm install”,再启动开发服务器“npm run dev”,这时候打开localhost:3000,就能看到Nuxt的默认页面了,是不是很简单?

第二步,配置页面路由和SEO信息,Nuxt3的路由是基于pages文件夹自动生成的,比如在pages文件夹下建一个product.vue,访问“/product”就能看到这个页面,然后在每个页面的