Nuxt2升级Nuxt3指南(二):nuxt.config.js配置文件

一、代码移植原则

前置说明:根据项目开发的实际情况,本次升级不采用Typescript。

升级的原则是开始尽量的简单配置,将代码分阶段逐步移植到新版本框架上,遇到问题逐一排查解决。

大致阶段,可以分为:
第一阶段:项目运行依赖的基本代码移植,主要涉及:Nuxt配置,UI框架(Element-UI),store(由Vuex改为pinia), 插件,中间件,http请求,工具函数及其它全局对象相关的代码

第二阶段:移植layouts布局文件及pages页面代码,将Vue2代码语法改为Vue3代码语法

第三阶段:解决前面两个阶段在代码移植过程中遗漏或者暂时不予解决的问题(但又不影响主要代码的移植和运行,比如一些第三方组件或者插件的使用在移植过程中遇到问题)

二、nuxt配置

首先从nuxt.config.js的配置文件开始:
先看一下原有Nuxt2的配置,如下
在这里插入图片描述
通过分析代码,可以先迁移csspluginsmodules的部分比较主要的配置:
在这里插入图片描述
如上所示,下一步需要迁移的相关配置,涉及:

①Element-Plus框架的引入(Element-UI需要替换为Element-Plus)
②项目Css样式文件
③http请求的封装(Nuxt3不再建议使用Axios)
④Vue相关扩展、全局组件及过滤器的替换(Vue3已经移除了Filter)
⑤Vuex的迁移(改为Pinia)

详细的迁移如下:

1.Element-Plus引入

(1)先安装Element Plus:

 pnpm install element-plus

(2)安装Nuxt官方专门针对引入Element Plus 开发的模块:

pnpm i @element-plus/nuxt -D

(3)在nuxt.config.ts中配置modules参数:

export default defineNuxtConfig({modules: ['@element-plus/nuxt'],elementPlus: { /** Options */ }
})

2.项目css样式

export default defineNuxtConfig({modules: [ '@element-plus/nuxt'],css: ['~/assets/style.css']
})

3.http请求的封装

由于项目中大量使用到$http对象,这个对象其实是对axios的封装,主要有两种使用方式:
①在asyncData函数中使用ctx.app.$http
②在Vue实例对象上使用this.$http
这两种方式分别对应的绑定代码:
① app.$http:

// 这里是 为了在 asyncData 方法中使用
export default ({ app }, inject) => {// Set the function directly on the context.app objectapp.$http = http
}

②Vue.prototype.$http:

Vue.prototype.$http = http

以上代码都是在plugins/main.js中实现(接下来,也需要迁移这个文件代码),我们先实现对http的封装:

在utils目录下新建http.js文件,文件内容如下:

