83.基于Vue SEO的四种方案(小结)

前言:众所周知,Vue SPA单页面应用对SEO不友好,当然也有相应的解决方案,下面列出几种最近研究和使用过的SEO方案,SRR和静态化基于Nuxt来说。

1.SSR服务器渲染;
2.静态化;
3.预渲染prerender-spa-plugin;
4.使用Phantomjs针对爬虫做处理。

1.SSR服务器渲染

关于服务器渲染:Vue官网介绍 ,对Vue版本有要求,对服务器也有一定要求,需要支持nodejs环境。

使用SSR权衡之处:

  1. 开发条件所限,浏览器特定的代码,只能在某些生命周期钩子函数 (lifecycle hook) 中使用;一些外部扩展库 (external library) 可能需要特殊处理,才能在服务器渲染应用程序中运行;
  2. 环境和部署要求更高,需要Node.js server 运行环境;
  3. 高流量的情况下,请准备相应的服务器负载,并明智地采用缓存策略。

优势:

  1. 更好的 SEO,由于搜索引擎爬虫抓取工具可以直接查看完全渲染的页面;
  2. 更快的内容到达时间 (time-to-content),特别是对于缓慢的网络情况或运行缓慢的设备。

不足:(开发中遇到的坑)

1.一套代码两套执行环境,会引起各种问题,比如服务端没有window、document对象,处理方式是增加判断,如果是客户端才执行:

?
1 2 3 if(process.browser){  console.log(window); }

引用npm包,带有dom操作的,例如: wowjs ,不能用 import 的方式,改用:

?
1 2 3 4 if (process.browser) {   var { WOW } = require('wowjs');   require('wowjs/css/libs/animate.css');  }

2.Nuxt asyncData方法,初始化页面前先得到数据,但仅限于 页面组件 调用:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 // 并发加载多个接口:  async asyncData ({ app, query }) {  let [resA, resB, resC] = await Promise.all([   app.$axios.get('/api/a'),   app.$axios.get('/api/b'),   app.$axios.get('/api/c'),   ])       return {   dataA: resA.data,   dataB: resB.data,   dataC: resC.data,   }  }

在asyncData中获取参数:

1.获取动态路由参数,如:

/list/:id' ==>  '/list/123

接收:

