Maison  >  Article  >  interface Web  >  Une seule page Vue peut-elle faire du référencement ?

Une seule page Vue peut-elle faire du référencement ?

青灯夜游
青灯夜游original
2022-12-20 17:58:012456parcourir

vue une seule page peut faire du référencement. Méthodes : 1. Rendu du serveur SSR, permettant aux robots des moteurs de recherche de visualiser directement la page entièrement rendue, permettant au contenu d'arriver plus rapidement ; 2. Statique, permettant à la page de se charger plus rapidement 3. Pré-rendu prerender-spa-plugin ;4. Utilisez Phantomjs pour traiter les robots d'exploration.

Une seule page Vue peut-elle faire du référencement ?

L'environnement d'exploitation de ce tutoriel : système windows7, version vue3, ordinateur DELL G3.

Comme nous le savons tous, l'application monopage Vue SPA n'est pas conviviale pour le référencement. Bien sûr, il existe des solutions correspondantes. Vous trouverez ci-dessous plusieurs solutions de référencement et de statique récemment recherchées et utilisées.

  • 1. Rendu du serveur SSR ;
  • 2. Staticisation ;
  • 3.
  • 1.Rendu du serveur SSR

À propos du rendu du serveur : selon le site officiel de Vue, il existe des exigences pour la version Vue et certaines exigences pour le serveur, et celui-ci doit prendre en charge l'environnement nodejs.

Les compromis de l'utilisation de SSR :

Limité par les conditions de développement, le code spécifique au navigateur ne peut être utilisé que dans certaines fonctions de hook de cycle de vie ; certaines bibliothèques externes peuvent nécessiter un traitement spécial pour s'exécuter dans les applications de rendu du serveur ;
  • Les exigences en matière d'environnement et de déploiement sont plus élevées et un environnement d'exécution de serveur Node.js est requis ;
  • En cas de trafic élevé, veuillez préparer la charge du serveur correspondante et adopter judicieusement les stratégies de mise en cache ;
Avantages :

Meilleur référencement, puisque les robots des moteurs de recherche peuvent visualiser directement la page entièrement rendue ;
  • Temps d'accès au contenu plus rapide, en particulier pour les conditions de réseau lentes ou les appareils lents.
Lacunes : (fosses rencontrées lors du développement)

1. Un ensemble de code et deux ensembles d'environnements d'exécution entraîneront divers problèmes. Par exemple, le serveur n'a pas d'objets fenêtre ou document. . S'il s'agit d'une exécution client Duancai :

if(process.browser){
 console.log(window);
}

fait référence aux packages npm avec des opérations dom, telles que : wowjs, ne peut pas utiliser import, utilisez :

if (process.browser) {
     var { WOW } = require('wowjs');
     require('wowjs/css/libs/animate.css');
 }

2. Méthode Nuxt asyncData, récupérez les données avant d'initialiser la page, mais uniquement pour les wowjs,不能用import的方式,改用:

// 并发加载多个接口:
  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,
     }
  }

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

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

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

接收:

async asyncData ({ app, query }) {
  console.log(app.context.params.id) //123
}
2.获取url?获取参数,如:

/list?id=123

接收:

async asyncData ({ app, query }) {
  console.log(query.id) //123
}

在asyncData中获取参数:

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

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

-| pages/
---| index.vue
---| users/
-----| _id.vue

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

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

2.静态化

静态化是Nuxt.js打包的另一种方式,算是 Nuxt.js 的一个创新点,页面加载速度很快。
在 Nuxt.js 执行 generate 静态化打包时,动态路由会被忽略。

// nuxt.config.js
module.exports = {
  generate: {
    routes: [
      '/users/1',
      '/users/2',
      '/users/3'
    ]
  }
}

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

// 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
          }
        })
      })
    }
  }
}

运行打包,即可看见打包出来的页面。
但是如果路由动态参数的值是动态的而不是固定的,应该怎么做呢?

  • 使用一个返回 Promise 对象类型 的 函数;
  • 使用一个回调是 callback(err, params) 的 函数。
async asyncData ({ params, error, payload }) {
  if (payload) return { user: payload }
  else return { user: await backend.fetchUser(params.id) }
}

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

$ cnpm install prerender-spa-plugin --save

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

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

不足:

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

3.预渲染prerender-spa-plugin

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

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'
                    })
                }),
            ],
        };
    }
}

vue cli 3 vue.config.js配置:

new Vue({
  router,
  render: h => h(App),
  mounted () {
    document.dispatchEvent(new Event('render-event'))
  }
}).$mount('#app')

在main.js中添加:

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

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

打包出来可以看见文件,打包出文件夹/index.html,例如:about => about/index.htmlcomposants de la page

