Nuxt3项目从零开始开发

news2024/11/18 22:22:55

之前讲过Nuxt3项目新建和配置:《Nuxt3从零开始配置与打包发布_nuxt打包发布_范特西_jay的博客-CSDN博客》

本篇文章主要讲解一些nuxt3的基本功能。

Nuxt3官网:https://nuxt.com/docs

Nuxt3的官方库:https://nuxt.com/modules

常用的库有:Element Plus、Vant、color-mode、axios,其他库可以根据需求查找使用。(注意安装时候要按照nuxt3方式安装和引用)

Nuxt3官方提供的案例:https://nuxt.com/showcase

一、先看一下第三方库的安装方法

1、Nuxt3安装Element Plus nuxt3版本:

npm install -D @element-plus/nuxt

 配置:

// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@element-plus/nuxt'],
})

库的组件使用时候直接在页面写即可,无需导入,会自动导入。

2、color-mode安装 (https://nuxt.com/modules/color-mode):

color-mode用于实现网页的浅色模式和暗黑模式,支持自定义颜色模式和跟随系统模式。

npm install --save-dev @nuxtjs/color-mode

配置:

export default defineNuxtConfig({
  modules: ['@nuxtjs/color-mode'],
  colorMode: {
    preference: 'system', // 默认模式(system/light/dark/sepia)
    fallback: 'light', // 失败后使用的颜色模式
    hid: 'nuxt-color-mode-script',
    globalName: '__NUXT_COLOR_MODE__',
    componentName: 'ColorScheme',
    classPrefix: '',//类名前缀
    classSuffix: '-mode',//类名后缀
    storageKey: 'nuxt-color-mode'//localStorage存储的key
  }
})

官方示例:

<template>
  <div>
    <h1>Color mode: {{ $colorMode.value }}</h1>
    <select v-model="$colorMode.preference">
      <option value="system">System</option>
      <option value="light">Light</option>
      <option value="dark">Dark</option>
      <option value="sepia">Sepia</option>
    </select>
  </div>
</template>
<script setup>
const colorMode = useColorMode()
console.log(colorMode.preference)
</script>
<style>
body {
  background-color: #fff;
  color: rgba(0,0,0,0.8);
}
.dark-mode body {
  background-color: #091a28;
  color: #ebf4f1;
}
.sepia-mode body {
  background-color: #f1e7d0;
  color: #433422;
}
</style>

这里推荐color-mode结合Element Plus来实现浅色和暗黑模式切换,这样就不用自己写浅色和暗黑模式的css样式了(暗黑模式 | Element Plus)。

引入配置Element Plus暗黑模式样式类:

//只需要如下在项目入口文件修改一行代码:
import 'element-plus/theme-chalk/dark/css-vars.css'

实际上实现的是可以创建一个开关来控制暗黑模式的class 类名。

<html class="dark">
  <head></head>
  <body></body>
</html>

项目里,创建colorMode变量:

<script setup>
const colorMode = useColorMode()
console.log(colorMode.preference)

... ...

</script>

由于是SSR模式,所以当我们调试或者部署时候,会出现获取到的colorMode.preference 不准确问题,所以我这里又单独弄了个localStorage来时时存储哪种主题颜色模式。

<script setup>
import { ref, onMounted } from "vue";
import { ElMessage } from "element-plus";
const colorMode = useColorMode();

const darkMode = ref("");

const isDark = ref('light');

//读取当前主题颜色模式(仅供参考)
onMounted(() => {
  isDark.value = localStorage.getItem('darkMode') == null ? 'light' :     
  localStorage.getItem('darkMode');
  colorMode.preference = isDark.value;
  if (isDark.value == 'light') {
    darkMode.value = "浅 色";
  } else if (isDark.value == 'dark') {
    darkMode.value = "暗 黑";
  } else if (isDark.value == 'system') {
    darkMode.value = "系 统";
  }
});

//点击切换主题模式(仅供参考)
function toggleDarkMode() {
  if (isDark.value == 'light') {
    darkMode.value = "暗 黑";
    colorMode.preference = 'dark';
    localStorage.setItem('darkMode', 'dark');
    isDark.value = 'dark';
  } else if (isDark.value == 'dark') {
    darkMode.value = "系 统";
    colorMode.preference = 'system';
    isDark.value = 'system';
    localStorage.setItem('darkMode', 'system');
  } else if (isDark.value == 'system') {
    darkMode.value = "浅 色";
    colorMode.preference = 'light';
    isDark.value = 'light';
    localStorage.setItem('darkMode', 'light');
  }
}

</script>

3、axios安装:

npm install axios

axios在Nuxt3中安装方法和使用方法和在Vue3项目中是一样的。

function getData(url: string) {
  const api = axios.create({
    baseURL: "https://api.github.com/search/repositories?q=v&sort=stars",
    timeout: 60000,
    withCredentials: false,
    method: "get",
    headers: {
      "Content-Type": "application/json",
    },
  });
  api.get(url).then((res) => {
    console.log(res);
  });
}

4、Nuxt3安装和引入使用vueUse库

安装:

npm i -D @vueuse/nuxt @vueuse/core

配置:

// nuxt.config.ts
export default defineNuxtConfig({
  modules: [
    '@vueuse/nuxt',
  ],
})

二、设置全局默认的title、meta、keywords、description、content等信息

在nuxt.config.ts中提供app.head属性。允许你为整个应用程序定制head。示例如下:

export default defineNuxtConfig({
  app: {
    head: {
      charset: 'utf-16',
      viewport: 'width=500, initial-scale=1',
      title: 'My App',
      meta: [
        // <meta name="description" content="My amazing site">
        { name: 'description', content: 'My amazing site.' }
      ],
      link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }],
    }
  }
})

