Loading...
Loading...
Compare original and translation side by side
routeRules// nuxt.config.ts
export default defineNuxtConfig({
routeRules: {
'/': { prerender: true }, // Static at build time
'/products/**': { swr: 3600 }, // Cached, revalidated in background
'/blog': { isr: 3600 }, // CDN-cached, revalidated hourly
'/admin/**': { ssr: false }, // Client-side only
'/api/**': { cors: true },
},
})prerender: trueswr: Nisr: Nisr: truessr: falseredirect: '/new'headers: {}routeRules// nuxt.config.ts
export default defineNuxtConfig({
routeRules: {
'/': { prerender: true }, // 构建时生成静态资源
'/products/**': { swr: 3600 }, // 缓存,后台自动重新验证
'/blog': { isr: 3600 }, // CDN缓存,每小时重新验证
'/admin/**': { ssr: false }, // 仅客户端渲染
'/api/**': { cors: true },
},
})prerender: trueswr: Nisr: Nisr: truessr: falseredirect: '/new'headers: {}references/rendering.mdreferences/rendering.mdLazy<script setup lang="ts">
const show = ref(false)
</script>
<template>
<div>
<button @click="show = true">Load list</button>
<LazyMountainsList v-if="show" />
</div>
</template>Lazy<script setup lang="ts">
const show = ref(false)
</script>
<template>
<div>
<button @click="show = true">加载列表</button>
<LazyMountainsList v-if="show" />
</div>
</template><template>
<!-- Hydrate only when scrolled into view -->
<LazyCommentSection hydrate-on-visible />
<!-- Hydrate when browser is idle -->
<LazyAnalyticsWidget hydrate-on-idle />
<!-- Hydrate on user interaction -->
<LazyChatWidget hydrate-on-interaction />
</template><template>
<!-- 进入视口时再水合 -->
<LazyCommentSection hydrate-on-visible />
<!-- 浏览器空闲时水合 -->
<LazyAnalyticsWidget hydrate-on-idle />
<!-- 用户交互时水合 -->
<LazyChatWidget hydrate-on-interaction />
</template>useFetchuseAsyncDatauseFetchuseAsyncData// Good: data transferred via payload, no duplicate network request
const { data } = await useFetch('/api/products')
// Bad: runs separately on server and client
const data = await $fetch('/api/products')// 推荐:数据通过负载传输,无重复网络请求
const { data } = await useFetch('/api/products')
// 不推荐:在服务端和客户端分别执行
const data = await $fetch('/api/products')await<script setup>defineNuxtComponentdefineNuxtPlugindefineNuxtRouteMiddleware// Bad
const data = await someAsyncOperation()
const config = useRuntimeConfig() // context lost
// Good — call composable before await, or inside <script setup>
const config = useRuntimeConfig()
const data = await someAsyncOperation()<script setup>defineNuxtComponentdefineNuxtPlugindefineNuxtRouteMiddlewareawait// 不推荐
const data = await someAsyncOperation()
const config = useRuntimeConfig() // 上下文已丢失
// 推荐——在await之前调用composable,或在<script setup>内部调用
const config = useRuntimeConfig()
const data = await someAsyncOperation()<NuxtImg><NuxtImg><img><NuxtImg>@nuxt/imagesizes<!-- Above-the-fold / LCP image -->
<NuxtImg
src="/hero.jpg"
format="webp"
preload
loading="eager"
fetch-priority="high"
width="1200"
height="600"
/>
<!-- Below-the-fold image -->
<NuxtImg
src="/feature.jpg"
format="webp"
loading="lazy"
fetch-priority="low"
width="600"
height="400"
/>widthheight<img><NuxtImg>@nuxt/imagesizes<!-- 首屏/LCP图片 -->
<NuxtImg
src="/hero.jpg"
format="webp"
preload
loading="eager"
fetch-priority="high"
width="1200"
height="600"
/>
<!-- 非首屏图片 -->
<NuxtImg
src="/feature.jpg"
format="webp"
loading="lazy"
fetch-priority="low"
width="600"
height="400"
/>widthheight@nuxt/fonts@font-face<link rel="preload">@nuxt/fonts@font-face<link rel="preload">@nuxt/scriptsconst { proxy } = useScriptGoogleAnalytics({
id: 'G-XXXXXXXX',
scriptOptions: { trigger: 'manual' },
})
// Safe to call before script loads — events are queued
proxy.gtag('event', 'page_view')@nuxt/scriptsconst { proxy } = useScriptGoogleAnalytics({
id: 'G-XXXXXXXX',
scriptOptions: { trigger: 'manual' },
})
// 脚本加载前即可安全调用——事件会被排队
proxy.gtag('event', 'page_view')<NuxtLink><NuxtLink><NuxtLink>// nuxt.config.ts
export default defineNuxtConfig({
experimental: {
defaults: {
nuxtLink: { prefetchOn: 'interaction' },
},
},
})<NuxtLink>// nuxt.config.ts
export default defineNuxtConfig({
experimental: {
defaults: {
nuxtLink: { prefetchOn: 'interaction' },
},
},
})shallowRefshallowReactivev-oncev-memocomputedshallowRefshallowReactivev-oncev-memocomputedapp/components/app/composables/app/utils/server/utils/server/#importsimport { ref, computed, useFetch } from '#imports'app/components/app/composables/app/utils/server/utils/server/#importsimport { ref, computed, useFetch } from '#imports'| Problem | Solution |
|---|---|
| Double data fetch (server + client) | Use |
| Plugins blocking hydration | Move non-global logic to composables |
| Large bundles | Run |
| Layout shift from images | Always set |
| Unoptimized fonts | Add |
| INP degradation from third-party scripts | Add |
| Deep reactivity on large objects | Use |
Composable called after | Call composables synchronously before async operations |
| Unused dependencies bloating bundle | Audit |
| 问题 | 解决方案 |
|---|---|
| 数据重复获取(服务端+客户端) | 使用 |
| 插件阻塞水合 | 将非全局逻辑移至composable |
| 包体积过大 | 运行 |
| 图片导致布局偏移 | 始终为 |
| 字体未优化 | 添加 |
| 第三方脚本导致INP下降 | 添加 |
| 大型对象使用深度响应式 | 使用 |
在 | 在异步操作前同步调用composable |
| 未使用的依赖导致包体积膨胀 | 审核 |
npx nuxi analyzenpx nuxi analyzereferences/performance.mdrouteRulesreferences/rendering.mdreferences/performance.mdrouteRulesreferences/rendering.md