BOYYANG/1/blog/古风少女 遮脸 4k动漫壁纸 3840x2160_彼岸图网

nuxt3由于自定义指令导致seo失效原因

作者: boyyang
分类: 前端开发
发布: 2024-04-05 02:03:23
更新: 2025-03-23 11:51:55
浏览: 398

       在之前进行代码负优化,代码部署上线后发现博客详情页面的seo失效了。下面为报错信息:

Cannot read properties of undefined (reading 'getSSRProps')

       将报错信息进行搜索后,发现其他使用者也有过类似的情况,但是试过好像无用,网上可行方案如下 dome地址

但是在此之前我的seo还是处于正常工作的。

       我的自定义指令代码(plugins/highlight.ts):

import hljs from 'highlight.js'
import {defineNuxtPlugin} from '#app'
import 'highlight.js/styles/monokai-sublime.css'

export default defineNuxtPlugin((nuxtApp) => {
    nuxtApp.vueApp.directive('highlight',
        {
            mounted(el) {
                let element = el.querySelectorAll('pre code')
                element.forEach((block: any) => {
                    hljs.highlightElement(block)
                })
            },
            getSSRProps(binding, vnode) {
                // 你可以在这里提供SSR特定的props
                return {}
            },
        },
    )
})      

       在nuxt.config.ts中的错误配置如下:

export default defineNuxtConfig({
    plugins: [
        {
            src: '~/plugins/highlight.ts',
            mode: 'client', // 这样配置会导致报错
        },
    ]    
})

       由于自定义指令highlight在服务端也有使用,但是我把mode改成了client,导致服务端报错,进而导致seo失效,也就是说如果这个指令你只在客户端有使用,你可以将mode设置为client,但是如果你在服务端以及客户端都有使用该指令,那么你得将mode修改为all.

       官方提示有说:(链接)

如果你注册了一个Vue指令,你必须在客户端和服务器端都注册它,除非你只在一个端口渲染时使用它。如果这个指令只在客户端有意义,你可以将它移动到~/plugins/my-directive.client.ts,并在~/plugins/my-directive.server.ts中为服务器端提供一个'存根'指令

       所以将mode 改为all或者直接将mode删除,也就解决了该问题

export default defineNuxtConfig({
    plugins: [
        {
            src: '~/plugins/highlight.ts',
            mode: 'all',
        },
    ]    
})

       修改后重新打包部署也就解决了该问题,不得不说,代码优化也是bug来源

#vue3
#nuxt3
#SEO
#前端
#自定义指令