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 按键模块设计 …

突破编程_C++_字符串算法(检查一个字符串是否是某个字符串的旋转)

1 算法题 &#xff1a;检查一个字符串是否是某个字符串的旋转 1.1 题目含义 检查一个字符串是否是某个字符串的旋转&#xff0c;这是一个常见的字符串操作问题。具体来说&#xff0c;这个问题要求判断给定的一个字符串是否可以通过将另一个字符串的所有字符按照相同的顺序进行…

SpringBoot 线程池异步调用

yml配置文件 # 线程池 threadPool:# 核心线程池大小corePoolSize: 2# 最大线程数maxPoolSize: 5# 缓冲队列大小queueCapacity: 200# 允许线程空闲时间&#xff08;单位&#xff1a;默认为秒&#xff09;keepAliveSeconds: 10# 允许线程等待时长&#xff08;单位&#xff1a;默…

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

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

Qt + mqtt对接阿里云平台(二)

一、MQTT协议 1、MQTT相关概念 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的"轻量级"通讯协议&#xff0c;该协议构建于TC…

移动目标检测的几种常用方法和代码实现

移动目标检测的几种常用方法和代码实现 帧差法&#xff08;Frame Difference Method&#xff09;持续帧差法&#xff08;Continuous Frame Difference Method&#xff09;总结背景减法自适应背景减法总结 帧差法和持续帧差法都是通过分析视频帧之间的差异来检测场景中的运动对象…

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

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

生成 Linux/ubuntu/Debian 上已安装软件包的列表

你可以在终端中使用以下命令生成已安装软件包的列表&#xff1a; 列出所有已安装的软件包&#xff1a; dpkg --get-selections要将列表保存到文件中&#xff1a; dpkg -l > installed_packages_detailed.txt这将在当前目录中创建一个名为“installed_packages_detailed.txt”…

高效提升控制效率 | 基于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写插入内存屏障后生成的指令序列示意图下图是在保守策…

Mac下java环境搭建

JDK 教程:MAC安装JDK及环境变量配置-CSDN博客 建议JDK7和JDK8都装上,因为一些老项目是用JDK7开发,使用JDK8编译时报错。(若没有老项目,直接安装jdk8) 若配置环境变量时找不到JDK的安装路径,有两种方式: 方式一、mac默认位置为:/Library/Java/JavaVirtualMachines/…

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…

linux系统nginx常用命令

查nginx位置 find / -name nginx nginx目录&#xff1a;/usr/local/ 查看nginx进程号 ps -ef |grep nginx 停止进程 kill 2072 启动 ./sbin/nginx /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf 启动并校验校验配置文件 ./sbin/nginx -t 看到如下显…

【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;用于返回一个变量或表达式的数据类型的字符…