坏级尹 发表于 2025-6-6 15:17:18

Nuxt3页面开发实战探索

title: Nuxt3页面开发实战探索
date: 2024/6/19
updated: 2024/6/19
author:cmdragon
excerpt:
摘要:这篇文章是关于Nuxt3页面开发实战探索的。它介绍了Nuxt3的基础入门,安装与配置,项目结构,内置组件与功能,以及页面与路由的相关内容。Nuxt3是基于Vue 3的服务器端渲染框架,旨在简化Vue应用程序的开发流程,提供最佳的性能和开发
categories:

[*]前端开发
tags:

[*]Nuxt3
[*]页面开发
[*]实战探索
[*]前端开发
[*]Vue3框架
[*]服务器端渲染
[*]开发流程优化


https://static.amd794.com/blog/images/cmdragon_cn.png扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
Nuxt3基础入门

2.1 Nuxt3简介


Nuxt3 是一个基于 Vue 3 的服务器端渲染(SSR)框架,它继承了 Nuxt.js 的核心概念,并利用 Vue 3 的最新特性,如组合式
API(Composition API)和

[*]状态管理:Nuxt3
不直接支持状态管理库,但可以配合使用外部库如Vuex。如果需要全局状态管理,可以在项目中引入Vuex,并在store
目录下创建store,然后在组件中通过mapState、mapGetters、mapActions和mapMutations来访问和管理状态。
// store/index.js
import { createStore } from 'vuex'

export default createStore({
state: {
    user: {}
},
mutations: {
    setUser(state, user) {
      state.user = user
    }
},
getters: {
    getUser: state => state.user
}
})

// 在组件中使用
import { mapState } from 'vuex'

export default {
setup() {
    const { getUser } = mapState('store')
    // ...
}
}样式与资源

5.1 样式资源目录

RC4加密解密 | 一个覆盖广泛主题工具的高效在线平台 (cmdragon.cn)
在 Nuxt3 中,样式资源通常存放在assets目录下。这个目录用于存放未编译的资源,如原始的 CSS、Sass、Less 或图片文件。Nuxt3
会自动处理这些资源,确保它们在构建过程中被正确编译和优化。
5.2 全局样式与局部样式


[*]全局样式:可以在assets/css/global.css中定义全局样式,然后在nuxt.config.ts中引入:
export default defineNuxtConfig({
css: ['~/assets/css/global.css']
})

[*]局部样式:每个组件可以有自己的局部样式,通常直接写在组件的标签内,或者通过来确保样式仅应用于该组件。
5.3 CSS预处理器与后处理器


[*]预处理器:Nuxt3 支持多种CSS预处理器,如Sass、Less和Stylus。只需在assets目录下使用相应的文件扩展名(如.scss、.less
或.styl),Nuxt3 会自动处理编译。
[*]后处理器:如PostCSS,可以通过在nuxt.config.ts中配置来使用,例如添加自动前缀:
export default defineNuxtConfig({
postcss: {
    plugins: {
      'postcss-preset-env': {
      autoprefixer: true
      }
    }
}
})5.4 资源引用与优化


[*]资源引用:在 Nuxt3 中引用资源,如图片或字体,可以直接使用相对路径或通过~/assets/前缀引用。例如:
<img src="https://www.cnblogs.com/~/assets/img/logo.png" alt="Logo">

[*]优化:Nuxt3 在构建过程中会自动优化资源,如压缩图片和合并CSS文件。此外,可以通过配置nuxt.config.ts来进一步优化,例如设置图片压缩级别:
export default defineNuxtConfig({
build: {
    extractCSS: true,
    optimizeImages: true
}
})这些配置和实践有助于确保你的 Nuxt3 应用在样式和资源管理方面既高效又易于维护。
数据交互与状态管理

6.1 数据请求与API调用

RC4Drop加密解密 | 一个覆盖广泛主题工具的高效在线平台 (cmdragon.cn)
在 Nuxt3 中,可以使用useFetch或useAsyncData函数从 API 获取数据。这两个函数都返回一个Promise,可以在组件中使用await
或.then()方法获取数据。

[*]useFetch:在组件内部使用,自动在组件挂载和更新时触发数据请求。
<template>

    <p>{{ data.title }}</p>

</template>

[*]useAsyncData:在页面组件中使用,仅在页面加载时触发数据请求。
<template>

    <p>{{ data.title }}</p>

</template>6.2 Vuex状态管理