如果你想单独在某个页面设置title,可以使用useHead。示例代码:

<script setup lang="ts">
useHead({
  title: 'My App',
  meta: [
    { name: 'description', content: 'My amazing site.' }
  ],
  bodyAttrs: {
    class: 'test'
  },
  script: [ { children: 'console.log(\'Hello world\')' } ]
})
</script>

可配置属性如下:

interface MetaObject {
  title?: string
  titleTemplate?: string | ((title?: string) => string)
  base?: Base
  link?: Link[]
  meta?: Meta[]
  style?: Style[]
  script?: Script[]
  noscript?: Noscript[];
  htmlAttrs?: HtmlAttributes;
  bodyAttrs?: BodyAttributes;
}

你可以在link和 script元标签上使用body: true 选项将它们附加到<body>标签的末尾。

<script setup lang="ts">
useHead({
  script: [
    {
      src: 'https://third-party-script.com',
      body: true
    }
  ]
})
</script>

添加动态标题。titleTemplate被设置为一个带有 %s占位符的字符串或function,这允许更大的灵活性来动态设置 Nuxt app的每个路由的页面标题:

<script setup>
  useHead({
    // as a string,
    // where `%s` is replaced with the title
    titleTemplate: '%s - Site Title',
    // ... or as a function
    titleTemplate: (productCategory) => {
      return productCategory
        ? `${productCategory} - Site Title`
        : 'Site Title'
    }
  })
</script>

添加外部CSS:

<script setup lang="ts">
useHead({
  link: [
    {
      rel: 'preconnect',
      href: 'https://fonts.googleapis.com'
    },
    {
      rel: 'stylesheet',
      href: 'https://fonts.googleapis.com/css2?family=Roboto&display=swap',
      crossorigin: ''
    }
  ]
})
</script>

三、使用Nuxt3自带的useFetch拉取数据

Nuxt提供了useFetch, useLazyFetch, useAsyncData和useLazyAsyncData来处理应用程序中的数据获取,这里我们只介绍useFetch用法。(注意useFetch请求只能放在script根目录或者生命周期回调里或者自己自定义个async异步方法)

基本示例:

async function getFetchListData() {
  const { data, pending, error, refresh } = await useFetch("https://api.nuxtjs.dev/mountains", { method: 'get' })
  console.log(data.value[0].title);
}

//如果提示data这里有错误,可以按照如下的改写

async function getFetchListData() {
  const { data, pending, error, refresh }:any = await useFetch("https://api.nuxtjs.dev/mountains", { method: 'get' })
  console.log(data.value[0].title);
}

useFetch类型:

