>웹 프론트엔드 >프런트엔드 Q&A >Vue 단일 페이지에서 SEO를 수행할 수 있나요?

Vue 단일 페이지에서 SEO를 수행할 수 있나요?

青灯夜游
青灯夜游원래의
2022-12-20 17:58:012495검색

vue 단일 페이지에서는 SEO가 가능합니다. 방법: 1. 검색 엔진 크롤러가 완전히 렌더링된 페이지를 직접 볼 수 있도록 하는 SSR 서버 렌더링. 2. 정적, 페이지를 더 빠르게 로드할 수 있음 3. 사전 렌더링 prerender-spa-plugin 4. Phantomjs를 사용하여 크롤러를 처리합니다.

Vue 단일 페이지에서 SEO를 수행할 수 있나요?

이 튜토리얼의 운영 환경: windows7 시스템, vue3 버전, DELL G3 컴퓨터.

우리 모두 알고 있듯이 Vue SPA 단일 페이지 애플리케이션은 SEO에 적합하지 않습니다. 물론, 아래에는 최근 연구되고 사용된 몇 가지 SEO 솔루션이 있으며 Nuxt.js를 기반으로 합니다.

  • 1. SSR 서버 렌더링
  • 3. Phantomjs를 사용하여 크롤러를 처리합니다.
  • 1.SSR 서버 렌더링
  • 서버 렌더링 정보: Vue 공식 웹사이트에 따르면 Vue 버전에 대한 요구 사항과 서버에 대한 특정 요구 사항이 있으며 nodejs 환경을 지원해야 합니다.

SSR 사용의 장단점:

개발 조건에 따라 제한되며, 브라우저별 코드는 특정 수명 주기 후크 기능에서만 사용할 수 있습니다. 일부 외부 라이브러리는 서버 렌더링 애플리케이션에서 실행하려면 특수 처리가 필요할 수 있습니다.

환경 및 배포 요구 사항이 더 높으며 Node.js 서버 실행 환경이 필요합니다.
  • 트래픽이 많은 경우 해당 서버 로드를 준비하고 캐싱 전략을 현명하게 채택하십시오.
  • 장점:

검색 엔진 크롤러가 완전히 렌더링된 페이지를 직접 볼 수 있으므로 SEO가 향상됩니다.

특히 느린 네트워크 조건이나 느린 장치의 경우 콘텐츠 생성 시간이 더 빠릅니다.
  • 단점: (개발 중 발생하는 구덩이)
1. 한 세트의 코드와 두 세트의 실행 환경은 다양한 문제를 발생시킵니다. 예를 들어 서버에는 창이나 문서 개체가 없습니다. . 고객 Duancai 실행인 경우:

if(process.browser){
 console.log(window);
}
wowjs와 같은 dom 작업이 포함된 npm 패키지를 나타내며 import를 사용할 수 없습니다.
if (process.browser) {
     var { WOW } = require('wowjs');
     require('wowjs/css/libs/animate.css');
 }

2를 사용하세요. Nuxt asyncData 메소드, 페이지를 초기화하기 전에 데이터를 가져오지만

페이지 구성요소

Call: 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.html

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;
      }
    }
}

asyncData에서 매개변수 가져오기:

rrreee3에 배포합니다. 온라인에서 이 오류가 발생할 수도 있습니다. rrreee

문제 번호 1552에서는 v-ifv-show 구문으로 변경해야 한다는 메시지를 표시합니다.
  • 4. 함정이 너무 많으니 남겨두고 나중에 업데이트하세요.
  • 2. 정적

Static은 Nuxt.js를 패키징하는 또 다른 방법으로, 페이지 로딩 속도가 매우 빠릅니다. Nuxt.js가 정적 패키징 생성을 실행하면 동적 라우팅이 무시됩니다. rrreee

먼저 정적 페이지를 생성하기 위해 동적 라우팅이 필요한 경우 동적 라우팅 매개변수의 값을 지정하고 경로 배열에서 이를 구성해야 합니다. 🎜rrreee🎜패키지를 실행하면 패키징된 페이지를 보실 수 있습니다. 🎜그러나 경로 동적 매개변수의 값이 고정이 아닌 동적이면 어떻게 해야 합니까? 🎜🎜🎜Promise 객체 유형을 반환하는 함수를 사용하세요. 🎜🎜콜백이 callback(err, params)인 함수를 사용하세요. 🎜🎜rrreee🎜이제 아래와 같이 /users/_id.vue에서 페이로드에 액세스할 수 있습니다. 🎜rrreee🎜동적 경로에 제품과 같은 많은 매개변수가 있는 경우 세부 사항은 수만 개가 될 수 있습니다. 모든 ID를 반환하려면 인터페이스가 필요하며, 포장 중에 ID를 통과하여 로컬로 포장됩니다. 제품이 수정되거나 진열대에서 제거되는 경우에도 수량이 많을 경우 포장이 매우 느리고 비현실적입니다. 🎜🎜장점: 🎜🎜🎜🎜순수한 정적 파일로 액세스 속도가 매우 빠릅니다. 🎜🎜SSR과 비교하여 서버 로드 문제가 없습니다. 🎜🎜정적 웹 페이지는 해커 공격에 적합하지 않으며 더 안전합니다. 🎜🎜🎜🎜단점: 🎜🎜🎜🎜동적 라우팅 매개변수가 많은 경우에는 적용할 수 없습니다. 🎜🎜

3. 사전 렌더링 prerender-spa-plugin🎜🎜 일부 마케팅 페이지(예: /, /about, /contact 등)의 SEO를 개선하는 데에만 사용하는 경우 , 사전 렌더링이 필요할 수 있습니다. HTML을 실시간으로 동적으로 컴파일하기 위해 웹 서버를 사용하는 대신, 사전 렌더링은 빌드 시 특정 경로에 대한 정적 HTML 파일을 생성합니다. 장점은 사전 렌더링 설정이 더 간단하고 프런트엔드를 완전히 정적인 사이트로 처리할 수 있다는 것입니다. 🎜rrreee🎜vue cli 3 vue.config.js 구성: 🎜rrreee🎜main.js에 추가: 🎜rrreee🎜참고: mode: “history”는 라우터 >. 🎜🎜파일을 패키징한 후 /index.html 폴더에 패키징할 수 있습니다. 예: about => html, 안에 html 내용이 있습니다. 🎜🎜🎜장점: 🎜🎜🎜🎜변경 사항은 적습니다. 플러그인만 도입하면 끝납니다. 🎜🎜🎜🎜단점: 🎜🎜
  • 无法使用动态路由;
  • 只适用少量页面的项目,页面多达几百个的情况下,打包会很很很慢;

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

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

Vue 단일 페이지에서 SEO를 수행할 수 있나요?

具体代码戳这里: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前端开发

위 내용은 Vue 단일 페이지에서 SEO를 수행할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.