Vuex 是 Vue.js 的官方状态管理库,可用于在 Nuxt3 应用中管理全局状态。在 Nuxt3 中使用 Vuex 需要进行一些额外的配置。

[*]安装 Vuex:npm install vuex@next
[*]创建store目录,并在其中创建index.js文件。
[*]在store/index.js中创建 Vuex 存储实例,并导出:
import { createStore } from 'vuex'

export const store = createStore({
state: () => ({
    count: 0
}),
mutations: {
    increment(state) {
      state.count++
    }
}
})
[*]在nuxt.config.ts中配置 Vuex:
export default defineNuxtConfig({
buildModules: ['@nuxtjs/vuex']
})
[*]在组件中使用 Vuex:
<template>

    <button @click="increment">{{ count }}</button>

</template>6.3 Pinia状态管理

Pinia 是一个 Vue.js 的状态管理库,可以用作 Vuex 的替代品。在 Nuxt3 中使用 Pinia 与使用 Vuex 类似,但不需要额外的配置。

[*]安装 Pinia:npm install pinia
[*]创建store目录,并在其中创建index.js文件。
[*]在store/index.js中创建 Pinia 存储实例,并导出:
import { defineStore } from 'pinia'

export const useStore = defineStore({
id: 'main',
state: () => ({
    count: 0
}),
actions: {
    increment() {
      this.count++
    }
}
})
[*]在组件中使用 Pinia:
<template>

    <button @click="increment">{{ count }}</button>

</template>6.4 数据缓存与优化

可以使用useCache函数在 Nuxt3 中缓存数据请求结果,以避免在每次请求时都重新获取数据。
<template>

    <p>{{ data.title }}</p>

</template>在这个示例中,数据请求结果会被缓存在post键下,直到缓存过期或被清除。这可以有效地减少不必要的数据请求,提高应用的性能。
SSG与SSR

7.1 静态站点生成(SSG)

Rabbit加密解密 | 一个覆盖广泛主题工具的高效在线平台 (cmdragon.cn)
Static Site Generation (SSG)是一种构建网站的方式,先在服务器端将所有内容(包括数据)预先处理和渲染成静态 HTML
文件,然后将这些文件存储在服务器上。当用户访问网站时,直接提供这些静态文件,无需服务器再次处理请求。SSG
主要适用于内容不常更新或更新频率低的网站,因为它可以提供更快的加载速度和更好的搜索引擎优化(SEO)。
Nuxt3 支持 SSG,使用nuxt generate命令生成静态站点。在nuxt.config.ts中配置 SSG:
export default defineNuxtConfig({
generate: {
    routes: ['/', '/about', '/contact']
}
})7.2 服务器端渲染(SSR)

Server-Side Rendering (SSR)是一种在服务器端生成 HTML,然后将渲染后的 HTML 传递给客户端的技术。这使得用户在页面加载时就能看到内容,提供更好的首屏体验。Nuxt3
默认就是 SSR,每个页面请求都会触发组件的完整生命周期。
在 Nuxt3 中,SSR 是通过asyncData或fetch函数在服务器端获取数据并渲染的。
7.3 混合渲染与性能优化

Hybrid Rendering,也称为客户端渲染(CSR),是 SSR 和 CSR 的结合,根据用户行为动态选择渲染方式。Nuxt3 的nuxt:render
功能允许在客户端进行渲染,以提供更好的交互体验,尤其是对于复杂的组件或需要频繁更新的部分。
性能优化方面,可以考虑以下几点:

[*]优化asyncData和fetch的性能,避免不必要的数据请求。
[*]使用nuxt:render时,确保在客户端渲染时数据已经准备就绪。
[*]使用预渲染(Prerendering)或预加载(Preloading)来加速首次加载。
7.4 SEO与搜索引擎优化

SEO(搜索引擎优化)是提高网站在搜索引擎结果中排名的过程。SSR 和 SSG 对 SEO 都有积极影响:

[*]SSR 可以直接提供完整的 HTML,有利于搜索引擎爬虫抓取和理解内容。
[*]SSG 的静态 HTML 也有利于 SEO,因为搜索引擎可以直接读取和索引。
为了优化 SEO,确保:

[*]使用语义化的 HTML 结构。
[*]避免使用 JavaScript 过度依赖,确保关键内容在没有 JavaScript 时也能被看到。
[*]使用标签提供元数据,如、和。
[*]提供sitemap.xml和robots.txt文件,帮助搜索引擎索引网站。
实战案例

8.1 博客系统

PBKDF2在线加密 | 一个覆盖广泛主题工具的高效在线平台 (cmdragon.cn)
使用 Nuxt3 构建博客系统的步骤如下:

