gpt4 book ai didi

javascript - Vue/Nuxt 异步元标记生成

转载 作者:行者123 更新时间:2023-12-04 12:42:54 24 4
gpt4 key购买 nike

我们有一个用 vue.js 和 nuxt 构建的网页。我们使用 nuxt generate生成静态 html 文件,其中还应包含 SEO 和 og 标签。
这就是我们使用 nuxt's head () 的原因。生成元信息。

到目前为止,一切都很好。
但是现在我们有一个页面可以将帖子异步加载到 nested route 中。 .如果您转到该页面,它会通过 ajax 调用加载帖子的数据。然后它将使用帖子的元数据来填充 <head> .

元信息会在一段时间后正确更新(加载帖子后)但是当我们使用 nuxt generate 时当我们使用 head () 生成元信息时,帖子的数据和元信息不存在.

这就是为什么我们的静态 html 不包含必要的元信息。
对此有什么可能的解决方案?
理想的情况是生成过程等待帖子被加载。可以用promise解决吗?还是有其他想法?

这里this.post首先设置为false。
我们的辅助函数 generateMetaInfo 被调用,但显然没有正确的数据。

head () {
this.log('this.post: ', this.post)
if (this.post) {
return generateMetaInfo(this.post)
}
}

当调用 url 时,我们像这样加载帖子:
getPost () {
// Only if postSlug is present
if (this.$route.params.postSlug) {
// If postslug > try to get it from store
if (this.getCompletePostBySlug(this.$route.params.postSlug)) {
this.activePost = this.getCompletePostBySlug(this.$route.params.postSlug)
}
// if it is not in store get it via axios
else {
const ax = axios.create({
baseURL: `${window.location.origin}/${this._checkRouteByString('programm') ? 'events' : 'posts'}`
})
ax.get(`posts.${this.$i18n.locale}.${this.$route.params.postSlug}.json`)
.then((response) => {
const newActivePost = response.data && response.data.items ? response.data.items.find(p => p.slug === this.$route.params.postSlug) : false
if (newActivePost) {
this.post = newActivePost
this.$store.dispatch('data/saveCompletePosts', this.activePost)
} else {
this.post = '404'
}
})
.catch((error) => {
// console.log(error.response)
})
}
} else {
this.setActivePost()
}
},

所以我们必须等待 ajax 调用完成。

非常感谢任何可以帮助我们找到解决方案的想法。

干杯

==============================

编辑:

使用 promise 也不起作用:
methods: {
getPostMeta: async function () {
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
const result = {
title: 'Promise Title Test',
meta: [
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ name: 'keywords', content: 'keyword 1, keyword 2'},
{ hid: 'description', name: 'description', content: 'PROMISE. This is the generic promise descr.'}
]
}
resolve(result)
}, 1000)
})

let result = await promise
console.log('result: ', result)

return result
}
},
head () {
return this.getPostMeta()
}

这不会等到 promise 得到解决... :(
(当然这只是一个超时的例子,在现实世界中,这必须通过 ajax 调用进行交换,获取帖子的数据)

最佳答案

Nuxt 是一个很棒的框架,但是 SEO 和在动态路由上分配元标记非常困难。这可能是它不太好的极少数原因之一。

我认为这里的主要问题是您试图从仅在 promise 或函数解决后调用的方法中加载元数据,这意味着在页面呈现之前它永远不会获取元数据。我不会为此使用函数或 promise 。

本质上,我发现解决此问题的方法是您需要以格式加载所有元数据(加上您的帖子名称作为 id 或其他内容)

posts: [
{
slug: 'some_id',
meta: [
{
name: 'title',
content: 'some_title'
},
{
...
]
},
{
...

将您的动态页面放入一个数组中-例如,我正在使用 VueX Store 来执行此操作-然后您可以使用如下语句
this.$store.state.array.find(p => p.slug === this.$route.params.postSlug).meta

在您的 .vue 文件中,其中 id 是您要与路由参数进行比较的任何值。这将返回元数据数组。

我意识到这有点低效,大多数人可能一想到它就会畏缩,但它似乎对动态路线非常有效。

我的 head() 方法看起来像这样
head() {
return {
title: "Title " + this.$route.params.id,
meta: this.$store.state.results.find((result) => result.id === this.$route.params.id).meta
}
}

这对我来说非常有效。如果你真的尝试这个,我很想知道它是怎么回事。

干杯

关于javascript - Vue/Nuxt 异步元标记生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51962020/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com