function useFetch(
  url: string | Request | Ref<string | Request> | () => string | Request,
  options?: UseFetchOptions<DataT>
): Promise<AsyncData<DataT>>
type UseFetchOptions = {
  key?: string
  method?: string
  query?: SearchParams
  params?: SearchParams
  body?: RequestInit['body'] | Record<string, any>
headers?: Record<string, string> | [key: string, value: string][] | Headers
baseURL?: string
server?: boolean
lazy?: boolean
immediate?: boolean
default?: () => DataT
transform?: (input: DataT) => DataT
pick?: string[]
watch?: WatchSource[]
}
type AsyncData<DataT> = {
  data: Ref<DataT>
  pending: Ref<boolean>
  refresh: (opts?: { dedupe?: boolean }) => Promise<void>
  execute: () => Promise<void>
  error: Ref<Error | boolean>
}

useFetch参数:

  • URL: 要获取的URL。
  • Options (extends unjs/ofetch options & AsyncDataOptions):
    • method: 请求方法。
    • query: 使用 ufo 添加查询搜索参数到URL。
    • params:query 的别名。
    • body: 请求体-自动字符串化(如果传递了一个对象)。
    • headers: 请求头。
    • baseURL: 请求的基本URL。
  • Options (from useAsyncData):
    • key: 一个唯一的键,以确保数据获取可以正确地跨请求去重复数据,如果没有提供,它将基于使用useAsyncData的静态代码位置生成。
    • server: 是否从服务器上获取数据(默认为true)。
    • default: 一个工厂函数,在async函数解析之前设置数据的默认值——lazy: true选项尤其有用。
    • pick: 只从handler函数结果中选择该数组中的指定键。
    • watch: 监视响应源以自动刷新。
    • transform: 解析后可用于改变handler函数结果的函数。
    • immediate: 当设置为false时,将阻止请求立即触发。(默认为true)

useFetch返回值:

  • data: 传入的异步函数的结果。
  • pending: 一个布尔值,指示是否仍在提取数据。
  • refresh/execute : 可用于刷新handler函数返回的数据的函数。
  • error: 如果数据获取失败,则错误对象。

默认情况下,Nuxt要等到refresh完成后才能再次执行。

使用拦截器:

const { data, pending, error, refresh } = await useFetch('/api/auth/login', {
  onRequest({ request, options }) {
    // Set the request headers
    options.headers = options.headers || {}
    options.headers.authorization = '...'
  },
  onRequestError({ request, options, error }) {
    // Handle the request errors
  },
  onResponse({ request, response, options }) {
    // Process the response data
    return response._data
  },
  onResponseError({ request, response, options }) {
    // Handle the response errors
  }
})

四、主动路由跳转

Nuxt3自带router和route,直接定义使用即可。

const router = useRouter();

示例如下:

<script setup>
import isMobile from './utils/isMobile';
const router = useRouter();

onMounted(() => {
  if (isMobile.Any()) {
    router.push("/wap/");
  } else {
    router.push("/");
  }
});
</script>

五、Nuxt3自定义错误页面

Nuxt3自定义错误页面,只需要在项目根目录新建一个error.vue页面即可。

页面里通过定义useError来获取返回的错误信息,展示到页面上。

const error = useError()

示例代码:

<template>
  <div>
    {{error.statusCode}}-自定义错误页面
  </div>
</template>
<script setup>

const error = useError();

onMounted(() => {
  console.log(error.value.statusCode);
});
</script>

六、打包部署,并自定义运行的端口号

推荐使用pm2进行运行,并自定义端口号。

pm2常用命令:

pm2 start app.js              # 启动app.js应用程序
pm2 start app.js -i 4         # cluster mode 模式启动4个app.js的应用实例
                              # 4个应用程序会自动进行负载均衡
pm2 start app.js --name="api" # 启动应用程序并命名为 "api"
pm2 start app.js --watch      # 当文件变化时自动重启应用
pm2 start script.sh           # 启动 bash 脚本
pm2 list                      # 列表 PM2 启动的所有的应用程序
pm2 monit                     # 显示每个应用程序的CPU和内存占用情况
pm2 show [app-name]           # 显示应用程序的所有信息
pm2 logs                      # 显示所有应用程序的日志
pm2 logs [app-name]           # 显示指定应用程序的日志
pm2 flush                     # 清空所有日志文件
pm2 stop all                  # 停止所有的应用程序
pm2 stop 0                    # 停止 id为 0的指定应用程序
pm2 restart all               # 重启所有应用
pm2 reload all                # 重启 cluster mode下的所有应用
pm2 gracefulReload all        # Graceful reload all apps in cluster mode
pm2 delete all                # 关闭并删除所有应用
pm2 delete 0                  # 删除指定应用 id 0
 
