nuxt问题
- 错误处理?
nuxt发生server Error解决
-
nuxt项目发生错误导致整个页面渲染出现Server Error
-
一个页面有多个的并发请求,其中只要有一个请求出现问题,那整个页面就出不了
-
这种一般是捕捉asyncData网络请求错误
问题:
- 1、在用nuxt的时候怎么才能够尽可能的保证接口出问题时,页面不会完全崩溃?
- 2、如何快速定位错误?
解决:
- 通过配置错误页面,统一将相关错误跳转到自定义错误的页面
nuxt 服务端/客户端执行问题
- 以下代码都会执行,执行顺序是 先服务端渲染,后客户端渲染
- 这是nuxt 服务端渲染的工作流程
- 当用户请求页面的时候,服务端会读取代码来生成HTML,返回给客户端,客户端加载HTML,因此客户端和服务端都会执行
<template>
<div> test</div>
</template>
<script lang="ts">
if (import.meta.server) {
console.log("服务端渲染");
} else {
console.log("客户端渲染");
}
</script>
注意问题
- 某些组件,如果涉及到DOM的事件操作,需要使用client-only>来包裹,避免在服务端执行渲染报错
- 但是注意一点,如果纯使用
client-only的话,在服务端渲染期间,会出现空白 - 首屏出现空白,这是用户体验极其不好的问题,需要去避免,这也会影响seo
- 比如在服务端渲染期间,先输出DOM结构,保证首屏有内容, 而相关DOM事件操作,在客户端来执行
- 最佳实战:
- 服务端ssr渲染期间:输出DOM结构内容 (保证首屏体验)
- 客户端csr渲染期间:操作DOM、交互相关事件
- 但是注意一点,如果纯使用
调试nuxt
- 1、开启debug
nuxt请求缓存问题
- nuxt的useFetch默认会对url进行缓存,如果进行的url相同,会返回相同的结果
默认情况下,如果你在同一个页面生命周期内,或在服务端渲染(SSR)期间重复请求相同的 URL,Nuxt 会自动缓存第一次请求的结果,后续相同的请求不会重新发送,而是复用缓存的数据
| 场景 | 是否缓存 | 说明 |
|---|---|---|
| 多次请求相同 URL,未设置 key | ✅ 缓存 | 默认会返回第一次请求的结果 |
设置不同 key | ❌ 不缓存 | 被视为不同请求 |
设置 cache: false | ❌ 不缓存 | 强制跳过缓存,重新发请求 |
| 请求参数不同(如 query) | ✅/❌ 视 URL 而定 | URL 不同就不缓存,URL 相同才缓存 |
nuxt内存溢出
使用组件库问题
- Nuxt UI(@nuxt/ui)里几乎所有交互式组件(UTabs、UAccordion、USelectMenu、UCarousel……)在 SSR(服务端渲染)时都无法正确回显 v-model 的默认值
- 必须等客户端 hydration 完成后才“突然跳到正确的位置”,而且如果不包
ClientOnly甚至会直接报错或白屏
- 必须等客户端 hydration 完成后才“突然跳到正确的位置”,而且如果不包
- 传统的组件库中相关的状态都是通过客户端状态来驱动的,比如事件绑定
- 为了解决交互式组件回显问题,可以使用无头组件如HeadlessUI
- Headless UI 的“事件”只是状态更新逻辑,并不依赖 DOM 状态,因此可以兼容SSR
解决标签栏回显问题
-
可使用导航栏菜单,每一个菜单标签都使用链接导航,替代了标签栏这种回显问题
-
导航菜单路径 pages/tabs
- pages/tabs/index.vue
- pages/tabs/one.vue
- pages/tabs/two.vue
<template>
<div class="flex justify-center items-center flex-col">
<span class="bg-amber-200">nuxt-tabs demo</span>
<UNavigationMenu :items="links" highlight class="-mx-1 flex-1" />
<div class="p-8">
<NuxtPage />
</div>
</div>
</template>
<script setup lang="ts">
import type { NavigationMenuItem } from '@nuxt/ui'
const links = [
{ label: '默认tab', to: '/tabs', exact: true },
{ label: 'tab1', to: '/tabs/one' },
{ label: 'tab2', to: '/tabs/two' },
] as NavigationMenuItem[]
</script>