?
1 2 3 async asyncData ({ app, query }) {  console.log(app.context.params.id) //123 }

2.获取url?获取参数,如:

/list?id=123

接收:

?
1 2 3 async asyncData ({ app, query }) {  console.log(query.id) //123 }

3.如果你使用 v-if 语法,部署到线上大概也会遇到这个错误:

Error while initializing app DOMException: Failed to execute 'appendChild' on 'Node': This node type does not support this method.
    at Object.We [as appendChild]

根据github nuxt上的 issue第1552条 提示,要将 v-if 改为 v-show 语法。

4.坑太多,留坑,晚点更。

2.静态化

在 Nuxt.js 执行 generate 静态化打包时,动态路由会被忽略。

?
1 2 3 4 -| pages/ ---| index.vue ---| users/ -----| _id.vue

需要动态路由先生成静态页面,你需要指定动态路由参数的值,并配置到 routes 数组中去。

?
1 2 3 4 5 6 7 8 9 10 // nuxt.config.js module.exports = {  generate: {  routes: [   '/users/1',   '/users/2',   '/users/3'  ]  } }

运行打包,即可看见打包出来的页面。

但是如果路由动态参数的值是动态的而不是固定的,应该怎么做呢?

使用一个返回 Promise 对象类型 的 函数;
使用一个回调是 callback(err, params) 的 函数。

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // nuxt.config.js import axios from 'axios'   export default {  generate: {  routes: function () {   return axios.get('https://my-api/users')   .then((res) => {   return res.data.map((user) => {    return {    route: '/users/' + user.id,    payload: user    }   })   })  }  } }

现在我们可以从 /users/_id.vue 访问的 payload ,如下所示:

?
1 2 3 4 async asyncData ({ params, error, payload }) {  if (payload) return { user: payload }  else return { user: await backend.fetchUser(params.id) } }

如果你的动态路由的参数很多,例如商品详情,可能高达几千几万个。需要一个接口返回所有id,然后打包时遍历id,打包到本地,如果某个商品修改了或者下架了,又要重新打包,数量多的情况下打包也是非常慢的,非常不现实。

优势:

  • 纯静态文件,访问速度超快;
  • 对比SSR,不涉及到服务器负载方面问题;
  • 静态网页不宜遭到黑客攻击,安全性更高。

不足:

  • 如果动态路由参数多的话不适用。

3.预渲染prerender-spa-plugin

如果你只是用来改善少数营销页面(例如 /, /about, /contact 等)的 SEO,那么你可能需要预渲染。无需使用 web 服务器实时动态编译 HTML,而是使用预渲染方式,在构建时 (build time) 简单地生成针对特定路由的静态 HTML 文件。优点是设置预渲染更简单,并可以将你的前端作为一个完全静态的站点。

?
1 $ cnpm install prerender-spa-plugin --save

vue cli 3 vue.config.js 配置:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 const PrerenderSPAPlugin = require('prerender-spa-plugin'); const Renderer = PrerenderSPAPlugin.PuppeteerRenderer; const path = require('path'); module.exports = {  configureWebpack: config => {   if (process.env.NODE_ENV !== 'production') return;   return {    plugins: [     new PrerenderSPAPlugin({      // 生成文件的路径,也可以与webpakc打包的一致。      // 下面这句话非常重要!!!      // 这个目录只能有一级,如果目录层次大于一级,在生成的时候不会有任何错误提示,在预渲染的时候只会卡着不动。      staticDir: path.join(__dirname,'dist'),      // 对应自己的路由文件,比如a有参数,就需要写成 /a/param1。      routes: ['/', '/product','/about'],      // 这个很重要,如果没有配置这段,也不会进行预编译      renderer: new Renderer({       inject: {        foo: 'bar'       },       headless: false,       // 在 main.js 中 document.dispatchEvent(new Event('render-event')),两者的事件名称要对应上。       renderAfterDocumentEvent: 'render-event'      })     }),    ],   };  } }

在main.js中添加:

?
1 2 3 4 5 6 7 new Vue({  router,  render: h => h(App),  mounted () {  document.dispatchEvent(new Event('render-event'))  } }).$mount('#app')

注意:router中必须设置 mode: “history” 。

打包出来可以看见文件,打包出文件夹 /index.html ,例如: about => about/index.html ,里面有html内容。

优势:

  • 改动小,引入个插件就完事;

不足:

  • 无法使用动态路由;
  • 只适用少量页面的项目,页面多达几百个的情况下,打包会很很很慢;

4.使用Phantomjs针对爬虫做处理

Phantomjs是一个基于webkit内核的无头浏览器,即没有UI界面,即它就是一个浏览器,只是其内的点击、翻页等人为相关操作需要程序设计实现。

虽然“PhantomJS宣布终止开发”,但是已经满足对Vue的SEO处理。

这种解决方案其实是一种旁路机制,原理就是通过Nginx配置, 判断访问的来源UA是否是爬虫访问,如果是则将搜索引擎的爬虫请求转发到一个node server,再通过PhantomJS来解析完整的HTML,返回给爬虫。

 

具体代码戳这里: vue-seo-phantomjs 

要安装全局 phantomjs ,局部 express ,测试:

?
1 $ phantomjs spider.js 'https://www.baidu.com'

如果见到在命令行里出现了一推html,那恭喜你,你已经征服PhantomJS啦。

启动之后或者用postman在请求头增加 User-Agent 值为 Baiduspider ,效果一样的。

部署上线

线上要安装 node  pm2 、 phantomjs ,nginx相关配置:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 upstream spider_server {  server localhost:3000; }   server {  listen  80;  server_name example.com;     location / {   proxy_set_header Host   $host:$proxy_port;   proxy_set_header X-Real-IP  $remote_addr;   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;     if ($http_user_agent ~* "Baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator|bingbot|Sosospider|Sogou Pic Spider|Googlebot|360Spider") {   proxy_pass http://spider_server;   }  } }

优势:

  • 完全不用改动项目代码,按原本的SPA开发即可,对比开发SSR成本小不要太多;
  • 对已用SPA开发完成的项目,这是不二之选。

不足:

  • 部署需要node服务器支持;
  • 爬虫访问比网页访问要慢一些,因为定时要定时资源加载完成才返回给爬虫;
  • 如果被恶意模拟百度爬虫大量循环爬取,会造成服务器负载方面问题,解决方法是判断访问的IP,是否是百度官方爬虫的IP。

总结

如果构建大型网站,如商城类,别犹豫,直接上SSR服务器渲染,当然也有相应的坑等你,社区较成熟,英文好点,一切问题都迎刃而解。

如果只是个人博客、公司官网这类,其余三种都可以。

如果对已用SPA开发完成的项目进行SEO优化,而且支持node服务器,请使用 Phantomjs 。

很少写文章,这是我这个月对Vue SEO方案的探索,写的不对的地方请指出,谢谢理解~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

摘至https://www.jb51.net/article/164285.htm

原文地址:https://www.cnblogs.com/sqyambition/p/11382851.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


前端里面如何进行搜索引擎优化(SEO) 如何进行SEO优化: (1) 避免head标签js堵塞: 所有放在head标签里面的js和css都会堵塞渲染;如果这些css和js需要加载很久的话,那么页面就空白了; 解决办法:一是把script放到body后面,这也是很多网站采取的方法。 第二种是给scri
网站页面(前端)seo优化方法及建议 很多时候,网站页面(前端)seo优化所涉及的点在于页面精简。本教程概述了如何对网页进行精简,以及提供相关建议,加快网站加载速度,提升网站性能。 从相反方面考虑,如果网页庞杂,网页打开速度慢,会有什么后果? 首先,网页代码 […] 很多时候,网站页面(前端)seo
网站流量短时间内的少量波动一般来说是正常现象。当流量波动持续时间较长且幅度较大时,则需要排查原因;建议站长进行以下排查跟处理:
持续输出原创优质内容,获得更多的用户点击与认可,会提高网站的评分,从而获得更多的搜索展现。
百度信息流配置为用户的自然流量,即会根据用户属性和配置的内容进行匹配后综合决定是否进行展示,因此需要开发者不断优化素材从而获取流量。
百度搜索的索引量与流量有什么关系?百度搜索的索引量与流量是什么意思:百度搜索基于用户需求和资源质量等维度对索引量数据进行评估,不定期的更新索引量数据库。可能会删除低质量、用户无需求的资源,也会增加高质
随着手机移动端的快速崛起,慢慢的占领了大部分用户的访问入口,SEO优化方面,大家也开始更加重视针对移动端SEO的安排;
首先说下SSR,最近很热的词,意为ServerSideRendering(服务端渲染),目的是为了解决单页面应用的SEO的问题,搜索引擎无法抓取页面相关内容,也就是用户搜不到此网站的相关信息。用NUXT来做SSR,作用就是在node.js上进一步封装,然后省去我们搭建服务端环境的步骤,只需要遵循这个库的一些
   我是一个站长,现在建站seo是比较重要的部分,买了独立ip的云服务器主机,为了就是能够seo效果好点.建站优化我不担心,最郁闷的就是linux服务器运维这块,宝塔linux面板是必须安装到服务器上,比较消耗服务器内存,运维比较麻烦. 还有就是购买宝塔面板的附带插件比较贵,基本买个
在我们学习网站seo高质量外链建设之前,首先我们要先了解一下,究竟什么是外链呢?外链其实就是我们网站的外部链接,也称为反向链接,就是由其他的网站指向我们网站的链接。那么外链的作用是什么呢?外链可以为自己的网站带来流量,将其他网站的流量导入到自己的网站,同时也可以提高网站的权重排
大表哥相信不少朋友学习seo优化技术都是为了能够靠seo赚到钱,多数的朋友会选择去找一份seo优化的工作来赚钱,seo优化者在选择工作的时候都会普遍接触到一项职位,那就是seo专员,很多朋友都想知道seo专员是做什么的,那么今天大表哥就和大家聊一聊seo专员日常工作内容是什么?Seo专员是什么
又到了分享经验的时刻,每到这时候,高粱seo心里总是美滋滋的,因为分享是一种快乐,更是一种收获,能够与人分享,本身就是一种成功。在上一篇文章当中,高粱seo用两个实战案例,证明了目前资源导入对seo快速排名的帮助时非常给力的,之后很多seo优化伙伴纷纷来咨询,都想知道具体是怎么操作的。高粱se
 SEO阅读笔记目录基本规则URL优化代码优化代码内容优化页面头部优化图片优化网页结构基本规则1.资源越浅越容易被收录2.资源越浅越容易被收录3.关键词越靠文档(html)前,越容易被收录4.关键词出现的次数越多越好 URL优化Url中携带关键词组合关键词:eg.IPHONE
最近在自学SEO,互联网运营,把做的笔记干货分享给大家啊!希望能帮到大家,如有好的建议可以关注我【磨人的小妖精】或留言,大家一起探讨。之前还写过一篇文章互联网运营+SEO:推荐必看的5本书籍,学习还是需要系统化的书本来学习,帮助会更大。做SEO,关键词和工具比较重要,今天就先分享这两个,日
在我们接到优化网站需求的时候,一般可以从如下几个步骤进行:1.网站的机构2.页面的布局3.关键词的选取4.关键词的分布首页title标题的组成格式核心关键词+网站名称(最好含有关键词)keywords的设置核心关键词由主到次,由左到右依次出现,保持在3-4个最好,以免有关键词
    众所周知,每个人都是独立的个体,都有自己的思想和判断,具体一个什么样的网站才能称得上是成功优秀的,对于这个问题不同的人会给出不同的解说,并且衡量一个网站好坏的方式有很多的,但无论如何,我们都需要把各方面都做到最好,力争让网站能够在众多的网站中脱颖而出,而这应该是衡
现在SEO的最新算法、技巧,希望大家运用这些技巧,都像我一样能够在百度上获得客户:第一步:了解搜索引擎的工作原理爬——抓——处——排——展第二步:大家要建立一个整体框架,影响SEO的排名有哪些因素如果你网站的收录量很低,那么需要优化以下8个因素:内链结构优化URL结构优化产品内容
要想了解网站降权或者被K的原因,首先要去深度分析降权被K产生的因素,从搜索引擎本质上来说,并不会有特定的所谓被降权K站的条件来制定网站降权或者被K。并且网站降权和网站被K属于两种不同的现象。降权最明显的现象是网页还处于收录状态,但是整个标题或某个关键词搜索的时候搜索不到
本文首发于:风云社区(scoee.com)最近开始学习和研究互联网运营和SEO,对于我这个小白来讲,还是有些吃力,毕竟从来没接触这方面的,尽管在之前的软件公司做过售前和产品相关的工作,但毕竟与互联网产品运营和SEO,还是差别很大。So,在网上零散看了一些互联网产品运营和SEO相关文章,感觉讲的太片面
任何一个流量类的网站都需要长期的seo优化与维护,多数站长搭建网站的目的也是通过网站获得一定的流量和转化,但是做过seo的朋友都知道,网站获得大量流量最好的方法就是获得高的排名,但是通常新网站想要通过seo获得排名是需要长时间的积累的,那么网站建立前期如何获得流量就是很多站长比