pm2 scale api 10              # 把名字叫api的应用扩展到10个实例
pm2 reset [app-name]          # 重置重启数量
pm2 startup                   # 创建开机自启动命令
pm2 save                      # 保存当前应用列表
pm2 resurrect                 # 重新加载保存的应用列表
pm2 update                    # Save processes, kill PM2 and restore processes
pm2 generate                  # Generate a sample json configuration file

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/437757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Camtasia Studio2023mac电脑最新屏幕录制编辑工具

作为一个自媒体人&#xff0c;每天都要录制编辑视频&#xff0c;选择一个好的视频编辑工具就是大家首先面临的一个难题&#xff0c;选择一个好工具&#xff0c;可以起到事半功倍的效果&#xff0c;大大提高工作效率。视频编辑非常多&#xff0c;今天给大家推荐的是一款功能强大…

最经典的电脑病毒,适合练手,大家一定要增强安全防范意识

资源地址&#xff1a; 最经典的电脑病毒&#xff0c;坑死自己和别人 大部分都是恶作剧病毒&#xff0c;适合小白练手 感想&#xff1a;病毒种类多种多样&#xff0c;要搞清楚原理&#xff0c;增强安全防范意识啊 示意图&#xff1a; 病毒原理 熊猫烧香病毒会删除扩展名为g…

maven的下载和配置

目录 一、配置核心程序 1、MAVEN下载 2、指定本地仓库 3、配置阿里云提供的镜像仓库 4、配置Maven工程的基础JDK版本 二、配置环境变量 1、检查JAVA_HOME配置是否正确 2、配置MAVEN_HOME 3、配置PATH 4、验证 一、配置核心程序 1、MAVEN下载 官网&#xff1a;https:…

Yolov8 引入CVPR 2023 BiFormer: 基于动态稀疏注意力构建高效金字塔网络架构,对小目标涨点明显

1.BiFormer介绍 论文:https://arxiv.org/pdf/2303.08810.pdf 代码:GitHub - rayleizhu/BiFormer: [CVPR 2023] Official code release of our paper "BiFormer: Vision Transformer with Bi-Level Routing Attention" 背景:注意力机制是Vision Transformer的核心…

Redis 持久化八股文

目录 Redis的持久化机制 持久化方式对比 RDB RDB 持久化 RDB 的优缺点 优点 缺点 RDB 快照时运行修改数据吗 RDB 快照时修改数据过程 写时复制技术 RDB 的执行频率 增量快照 AOF 如何开启AOF AOF 为什么要采用后写日志呢&#xff1f; 后写日志的弊端 AOF 的优…

gulp对原生jquery项目的css和js文件进行压缩

安装 Node.js 和 Gulp&#xff1b; 在项目根目录下创建 package.json 文件并添加项目所需的依赖&#xff1b; 创建一个名为 gulpfile.js 的文件&#xff0c;并在其中编写任务&#xff1b; 在任务中引入所需的 Gulp 插件&#xff0c;例如 gulp-uglify&#xff1b; 编写任务…

下一代智能座舱风口下,“超级”Tier 1强势崛起

智能座舱进入全新周期&#xff0c;强者愈强的趋势会快速显现。 可以观察到&#xff0c;智能座舱功能日趋多元化。从多屏互动到舱内全场景多元交互&#xff0c;到更多娱乐平台的上线&#xff0c;智能座舱已经从最初的重多功能转变成重体验。 从架构层面来看&#xff0c;各个功…

电脑端(PC)按键精灵——4.控制命令(判断、循环、跳转)

电脑端(PC)按键精灵——4.控制命令&#xff08;判断、循环&#xff09; 注&#xff1a;说了键盘、鼠标、其他命令还有安装内容&#xff0c;现在说下控制命令&#xff0c;也就是非常有用的判断和循环操作 按键精灵小白入门详细教程&#xff1a; 电脑端(PC)按键精灵—小白入门…

minicom -s 中“Save setup as ...“命名后保存的配置怎么读取,通过-s加配置名即可

