当前位置: 首页 > 知识库问答 >
问题:

segmentfault - nuxt3 axios 请求出来的数据在源代码中没有这也没有办法 SEO 呀?

隆选
2024-05-27

nuxt.config.ts 中的 ssr 也是 true

自己写的后台接口

页面显是正常的,但是右键, 查看源代码后里面没有请求回来的数据呀!

这能 SEO ?

是哪里还需要配置下吗?

nuxt.config.ts代码:

export default defineNuxtConfig({    app: {        head: {            charset: 'utf-8',            viewport: 'width=device-width, initial-scale=1',        }    },    devtools: {enabled: false},    //关闭遥测数据    telemetry: false,    modules: ['@pinia/nuxt'],    css: [        "@/assets/style/style.css"  //配置使用的样式    ],    ssr:true,})

页面代码:

<template>    <div id="body">        <div class="container">            <div id="main">                <article class="post" v-if="_length(row)>0">                    <h1 class="center">{{row.title}}</h1>                    <ul class="post-meta">                        <li>                            <time>{{dateDisplay(row.created_at)}}</time>                        </li>                        <li><a :href="row.url">默认分类</a>                        </li>                        <li><a>{{row.views}}</a> 阅读</li>                        <li><a href="#comments">评论</a></li>                    </ul>        <div class="post-content" v-html="row.content"></div>        <p class="tags">标签: <a v-for="tag in row.tag" :href="getTagUrl(tag)">{{tag}}</a></p>        <div class="post-near">            <li class="post-left">没有了</li>            <li class="post-right">没有了</li>        </div>        <div class="clearfix"></div>    </article>            </div>        </div>    </div></template><script setup lang="ts">import {onMounted,ref} from "vue";import {getArticleDetail} from "~/api/article";import type {ApiResponse,ArticleItem} from "~/types/intreface";import {dateDisplay} from "~/utils/date";import {_length} from "~/utils";import { useRoute } from '#app';const route = useRoute();const params = route.params;const id = ref(params.id);const loading = ref(false);const row = ref<ArticleItem>();onMounted(async()=>{    await fetchData();})const fetchData = async()=>{    try {        loading.value = true;        const data:ApiResponse = await getArticleDetail({id:id.value});        if(data.code!==0){            return Promise.reject(data.message);        }        row.value = data.data as ArticleItem;        if(_length(row.value.url)===0){            row.value.url = '/archives/'+row.value.slug;        }        useHead({            title: row.value.title,            meta: [                { name: 'description', content: '我的神奇网站。' }            ],            bodyAttrs: {                class: 'test'            },            script: [ { innerHTML: 'console.log(\'Hello world\')' } ]        })    }catch (e) {        loading.value = false;    }}</script><style scoped lang="less"></style>

共有1个答案

刁瀚昂
2024-05-27

SEO(搜索引擎优化)主要关注的是网页的源代码内容,因为搜索引擎的爬虫会解析这个源代码来评估网页的内容和结构。在服务器端渲染(SSR)的Nuxt应用中,所有的数据都应该在服务器端获取并注入到页面源代码中,这样爬虫就能抓取到完整的页面内容。

然而,在你的情况中,看起来你正在使用客户端的JavaScript(Vue的mounted钩子)来获取数据,这意味着数据是在页面加载到客户端后异步获取的。这种情况下,爬虫可能无法看到这些数据,因为它们是在页面加载到浏览器后才被获取的。

为了在Nuxt中实现SEO友好的数据获取,你应该在服务器端获取数据,然后将这些数据注入到页面的源代码中。你可以使用Nuxt的asyncDatafetch方法来在服务器端获取数据。

例如,你可以将你的fetchData函数移动到asyncData中,这样它将在服务器端运行,并将数据注入到页面的源代码中:

<script setup lang="ts">import { defineComponent, ref } from 'vue';import { getArticleDetail } from '~/api/article';import type { ArticleItem } from '~/types/interface';import { dateDisplay } from '~/utils/date';import { _length } from '~/utils';defineComponent({  asyncData({ $axios, params }) {    try {      const { data } = await $axios.$get('/api/article/detail', { params: { id: params.id } });      if (data.code !== 0) {        throw new Error(data.message);      }      return { row: data.data as ArticleItem };    } catch (error) {      // 处理错误      console.error(error);      return {};    }  },  setup(props) {    const { row } = props;    // ... 其他代码 ...  }});</script>

在这个例子中,asyncData方法会在服务器端运行,并接收当前页面的路由参数。它使用这些参数来从API获取数据,并将数据作为组件的props返回。这样,数据就可以在服务器端被注入到页面的源代码中,从而可以被搜索引擎爬虫抓取到。

注意,你还需要确保你的API支持服务器端请求,并且没有CORS或其他问题阻止服务器端从API获取数据。

另外,你的nuxt.config.ts中已经设置了ssr: true,这是正确的,它告诉Nuxt应用启用服务器端渲染。只要你在组件中使用asyncDatafetch来获取数据,Nuxt就会确保这些数据在服务器端被获取并注入到页面的源代码中。

 类似资料:
  • 有没有办法列出AWS中的所有资源?对于所有区域,所有资源...例如列出所有EC2实例、所有VPC、API Gateway中的所有API等...我想列出我帐户的所有资源,因为我很难找到我现在可以放弃的资源。

  • 问题内容: 我在代码中有很多地方可以处理Alamofire请求/响应。 由于某些间歇性问题(最常见的是不稳定的网络),每个请求都可能失败。 我希望能够在重试前重试请求3次。 直接的方法是拥有类似的东西 但是,出于多种原因,我不喜欢这种方法。最明显的是,我将需要为每种请求类型实现这样的代码(并且我有15种这样的代码)。 我很想知道是否有办法做类似的事情(变化很小且非侵入性) 问题答案: 通过Swif

  • 我正在将应用程序设置为在play store上上载,但play console显示错误,您需要为APK或Android应用程序包使用不同的版本代码,因为您已经有一个版本代码为1的应用程序包。我试着在Android系统中更改版本代码

  • 我正在编写一个minecraft mod,当我在forge 1.8.9中运行它时,我得到了。然而,当我运行另一个mod时,这个mod可以工作。 我的mod的反编译类文件如下所示 而另一个看起来像 无论我如何构建我的mod,我的类文件永远不会像这样结束。如何让gradle混淆代码?

  • 我有一个枚举类来存储一些像这样的分类值。 每种类型都有pydantic模型。例如: 我有这样的字典: 我有一个FastAPI路由,用户需要输入字段类型名称作为字符串(从FastAPI文档中的下拉列表),并根据选择的类型提供类型属性。如果用户选择type=“images”,则会提供相应的pydantic模型“ImageModel”供用户填写,以此类推。 选择类型名称后,有没有办法产生对应的pydan

  • 问题内容: 这个想法是在某些情况下从另一个来源获取数据,所以我有这个存根: 失败了 [$ injector:cdep]找到循环依赖项:拦截器<-$ http 还尝试注入$ injector并使用它获取$ http,结果相同。有任何想法吗? .config就是声明: 问题答案: 注入到: 用它来获取回调函数中返回的对象。 这是一个例子