/**
*  nuxt项目目录/utils/http.js
*  基于useFetch()的网络请求封装
*/
import md5 from 'md5'
import qs from 'qs'//全局基础URL
const BASEURL = "https://xxxx";  //全局后台服务器请求地址
const COMMON_HEADERS = {'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8','Accept': 'application/json'
}/*** 网络请求方法* @param obj 请求参数* @returns 响应结果*/
const request = (obj) => {const sault = obj.url.split('/')[2]const userIp = useCookie('x-user-ip')const nuxtApp = useNuxtApp()let baseData = {...signStamp(sault),guard: userIpMd(userIp.value || '-')}let queryData = nulllet bodyData = nullif(obj.method == 'get') {queryData = Object.assign({}, obj?.params || {}, baseData)} else if(obj.method == 'post') {bodyData = qs.stringify(Object.assign({}, obj?.data || {}, baseData), { indices: false })}return new Promise(async (resolve, reject) => {const options = {baseURL: BASEURL,key: md5(obj.url + (queryData || bodyData)??(JSON.stringify(queryData || bodyData))),method: obj.method,query: queryData,body: bodyData,timeout: 20000,onRequest({ request, options }) {// 设置请求报头options.headers = Object.assign(COMMON_HEADERS, options.headers || {})/**如果接口需求携带token请求,则可先自行使用官方的useCookie()方法设置Cookie存储后,再使用useCookie()方法,取出token使用。如下例子:*///const token = useCookie('token')//options.headers.Authorization = token.value||null},onRequestError({ request, options, error }) {// 处理请求错误console.log("服务器链接失败!")reject(error)},onResponse({ request, response, options }) {},onResponseError({ request, response, options }) {// 处理响应错误return response}}if(process.client && !nuxtApp.isHydrating) {const res = await $fetch(obj.url, options)resolve(res)} else {const { data } = await useFetch(obj.url, options)resolve(data.value)}})
}export const httpGet =  (url, payload = undefined,headers = undefined, cache = false) => {return request({method: 'get',url: url,params: payload,headers: headers}).then(rsp => {return rsp})
}export const httpPost = (url, payload = undefined,headers = undefined, cache = false) =>{return request({method: 'post',url: url,data: payload,headers: headers}).then(rsp => {return rsp})
}export const $http = {get: httpGet,post: httpPost
}

以上代码比较粗略,仅供参考(其中使用的第三方依赖需要前置安装,部分函数不给出实现,按需要删减代码)

4.Vue相关扩展、全局组件及过滤器的替换

这部分也是在plugins/main.js中定义,所以接下来迁移plugins/main.js中的代码:

①Vue相关原型扩展:
原代码:
在这里插入图片描述
迁移后:
在utils目录中新建extend.js:
在这里插入图片描述
②全局组件:
迁移到components目录,如遇到报错先暂时修复

③过滤器
原代码:
在这里插入图片描述

直接废除过滤器的写法,改到utils的extend.js中:
在这里插入图片描述
至此plugins/main.js中的代码已经都迁移完成,文件已经没有什么作用,也就不需要这个文件了。

5.Vuex的迁移

Vue3我们搭配改用Pinia:
①安装pinia:

pnpm install pinia @pinia/nuxt

②nuxt.config.js中配置pinia:

export default defineNuxtConfig({// ... 其他配置modules: [// ...'@pinia/nuxt',],
})

③在store目录创建index.js文件:

import { defineStore } from 'pinia'export const useMainStore = defineStore('main', {state: () => ({token:"",...}),actions: {settoken(token){this.token=token},...}
})

④pinia封装插件:
在plugins目录新建pinia.js:

import { useMainStore } from '~/store'export default defineNuxtPlugin(({ $pinia }) => {return {provide: {store: useMainStore($pinia)}}
})

这样代码中就可以使用以下方式进行调用:

  const { $store } = useNuxtApp()$store.xxx // 属性或者actions

⑤修改现有代码中使用到store的代码:
注意Vuex和Pinia在语法上的差别,进行等效替代,比如在actions上的调用方式,两者就有区别。

最后一起看一下,迁移后的Nuxt.config.js如下:

export default defineNuxtConfig({devtools: { enabled: true },modules: ['@pinia/nuxt', '@element-plus/nuxt'],plugins: [],css: ['~/assets/style.css']
})

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

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

相关文章

在idea中如何开启项目的热部署

热部署&#xff1a;就是当我们IDEA的项目在运行期间&#xff0c;我们修改代码以后&#xff0c;不需要我们自己重启项目&#xff0c;IDEA就会自动的重启项目 在idea中开启项目热部署的步骤 第一步&#xff1a;引入热部署的依赖 <dependency><groupId>org.springfr…

STP---生成树协议

STP的作用 a)Stp通过阻塞端口来消除环路&#xff0c;并能够实现链路备份目的 b)消除了广播风暴 c)物理链路冗余&#xff0c;网络变成了层次化结构的网络 STP操作 选举一个根桥每个非根交换机选举一个根端口每个网段选举一个指定端口阻塞非根&#xff0c;非指定端口 STP--生成树…

基于单片机的智能空调设计

目 录 摘 要 I Abstract II 引 言 1 1 系统整体设计 3 1.1 系统方案设计 3 1.2 系统工作原理 3 2 硬件设计 5 2.1 电源模块设计 5 2.1.1 电源模块选择 5 2.1.2 电源模块电路设计 5 2.2 单片机模块设计 5 2.2.1 单片机型号选择 5 2.2.2 单片机模块电路设计 6 2.3 按键模块设计 …

vue3中el-input输入无效的原因之一

表单的model用的是&#xff1a;reactive let updateForm reactive({ id: 0, className: "" }); reactive的数据不能这么赋值&#xff0c;会破坏响应性 错误方法&#xff08;&#xff09;{ updateForm { id: 0, className: "asdasdas" }; } 解决方法&…

1.5如何缓解图像分类任务中训练数据不足带来的问题?

1.5 图像数据不足时的处理方法 场景描述 在机器学习中&#xff0c;绝大部分模型都需要大量的数据进行训练和学习(包括有监督学习和无监督学习)&#xff0c;然而在实际应用中经常会遇到训练数据不足的问题。 比如图像分类&#xff0c;作为计算机视觉最基本的任务之一&#xff0…

高效提升控制效率 | 基于ACM32 MCU的LED灯箱控制器方案

LED灯箱上各种文字、图案有序跳跃、交替辉映&#xff0c;产生强烈的视觉冲击力&#xff0c;被广泛应用于商场、美容美发、宾馆、娱乐场所等地方。 锁存器的工作原理 在LED和数码管显示方面&#xff0c;要维持一个数据的显示&#xff0c;往往要持续的快速的刷新。尤其是在四段八…

Python算法100例-3.6 自守数

1.问题描述2.问题分析3.算法设计4.求给定数的位数5.分离给定数中的最后几位6.确定程序框架7.完整的程序 1&#xff0e;问题描述 自守数是指一个数的平方的尾数等于该数自身的自然数。例如&#xff0c; 5 2 25 &#xff0c; 2 5 2 625 &#xff0c; 7 6 2 5776 &#xff0c…

java基础-锁之volatilesynchronized

文章目录 volatilevolatile内存语义volatile的可见性volatile无法保证原子性volatile禁止重排优化硬件层的内存屏障volatile内存语义的实现下面是基于保守策略的JMM内存屏障插入策略。下面是保守策略下&#xff0c;volatile写插入内存屏障后生成的指令序列示意图下图是在保守策…

Android APP性能指标(二)

文章目录 一、响应时间1.1 数据获取1.2 响应时间指标测试点1.3 启动速度测试点1.4 响应时间测试解决方法 二、流量2.1 数据获取2.2 流量测试关注点2.3 测试标准 三、电量3.1 连接手机3.2 数据获取3.3 获取APP的UID3.3 重置电池数据收集数据3.4 电量指标测试 四、温度五、性能测…

打包系统待优化点

Base.Widget.AppCompat.ActivityChooserView中相关资源重复 D:\channelPackage\ToolConfigPath\games\dcpPro\100081\mumu\tempRes\values\attrs.xml:1171: error: duplicate value for resource attr/displayOptions with config . D:\channelPackage\ToolConfigPath\games\d…

【C++精简版回顾】19.异常处理

1.throw抛出问题 int print(int a,int b) {if (b 0)throw b;return a / b; } 2.try与catch解决问题 try {print(2, 0); } catch (int b) {cout << "竟然是&#xff1a;"<<b<<endl; } 结果&#xff1a; 补充1&#xff1a;可以抛出字符串等 1.throw…

day13_微服务监控Nginx(微服务集成SBA)

文章目录 1 微服务系统监控1.1 监控系统的意义1.2 SBA监控方案1.3 SBA实战1.3.1 创建SBA服务端1.3.2 微服务集成SBA 1.4 微服务集成logback1.5 配置邮件告警 2 Nginx2.1 Nginx简介2.2 下载和安装2.2.1 方式1&#xff1a;window本地安装2.2.1.1 下载2.2.1.2 安装2.2.1.3 目录结构…

关于 typeof 与 instanceof 区别引出的原型对象问题

一、关于 typeof 与 instanceof 区别&#xff1a; typeof 和 instanceof 是 JavaScript 中用于检查变量类型的两个不同操作符&#xff0c;它们在使用上有着明显的区别和不同的适用场景。 typeof typeof 是一个一元操作符&#xff0c;用于返回一个变量或表达式的数据类型的字符…

简单认识算法

什么是算法&#xff1f; 解决某个实际问题的过程和方法。 排序算法 1.冒泡排序 打印结果&#xff1a; 2.选择排序 打印结果&#xff1a; 优化选择排序&#xff1a;因为每一轮都需要以当前位置为基准与后面元素比较&#xff0c;太过繁琐&#xff0c;所以可以找到后面元素中较小…

Long使用==

1、背景&#xff1a;测试程序的时候发生了没数据的bug,于是在sevice层的一堆代码中调试&#xff0c;最后发现问题是在stream的filter方法中对两个Long使用造成的问题。 2、测试代码&#xff1a; Long a Long.valueOf(340);Long b Long.valueOf(340);System.out.println(a b)…

指针的学习4

目录 回调函数 qsort使用样例 使用qsort函数排序整形数据 使用qsort函数排序结构体 回调函数 回调函数就是一个通过函数指针调用的函数。如果把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来调用其所指向的函数时&#xf…

想打造爆款AI应用?ai虚拟数字人制作助你一臂之力

如今&#xff0c;随着人工智能技术的飞速发展&#xff0c;AI应用已经渗透到我们生活的方方面面。而在这个充满竞争和创新的时代&#xff0c;不少企业都在努力寻找打造爆款AI应用的机会。其中&#xff0c;AI虚拟数字人制作可以为他们提供一臂之力。 AI虚拟数字人制作是指利用人…

六氟化硫SF6气体怎么监测泄漏?

在当今的电力工程领域中,六氟化硫是一种应用广泛的电负性气体,从它发明至今已有百年历史。六氟化硫耐电强度为同一压力下氮气的2.5倍,击穿电压是空气的2.5倍,灭弧能力是空气的100倍,是一种优于空气和油之间的新-代超高压绝缘介质材料。 六氟化硫以其良好的绝缘性能和灭弧性能,在…

解决ts报错:类型“entry”上不存在属性“$AppTools”

uniapp ts 项目&#xff0c;已经将AppTools挂在了vue的原型上&#xff0c;但是在vue页面使用时报错&#xff0c;如图&#xff1a; 解决&#xff1a; 在项目根目录下的tsconfig.json文件添加如下配置&#xff1a; "include": ["src/**/*"],这样报错就消失…

使用移动云短信服务发送普通短信与模板短信

今天使用到了用移动云短信服务发送短信功能,顺便记录下 apid,secretKey和集团名称分别为如下图用户名,密码,所属分组 package com.keyou.proj.authentication.service.utils;import cn.hutool.crypto.SecureUtil; import cn.hutool.http.HttpRequest; import cn.hutool.json.J…