文章目录 快速通道问题背景minicom配置文件吐槽总结 (但凡我看一眼man或者help都不会有这个问题&#xff0c;不能太依赖AI) 快速通道 # 直接通过配置文件启动连接 minicom [配置名字] # 读取配置文件并打开配置菜单 minicom -s [配置名字]问题背景 我刚开始使用minicom&#x…

手机如何访问电脑文件?(iOS和Android)

可以通过手机访问电脑文件吗&#xff1f; “我需要在我的电脑上查看一个文件&#xff0c;但我现在在外面无法实际访问它。我可以通过手机访问我的电脑文件吗&#xff1f;” 答案当然是可以的&#xff0c;无论您使用的是iOS设备还是Android设备&#xff0c;您都可以通过手机…

万里挑一,这4款软件真的太好用了,用一次就离不开

一、LastPass 互联网时代&#xff0c;我们登录很多平台都需要账号密码&#xff0c;但出于安全考虑&#xff0c;你可能会不同的平台有不同的账号及密码。那你是不是还在用手机便签或者纸张去记录&#xff0c;到时候还得一个个输入想想就挺麻烦的。 有这么一款软件&#xff0c;就…

如何vue使用ant design Vue中的select组件实现下拉分页加载数据,并解决存在的一个问题。

需求&#xff1a;拉下菜单中数据过多&#xff0c;200条以上&#xff0c;就会导致select组件卡死。所以需要使用滑动到底部使其分页加载 可以借助 onPopupScroll 事件来监听下拉菜单的滚动事件&#xff0c;并判断当前是否已经到达了下拉菜单底部。具体可以通过以下步骤实现&…

什么是DeFi

随着社会的不断进步&#xff0c;区块链技术的不断完善和发展&#xff0c;去中心化金融&#xff08;DeFi&#xff09;成为了区块链领域中很热门的话题之一。DeFi是一种运行在区块链上的金融系统&#xff0c;它的目的是通过去除中心化的机构和服务商&#xff0c;实现全球范围内的…

从语言模型到ChatGPT,大模型调教全攻略

文&#xff5c;python 前言 你是否想过&#xff0c;为什么ChatGPT能够如此火爆呢&#xff1f;我认为这主要是因为ChatGPT提供了好玩、有用的对话式交互功能&#xff0c;能够为用户提供帮助&#xff0c;而不仅仅是依靠“大”模型的魅力。毕竟&#xff0c;GPT-3在2020年就已经推出…

Python OpenCV 3.x 示例:1~5

原文&#xff1a;OpenCV 3.x with Python By Example 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 计算机视觉 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 当别人说你没有底线的时候&#xff0c;你最…

文章改写神器-文章生成器免费版

文章伪原创工具 您是否在写文章时感到烦恼&#xff0c;因为您必须为每个不同的平台创建不同的版本&#xff1f;或者您是否感到沮丧&#xff0c;因为您的文章没有通过Google搜索引擎优化SEO&#xff1f; 如果您回答了“Yes”对于上述问题&#xff0c;那么“文章伪原创工具”就…

国家数据局来了,数据市场“黑暗丛林”时代将终结丨数字价值观察室·直播...

【《数字价值观察室》是钛媒体与ITValue联合推出的一档有关企业数字化的深度视频访谈栏目&#xff0c;脱胎于已连续举办十余届的全球数字价值峰会。栏目内容将聚焦产业人士最为关注的数字化问题&#xff0c;邀请行业专家、企业家等作为“观察员”现场论道&#xff0c;探寻数字经…

基于多源数据集成的城市地下管廊运维与智慧管控研究

1、引言 1833年&#xff0c;市政管线综合管廊在巴黎城市地下建成至今&#xff0c;经过百年来的探索、研究、改良和实践&#xff0c;法国、英国、德国、俄罗斯、日本、美国等发达国家的管廊规划建设与安全运维体系已经日臻完善&#xff0c;截止目前&#xff0c;国外已建成各类管…

Python3 OpenCV4 计算机视觉学习手册:6~11

原文&#xff1a;Learning OpenCV 4 Computer Vision with Python 3 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 计算机视觉 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 当别人说你没有底线的时候&a…

Python自动化测试 环境搭建 Selenium、WebDriver下载、安装、配置、基本使用详解

基本于Python语言 和 Selenium框架&#xff0c;使用PyCharm 开发环境&#xff0c;详细介绍自动化测试环境的搭建 以及 基本的使用方法。 一、安装Python环境 Python环境目前已被大部分主流操作系统所支持&#xff0c;比如在Linux、Mac、Unix等系统上就自带了Python环境&#xf…