Appel :

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;
      }
    }
}
Obtenir les paramètres dans asyncData : rrreee

3 Si vous utilisez la syntaxe v-if, déployez sur Vous pouvez également rencontrer cette erreur en ligne : 4. Il y a trop de pièges, alors laissez-les de côté et mettez-les à jour plus tard.

2. Statique Statique est une autre façon d'emballer Nuxt.js. C'est une innovation de Nuxt.js, et la vitesse de chargement des pages est très rapide. Lorsque Nuxt.js exécute la génération d'un packaging statique, le routage dynamique sera ignoré. 🎜rrreee🎜Si vous avez d'abord besoin d'un routage dynamique pour générer une page statique, vous devez spécifier la valeur du paramètre de routage dynamique et le configurer dans le tableau routes. 🎜rrreee🎜Exécutez le package et vous pourrez voir la page emballée. 🎜Mais que faut-il faire si la valeur du paramètre dynamique de l'itinéraire est dynamique au lieu d'être fixe ? 🎜🎜🎜Utilisez une fonction qui renvoie un type d'objet Promise ; 🎜🎜Utilisez une fonction dont le rappel est callback(err, params). 🎜🎜rrreee🎜Nous pouvons désormais accéder à la payload depuis /users/_id.vue, comme indiqué ci-dessous : 🎜rrreee🎜Si votre itinéraire dynamique comporte de nombreux paramètres, tels que des produits Les détails peuvent se chiffrer en dizaines de milliers. Une interface est nécessaire pour renvoyer tous les identifiants, puis les identifiants sont parcourus lors de l'emballage et emballés localement. Si un produit est modifié ou retiré des rayons, il doit être reconditionné. L'emballage est également très lent et irréaliste lorsque la quantité est importante. 🎜🎜Avantages : 🎜🎜🎜🎜Fichiers purement statiques, la vitesse d'accès est super rapide ; 🎜🎜Par rapport au SSR, cela n'implique pas de problèmes de charge du serveur ; 🎜🎜Les pages Web statiques ne sont pas adaptées aux attaques de pirates informatiques et sont plus sécurisées. 🎜🎜🎜🎜Inconvénients : 🎜🎜🎜🎜Non applicable s'il existe de nombreux paramètres de routage dynamique. 🎜🎜

3. Prerender prerender-spa-plugin🎜🎜Si vous ne l'utilisez que pour améliorer le référencement de quelques pages marketing (telles que /, /about, /contact, etc.) , alors vous aurez peut-être besoin d'un pré-rendu. Au lieu d'utiliser un serveur Web pour compiler dynamiquement du HTML en temps réel, le pré-rendu génère simplement des fichiers HTML statiques pour des itinéraires spécifiques au moment de la construction. L'avantage est que la mise en place du prérendu est plus simple et vous permet de traiter votre frontend comme un site complètement statique. 🎜rrreee🎜vue cli 3 vue.config.js Configuration : 🎜rrreee🎜Ajouter dans main.js : 🎜rrreee🎜Remarque : le mode : « historique »doit être défini dans le routeur >. 🎜🎜Vous pouvez voir le fichier après l'avoir empaqueté et le placer dans le dossier /index.html, par exemple : about => html, il y a du contenu HTML à l'intérieur. 🎜🎜🎜Avantages : 🎜🎜🎜🎜Les changements sont minimes, il suffit d'introduire un plug-in et c'est fait 🎜🎜🎜🎜Inconvénients : 🎜🎜 ;
  • 无法使用动态路由;
  • 只适用少量页面的项目,页面多达几百个的情况下,打包会很很很慢;

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

Phantomjs是一个基于webkit内核的无头浏览器,即没有UI界面,即它就是一个浏览器,只是其内的点击、翻页等人为相关操作需要程序设计实现。
虽然“PhantomJS宣布终止开发”,但是已经满足对Vue的SEO处理。
这种解决方案其实是一种旁路机制,原理就是通过Nginx配置,判断访问的来源UA是否是爬虫访问,如果是则将搜索引擎的爬虫请求转发到一个node server,再通过PhantomJS来解析完整的HTML,返回给爬虫。

Une seule page Vue peut-elle faire du référencement ?

具体代码戳这里:vue-seo-phantomjs
要安装全局phantomjs,局部express,测试:

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

如果见到在命令行里出现了一推html,那恭喜你,你已经征服PhantomJS啦。
启动之后或者用postman在请求头增加User-Agent值为Baiduspider,效果一样的。

部署上线
线上要安装nodepm2phantomjs,nginx相关配置:

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

【相关推荐:vuejs视频教程web前端开发

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn