Nuxt.js 性能优化指南:从基础到进阶

作为冉冉博客的技术分享系列,今天深入探讨Nuxt.js 性能优化指南。这些技巧在我的博客运营过程中都经过实战验证,希望能帮到你。

一、Nuxt.js 服务端渲染基础

Nuxt.js 是 Vue 生态中最强大的服务端渲染框架,它结合了 Vue 的响应式优势和 SSR 的 SEO 友好特性。理解 Nuxt.js 的渲染模式是性能优化的前提。

1.1 三种渲染模式对比

// nuxt.config.ts
export default defineNuxtConfig({
  // SSR(服务端渲染)- SEO友好,首屏快
  ssr: true,
  
  // SPA(单页应用)- 客户端渲染,交互丰富
  ssr: false,
  
  // 混合模式 - 部分页面 SSR,部分 SPA
  routeRules: {
    '/': { ssr: true },
    '/dashboard': { ssr: false },
    '/blog/**': { swr: 3600 }  // 静态生成 + 增量再生成
  }
})

1.2 Nuxt 3 与 Nuxt 2 的性能差异

// Nuxt 3 基于 Vite 构建,编译速度提升 100 倍
// Nuxt 3 使用 Rollup 按需编译
// Nuxt 3 原生支持 TypeScript 和 Composition API

// 组件自动导入
// 不需要手动 import,组件会被自动扫描并注册
// pages/index.vue - 自动注册为页面组件
// components/Header.vue - 自动注册为 <Header />

二、路由懒加载与代码分割

Nux t.js 的路由懒加载能显著减少首屏加载时间。每个页面都会自动分割成独立的 JS chunk,只有访问时才加载。

2.1 路由分组与预加载

// nuxt.config.ts
export default defineNuxtConfig({
  app: {
    router: {
      options: {
        // 预加载所有页面
        prefetchLinks: true
      }
    }
  }
})

// 手动预加载特定页面
const route = useRoute()
await navigateTo('/dashboard', { force: true })

// 路由分组共享布局
// pages/blog/ 和 pages/admin/ 可以有不同布局

2.2 组件级代码分割

<!-- 动态组件懒加载 -->
<template>
  <LazyHeavyChart v-if="showChart" />
  <LazyDataTable :data="items" />
</template>

// 使用 defineAsyncComponent 细粒度控制
const AsyncHeavyModal = defineAsyncComponent({
  loader: () => import('./HeavyModal.vue'),
  delay: 200,
  timeout: 3000
})

三、图片与资源优化

图片通常是页面体积的最大来源。Nuxt 提供了 @nuxt/image 模块,自动处理图片格式转换、尺寸适配和懒加载。

3.1 Nuxt Image 最佳实践

// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxt/image'],
  image: {
    format: ['webp', 'avif'],
    quality: 80,
    screens: {
      xs: 320,
      sm: 640,
      md: 768,
      lg: 1024,
      xl: 1280,
      xxl: 1536
    }
  }
})

// 使用 <NuxtImg> 组件
<NuxtImg
  src="/hero.jpg"
  width="800"
  height="600"
  format="webp"
  loading="lazy"
  placeholder
  alt="Hero image"
/>

3.2 字体优化

// nuxt.config.ts
export default defineNuxtConfig({
  app: {
    head: {
      link: [
        {
          rel: 'preconnect',
          href: 'https://fonts.googleapis.com'
        },
        {
          rel: 'stylesheet',
          href: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap'
        }
      ]
    }
  },
  css: ['~/assets/fonts/main.css']
})

/* 使用 font-display: swap 避免FOIT */
@font-face {
  font-family: 'Inter';
  font-display: swap;
  src: url('/fonts/Inter.woff2') format('woff2');
}

四、缓存策略与状态管理

合理的缓存策略能大幅减少服务端负载。Nuxt 3 的 useFetch 和 useAsyncData 提供了开箱即用的数据缓存。

4.1 数据缓存配置

// 页面级缓存
export default defineNuxtRouteMiddleware((to, from) => {
  // 设置页面缓存时间
  const cache = useRuntimeConfig()
  if (cache.public.cachePages) {
    // 使用 SWR 策略,1小时后台静默刷新
  }
})

// 组件级数据缓存
const { data: posts } = await useAsyncData('posts', () =>
  $fetch('/api/posts'),
  {
    // 客户端缓存时间(毫秒)
    getCachedData(key, nuxtApp) {
      return nuxtApp.payload.data[key] ||
             nuxtApp.static.data[key]
    }
  }
)

4.2 状态管理优化

// 使用 useState 替代 Pinia(简单场景)
const user = useState('user', () => null)

// Pinia 持久化(避免页面刷新后状态丢失)
// stores/user.ts
export const useUserStore = defineStore('user', {
  state: () => ({ name: '', token: '' }),
  actions: {
    async fetchUser() {
      const res = await $fetch('/api/user')
      this.name = res.name
      this.token = res.token
    }
  },
  persist: {
    key: 'user',
    storage: persistedState.localStorage
  }
})

五、生产环境部署与监控

性能优化不能止步于开发环境,生产环境的部署和监控同样重要。

5.1 Nitro 服务器配置

// nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    // 压缩
    compressPublicAssets: true,
    // 资源内联阈值
    inlineDynamicImports: ['tiny-warning'],
    // 预设部署平台
    preset: 'node-server',
    // 预渲染静态页面
    prerender: {
      crawlLinks: true,
      routes: ['/', '/about', '/blog']
    }
  }
})

5.2 性能监控集成

// plugins/web-vitals.client.ts
export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hooks.hook('app:mounted', () => {
    import('web-vitals').then(({ getCLS, getFID, getLCP }) => {
      getCLS(sendToAnalytics)
      getFID(sendToAnalytics)
      getLCP(sendToAnalytics)
    })
  })
  
  function sendToAnalytics({ name, delta, id }) {
    // 上报到监控平台
    fetch('/api/metrics', {
      method: 'POST',
      body: JSON.stringify({ name, delta, id })
    })
  }
})

以上就是 Nuxt.js 性能优化指南的完整分享。这些技巧都来自冉冉博客的实战经验,希望能帮到你。有问题欢迎留言交流!

© 版权声明
THE END
喜欢就支持一下吧
点赞11
评论 抢沙发

请登录后发表评论

    暂无评论内容