[*]创建一个新的 Nuxt3 项目:
npx nuxi init my-blog
cd my-blog
[*]安装一个 Markdown 解析库,如marked,用于将 Markdown 文件转换为 HTML:
npm install marked
[*]在pages/posts/_slug.vue中创建一个博文页面,使用fetch函数获取 Markdown 文件并渲染:
<template>

    <h1>{{ post.title }}</h1>
   

</template>
[*]在pages/index.vue中创建一个博客列表页面,使用asyncData函数获取所有博文列表:
<template>

    <h1>博客列表</h1>
    <ul>
      <li v-for="post in posts" :key="post.slug">
      <nuxt-link :to="`/posts/${post.slug}`">{{ post.title }}</nuxt-link>
      </li>
    </ul>

</template>
[*]创建一个 API 路由,用于获取博文列表和单个博文:
// server/api/posts.js
export default defineEventHandler(async (event) => {
const { method } = event.node.req

if (method === 'GET') {
    const response = await fetch('https://api.example.com/posts')
    const data = await response.json()
    return { data }
}

if (method === 'GET' && event.context.params.slug) {
    const response = await fetch(`https://api.example.com/posts/${event.context.params.slug}`)
    const data = await response.json()
    return { data }
}

return { data: [] }
})8.2 电商网站

使用 Nuxt3 构建电商网站的步骤如下:

[*]创建一个新的 Nuxt3 项目:
npx nuxi init my-ecommerce
cd my-ecommerce
[*]安装一个图片处理库,如sharp,用于处理图片:
npm install sharp
[*]在pages/products/_slug.vue中创建一个产品详情页面,使用fetch函数获取产品信息和图片:
<template>

    <h1>{{ product.title }}</h1>
    <img :src="product.imageUrl" :alt="product.title" />
    <p>{{ product.description }}</p>

</template>
[*]在pages/index.vue中创建一个产品列表页面,使用asyncData函数获取所有产品列表:
<template>

    <h1>产品列表</h1>
    <ul>
      <li v-for="product in products" :key="product.slug">
      <nuxt-link :to="`/products/${product.slug}`">{{ product.title }}</nuxt-link>
      </li>
    </ul>

</template>
[*]创建一个 API 路由,用于获取产品列表和单个产品:
// server/api/products.js
import { createImageUrl } from '~/utils/image'

export default defineEventHandler(async (event) => {
const { method } = event.node.req

if (method === 'GET') {
    const response = await fetch('https://api.example.com/products')
    const data = await response.json()
    return { data }
}

if (method === 'GET' && event.context.params.slug) {
    const response = await fetch(`https://api.example.com/products/${event.context.params.slug}`)
    const data = await response.json()
    return {
      data: {
      title: data.title,
      image: data.image,
      description: data.description
      }
    }
}

return { data: [] }
})

// utils/image.js
export const createImageUrl = (image) => {
return `https://api.example.com/images/${image}?w=300&h=300&fit=crop`
}8.3 社交媒体平台

使用 Nuxt3 构建社交媒体平台的步骤如下:

[*]创建一个新的 Nuxt3 项目:
npx nuxi init my-social-media
cd my-social-media
[*]安装一个图片处理库,如sharp,用于处理图片:
npm install sharp
[*]在pages/posts/_slug.vue中创建一个用户动态页面,使用fetch函数获取用户动态:
<template>

    <h1>{{ post.title }}</h1>
    <img :src="post.imageUrl" :alt="post.title" />
    <p>{{ post.content }}</p>
    <ul>
      <li v-for="comment in comments" :key="comment.id">
      {{ comment.author }}:{{ comment.content }}
      </li>
    </ul>

</template>进阶技巧与优化

9.1 路由守卫与权限控制

在 Nuxt3 中,可以使用middleware函数来实现路由守卫和权限控制。middleware函数可以在页面渲染前执行,可以用于检查用户权限和鉴权。
以下是一个简单的路由守卫示例:
// middleware/auth.js
export default function ({ app, redirect }) {
if (!app.context.store.state.user.isAuthenticated) {
    return redirect('/login')
}
}在页面组件中,可以使用middleware选项来应用路由守卫:
// pages/dashboard.vue
<template>

    <h1>Dashboard</h1>
    <p>欢迎来到管理控制台!</p>

</template>9.2 打包与部署

Nuxt3 支持多种打包和部署方式,包括使用nuxt export命令生成静态站点,或使用nuxt start命令启动服务器。
以下是使用nuxt export命令生成静态站点的示例:
npm run build
nuxt export这将生成一个静态站点,可以直接部署到支持静态文件的服务器上,如 GitHub Pages、Netlify 或 Vercel。
如果需要使用服务器渲染,可以使用nuxt start命令启动服务器:
npm run build
nuxt start这将启动一个 Node.js 服务器,可以部署到支持 Node.js 的服务器上,如 Heroku、AWS Lambda 或 Google Cloud Functions。
9.3 性能优化与监控

Nuxt3 提供了多种性能优化和监控工具,包括使用nuxt telemetry命令收集匿名使用数据,或使用nuxt performance命令分析性能问题。
以下是使用nuxt telemetry命令收集匿名使用数据的示例:
npm run build
nuxt telemetry这将收集匿名使用数据并发送到 Nuxt.js 团队的服务器上,用于改进 Nuxt.js 的性能和功能。
如果需要分析性能问题,可以使用nuxt performance命令:
npm run build
nuxt performance这将生成一个性能报告,可以用于分析页面加载时间、资源加载情况和其他性能指标。
9.4 国际化与多语言

Nuxt3 支持多种国际化和多语言工具,包括使用nuxt i18n模块,或使用第三方库,如vue-i18n。
以下是使用nuxt i18n模块的示例:

[*]安装nuxt i18n模块:
npm install nuxt-i18n
[*]在nuxt.config.js中配置nuxt-i18n模块:
export default {
modules: [
    '@nuxtjs/i18n'
],
i18n: {
    locales: [
      {
      code: 'en',
      file: 'en.js'
      },
      {
      code: 'zh',
      file: 'zh.js'
      }
    ],
    defaultLocale: 'en',
    vueI18n: {
      fallbackLocale: 'en'
    }
}
}
[*]在页面组件中使用$t函数来获取翻译文本:
<template>

    <h1>{{ $t('hello') }}</h1>

</template>
[*]创建翻译文件,如locales/en.js和locales/zh.js:
// locales/en.js
export default {
hello: 'Hello, world!'
}

// locales/zh.js
export default {
hello: '你好,世界!'
}这将为应用程序添加多语言支持,用户可以在页面右下角选择语言。
附录

10.1 常见问题与解答


[*]问题:Nuxt3 与 Nuxt2 有什么区别?
答:Nuxt3 是 Nuxt2 的下一个版本,提供了更多的功能和性能优化。Nuxt3 使用了 Vue 3 和 Vite 作为底层技术,并且支持更多的构建选项和插件。
[*]问题:Nuxt3 支持哪些构建工具?
答:Nuxt3 支持使用 Vite 和 Webpack 作为构建工具。默认情况下,Nuxt3 使用 Vite 作为构建工具,但也可以使用 Webpack 作为替代方案。
[*]问题:Nuxt3 支持哪些服务器框架?
答:Nuxt3 支持使用 Express 和 Koa 作为服务器框架。默认情况下,Nuxt3 使用 Express 作为服务器框架,但也可以使用 Koa 作为替代方案。
[*]问题:Nuxt3 支持哪些数据库?
答:Nuxt3 支持使用 MongoDB 和 PostgreSQL 等数据库。可以使用@nuxtjs/mongodb和@nuxtjs/pg等插件来连接和操作数据库。
[*]问题:Nuxt3 支持哪些状态管理工具?
答:Nuxt3 支持使用 Vuex 和 Pinia 等状态管理工具。可以使用@nuxtjs/vuex和@nuxtjs/pinia等插件来集成和使用状态管理工具。
10.2 Nuxt3 社区与资源


[*]cmdragon's Blog
[*]Nuxt3 官方网站:https://nuxtjs.org/docs/guide/release-notes/nuxt3
[*]Nuxt3 官方文档:https://nuxtjs.org/docs/get-started/installation
[*]Nuxt3 官方 GitHub 仓库:https://github.com/nuxt/nuxt.js
[*]Nuxt3 社区论坛:https://forum.nuxtjs.org/
[*]Nuxt3 社区 Discord 频道:https://discord.com/invite/nuxt
[*]Nuxt3 社区 Stack Overflow 频道:https://stackoverflow.com/questions/tagged/nuxt.js
[*]Nuxt3 社区 Twitter 账号:https://twitter.com/nuxt_js
[*]Nuxt3 社区 YouTube 频道:https://www.youtube.com/channel/UC3fCJlDHUxO8QCVxr_OyKZg

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Nuxt3页面开发实战探索