当前位置: 首页 > news >正文

vue3 升级实战笔记

最近要将公司项目的移动端进行 vue3 的升级工作,就顺便记录下升级过程。

项目迁移的思路

我的想法是最小改动原则。

  • 从 vue2.x 升级到 vue3,且使用 vue3 的 选项式 API。
  • 构建工具要从 vue-cli(webpack)升级到 vite。
  • 路由需要升级到最新的 vue-router.
  • 状态管理器可以使用最新的 vuex,后续迁移到 pinia.
  • 组件库也需要升级到 vue3 的版本。
  • 网络请求依旧可以用 axios。

项目创建

由于改动太大,我并没有在原项目上进行升级,而是使用最新的 vue 模板来新建项目,然后逐步迁移代码。

$ npm init vue@latest
✔ Project name: … app-v3
✔ Add TypeScript? … No
✔ Add JSX Support? … Yes
✔ Add Vue Router for Single Page Application development? … Yes
✔ Add Pinia for state management? … No
✔ Add Vitest for Unit testing? … No
✔ Add Cypress for both Unit and End-to-End testing? … No
✔ Add ESLint for code quality? … Yes
✔ Add Prettier for code formatting? … YesScaffolding project in ./<your-project-name>...
Done.

这里我并没有用 TS 和 Pinia 库,主要还是因为用了这两个库,迁移成本会大大增加,需要改动的代码会多很多。以后再慢慢升级吧。

安装依赖

项目也运行了一两年了,用到的依赖必然是不少的。逐个进行安装。这里需要将库分为两类:

vue 相关库

这类库要么是基于 vue3 来重写的,要么就是针对 vue3 的新特性而设计实现的。这类库就需要从 vue2 升级到 vue3。我项目中用到的库有:

{"element-plus": "^2.3.2","vant": "^4.1.2","vue": "^3.2.47","vue-router": "4","vuex": "^4.0.2","vxe-table": "^4.3.11"
}

对于这类库,或多或少会和老版本的 API 有一些出入,所幸一般优秀第三方库的文档都会提供 vue3 的迁移指南。

其他工具库

这类库基本上是可以直接从 package.json 里面复制过来用的。后续执行 npm install 安装即可。

{"@antv/g2plot": "^2.4.29","axios": "^1.3.4","dayjs": "^1.11.7","lodash": "^4.17.21","numeral": "^2.0.6","query-string": "^8.1.0","vconsole": "^3.15.0","xe-utils": "^3.5.7"
}

dev 开发库

另外,在开发中还会用到一些开发工具库,如 CSS 预处理器

> npm add -D sass

这类开发相关库的用法参考 vite 官方指引(感觉它的文档和 vue-cli 还是有些类似的)。

注册依赖库

这些其实就很简单,按照各自官方文档配置即可。一般都是 app.use(lib, { ...options }) 的写法。

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import Vant from 'vant'
import 'vant/lib/index.css'
import VXETable from 'vxe-table'
import 'vxe-table/lib/style.css'const app = createApp(App)app.use(router)
app.use(store)
app.use(ElementPlus)
app.use(Vant)
app.use(VXETable)app.mount('#app')

接口代理

代理是开发阶段前后端联调的关键,比如第一时间安排上。

// vite.config.js
export default defineConfig({...server: {port: 7001,proxy: {'/api': 'http://101.44.97.172',},},
})

代码如何迁移

由于并没有使用 TypeScript 和 Pinia,所以完全可以一股脑将项目全部移到新项目上。再对改动逐个调整。

处理 devtools 不显示的问题

在跑 vue3 项目的时候,发现它并没有将 vue-devtools 调试工具开起来,于是就去官网查询。

https://devtools.vuejs.org/guide/faq.html#the-vue-devtools-don-t-show-up

解决方案是修改一个环境变量 __VUE_PROD_DEVTOOLS__,它默认是 false,需要改为 true 来打开。

__VUE_PROD_DEVTOOLS__ (enable/disable devtools support in production, default: false)

对于 vite 构建的项目(一般都是用的 vite),可以使用使用 define 选项.

// vite.config.js
export default defineConfig({...define: {__VUE_PROD_DEVTOOLS__: true,},
})

vue-router

在路由方面,改动并不大(毕竟是同一个库的升级版)。下面列出了 vue2 和 vue3 的使用方式不同之处。

import Vue from 'vue'
import VueRouter from 'vue-router'Vue.use(VueRouter)const router = new VueRouter({routes: [{path: '/',name: 'welcome',component: () => import('@/views/Welcome/index.vue'),meta: {title: '引导页',key: 'welocome',},},],
})window.vm = new Vue({router,render: (h) => h(App),
}).$mount('#app')
import { createApp } from 'vue'
import { createRouter, createWebHashHistory } from 'vue-router'const router = createRouter({history: createWebHashHistory(),routes: [{path: '/',name: 'welcome',component: Welcome,meta: {title: '引导页',key: 'welocome',},},],
})const app = createApp(App)
app.use(router)

另外一点不同是在 JavaScript 中去 route 的方式不同。

在 vue2 中可以在 vue 实例中拿到路由信息。

const $route = window.vm.$route

而在 vue3 中我是通过如下方式取的 route 信息。

import router from '@/router'const $route = router.currentRoute.value // currentRoute 是一个 ref() 对象

目前用到的就这些,其他改动详见 从 Vue2 迁移 | Vue Router。

vuex

关于 vuex 部分,表现倒是出奇的好。代码拷贝过来后修改了安装过程,其他都能运行正常。

import { createStore } from 'vuex'export const store = createStore({state() {return {count: 1,}},
})
import { createApp } from 'vue'
import { store } from './store'
import App from './App.vue'const app = createApp(App)app.use(store)app.mount('#app')

这就体现出我之前所说的 vuex 比 pinia 的迁移上的好处了。

vue3 语法修改

由于采用了选项式语法来写 vue ,所以老项目的大多数 API 还是可以适用的。最需要关注变化是那些非兼容性改变 | Vue 3 迁移指南。下面列举一些我遇到的问题。

  • v-deep 改为 :deep()
  • v-model 的定义名称改变:value 变为 modelValueinput 事件变为 update:modelValue
  • :visible.sync="" 变为 v-model:visible=""
  • 组件的 v-model 变为了参数绑定 v-model:value
export default {props: {value: String,},emits: ['update:value'],methods: {handleClick() {const index = this.options.findIndex((option) => option.value === this.value,)if (index === this.options.length - 1) {this.$emit('update:value', this.options[0].value)} else {this.$emit('update:value', this.options[index + 1].value)}},},
}

vant 组件库的变化

我的移动端项目用到了大量 vant 的组件库,所以记录了一下影响较大的改动。

  • DatetimePicker 组件被拆分成了三个子组件,我所用到的是 datePicker 的日期选择器,它的 v-model 值从之前的 Date() 类数据变成了字符串数组 ['2022', '09']
  • datePicker 月份选择器不再是通过 type 来决定,而是直接定义选择器列的属性 :columns-type="['year', 'month']"
  • toast 提示信息从 Toast() 函数变为了 showToast() 函数。
  • popup 的 visible.sync="" 变为了 v-model:visible=""
  • tab 的 v-model="" 变为了 v-model:active=""
  • calender 的 v-model="" 变为了 v-model:show=""

具体还是可以参考 vant 的 升级指南 来进行更新。

总结

  • 保证最小改动原则的去升级到 vue3 是最安全快速的。
  • 在升级的时候,一定要提前多看看相关升级指南,比自己琢磨要好很多。可以省不少时间。
  • 由于 vue 的升级,组件库都会有一些变化。所以对于第三方组件,不仅要按照升级指南逐步升级,还要多多测试交互逻辑。这块改动挺大的。
  • vue3 语法中,尤其注意 v-model 变化对组件库的影响,我在修改组件库问题时遇到最多的就是这个。
  • 如果对组件库通过元素选择器 querySelector() 做过一些渗透性的改动,需要重新检查。因为这类不体现在文档中的改动随着版本的升级有些许变化是正常且合理的。
const elements = document.getElementsByClassName('vxe-table--body-wrapper')
elements.addEventListener('touchend', () => {})// 这种结构性的元素获取最容易出问题
document.querySelector('#app > div > div:nth-child(3)')
.header-tabs {width: 100%;:deep(.van-tab) {font-size: 16px;font-family: PingFang SC;font-weight: 500;color: #282c32;}:deep(.van-tab--active) {font-size: 16px;font-family: PingFang SC;font-weight: bold;color: #f6674f;}:deep(.van-tabs__line) {width: 65px;background: #f6674f;}
}


喜欢的朋友记得点赞、收藏、关注哦!!!

相关文章:

vue3 升级实战笔记

最近要将公司项目的移动端进行 vue3 的升级工作&#xff0c;就顺便记录下升级过程。 项目迁移的思路 我的想法是最小改动原则。 从 vue2.x 升级到 vue3&#xff0c;且使用 vue3 的 选项式 API。构建工具要从 vue-cli&#xff08;webpack&#xff09;升级到 vite。路由需要升级到…...

利用函数模块化代码实操 ← Python

【知识点】 ● 模块化可以使代码易于维护和调试&#xff0c;并且提高代码的重用性。 ● 函数可以用来减少冗余的代码并提高代码的可重用性。函数也可以用来模块化代码并提高程序的质量。 ● 在 Python 中&#xff0c;可以将函数的定义放在一个被称为模块的文件中,这种文件的后缀…...

Java高效编程(12):重写toString方法

解锁Python编程的无限可能&#xff1a;《奇妙的Python》带你漫游代码世界 尽管 Object 类提供了 toString 方法的默认实现&#xff0c;但它返回的字符串通常不是类的使用者想要看到的。默认返回的字符串格式是类名加上“”符号和哈希码的十六进制表示&#xff0c;例如 PhoneNu…...

谷歌给到的185个使用生成式AI的案例

很多公司从利用AI回答问题&#xff0c;进而使用AI进行预测&#xff0c;向使用生成式AI Agent转变。AI Agent的独特之处在于它们可以采取行动以实现特定目标&#xff0c;比如引导购物者找到合适的鞋子&#xff0c;帮助员工寻找合适的健康福利&#xff0c;或在护理人员交接班期间…...

程序员如何通过专业与软技能提升核心竞争力

一、引言  随着AIGC的兴起&#xff0c;AI辅助编程工具如chatgpt、midjourney、claude等接二连三地涌现&#xff0c;编程领域的变革正逐步深化。面对这一变革&#xff0c;程序员们对于未来工作的前景有着种种不同的担忧和期待。他们担心AI可能取代部分编程工作&#xff0c;同时…...

基于YOLOv8的智能植物监测机器人

摘要:针对传统的植物病害检测方法依赖专家的经验,耗时耗力,并且准确性受限于个人的水平等问题。文中提出无线通信模块采用HTTP协议来传输数据图片,采用SoC核心处理器实现了便携化,采用对射式红外避障传感器实现自动避障功能。以YOLOv8算法为控制核心,并添加注意力机制以提…...

2024年OpenAI DevDay发布实时 API、提示缓存等新功能

就在几天前&#xff0c;一些重要人物如前 CTO Mira Murati 离开了 OpenAI。因此&#xff0c;看到 Sam Altman 在 DevDay 上登台&#xff0c;讨论开发者的新产品&#xff0c;感觉有点奇怪。 随着公司内部的这些变化&#xff0c;你不禁会想&#xff1a;我们还应该信任他吗&#…...

Raspberry Pi3B+之安装bookworm+Rpanion系统

Raspberry Pi3B之安装bookwormRpanion系统 1. 源由2. 系统安装3. 系统安装3.1 烧录系统3.2 设备接线3.3 配置无线3.4 更新系统3.5 安装git3.6 克隆Rpanion3.7 安装Rpanion 4. 系统管理5. 附录问题1&#xff1a;error: externally-managed-environment问题2&#xff1a;bookworm…...

无人机专业除理论外,飞手执照、组装、调试实操技术详解

无人机专业的学习除了丰富的理论知识外&#xff0c;飞手执照的获取、无人机的组装与调试等实操技术也是至关重要的。以下是对这些方面的详细解析&#xff1a; 一、无人机飞手执照 1. 必要性 法规要求&#xff1a;根据《民用无人驾驶航空器系统驾驶员管理暂行规定》等相关法规…...

【网路通信基础与实践番外二】TCP协议的流量控制和拥塞控制以及二者区别和例题

TCP协议是端对端的协议&#xff0c;因此在数据进行传输的过程受发送方&#xff0c;数据通道&#xff0c;接收方三方状态的影响。我们用水龙头来比喻数据发送方&#xff0c;水管来比喻数据通道&#xff0c;水桶来表示数据接收方。 图(a)表示水桶太小&#xff0c;来不及接受注入…...

SpringBoot3+Vue3开发后台管理系统脚手架

后台管理系统脚手架 介绍 在快速迭代的软件开发世界里&#xff0c;时间就是生产力&#xff0c;效率决定成败。对于构建复杂而庞大的后台系统而言&#xff0c;一个高效、可定制的后台脚手架&#xff08;Backend Scaffold&#xff09;无疑是开发者的得力助手。 脚手架 后台脚…...

OpenFeign微服务部署

一.开启nacos 和redis 1.查看nacos和redis是否启动 docker ps2.查看是否安装nacos和redis docker ps -a3.启动nacos和redis docker start nacos docker start redis-6379 docker ps 二.使用SpringSession共享例子 这里的两个例子在我的一个博客有创建过程&#xff0c…...

【C语言】数组(下)

【C语言】数组&#xff08;下&#xff09; 6、二维数组的创建6.1二维数组的概念6.2二维数组的创建 7、二维数组的初始化7.1不完全初始化7.2完全初始化7.3按照行初始化7.4初始化时可以省略行&#xff0c;但是不能省略列 8、二维数组的使用8.1 二维数组的下标8.2二维数组的输入和…...

cGANs with Projection Discriminator

基于映射鉴别器的CGAN 模型中&#xff0c;判别器&#xff08;Discriminator&#xff09;不是通过将条件信息简单地与特征向量拼接&#xff08;concatenate&#xff09;来使用条件信息&#xff0c;而是采用一种基于投影的方式&#xff0c;这种方式更加尊重条件信息在底层概率模…...

mysql学习教程,从入门到精通,SQL HAVING 子句(32)

1、SQL HAVING 子句 当然&#xff01;HAVING 子句在 SQL 中用于对分组后的结果进行过滤。它通常与 GROUP BY 子句一起使用&#xff0c;以便对聚合函数&#xff08;如 SUM(), COUNT(), AVG(), MAX(), MIN() 等&#xff09;的结果进行条件筛选。 以下是一个示例&#xff0c;假设…...

JavaScript while循环语句

While语句包括一个循环条件和一段代码块&#xff0c;只要条件为真&#xff0c;就不断循环执行代码块。 while(条件){语句;} var i0;while(i<100){console.log(i);i1;} 注意&#xff1a;所有的for循环都可以改写为while循环...

49天精通Java(Day 2):Java的基本语法

上期内容回顾 在上一期的内容中&#xff0c;我们介绍了Java的基本概念、历史背景&#xff0c;并完成了JDK 1.8的安装与环境配置。你还编写并运行了第一个简单的Java程序“Hello, World!”。今天&#xff0c;我们将深入探讨Java的基本语法&#xff0c;包括变量、数据类型、运算…...

uni-app之旅-day01-home页

首页 3.0 创建 home 分支 &#x1f355;&#x1f355;&#x1f355;运行如下的命令&#xff0c;基于 master 分支在本地创建 home 子分支&#xff0c;用来开发和 home 首页相关的功能git branch(查看分支)git checkout -b home(创建home分支) 3.1 配置网络请求 &#x1f32…...

Vue3轻松实现导出Excel文件功能

文章目录 1.前言2.安装插件3.案例3.1 定义表格数据,设置 id 选择器3.2 据所选 dom 对象生成 sheetbook3.3 写入文件3.4 生成 xlsx文件4.完整代码1.前言 前端常用的导出 Excel的 js 库是 xlsx,但是 xlsx不能设置样式。要想设置样式,必要要结合 xlsx-style 插件一起使用,但是…...

在Kali Linux中使用VNC和iptables配置xrdp以实现远程连接

在Kali Linux中&#xff0c;使用VNC和iptables配置xrdp以实现远程连接涉及几个步骤。不过&#xff0c;值得注意的是&#xff0c;VNC和xrdp是两种不同的远程桌面协议&#xff0c;它们通常不会在同一配置中同时使用&#xff08;除非有特殊的网络架构需求&#xff09;。然而&#…...

Guohua Diffusion 创意编程:用Processing可视化交互控制图像生成

Guohua Diffusion 创意编程&#xff1a;用Processing可视化交互控制图像生成 你有没有想过&#xff0c;自己随手画的一条线、选择的一个颜色&#xff0c;能立刻变成一幅由AI生成的完整画作&#xff1f;这听起来像是科幻电影里的场景&#xff0c;但现在&#xff0c;通过一点创意…...

Pixel Mind Decoder 异常情绪监测:在系统日志中定位用户不满信号

Pixel Mind Decoder 异常情绪监测&#xff1a;在系统日志中定位用户不满信号 1. 运维场景中的情绪危机 你有没有遇到过这种情况&#xff1a;系统运行一切正常&#xff0c;监控指标全绿&#xff0c;但用户满意度却在悄悄下滑&#xff1f;等到收到大量投诉时&#xff0c;问题已…...

【花雕学编程】Arduino BLDC 之使用互补滤波进行姿态控制的机器人

从专业工程视角来看&#xff0c;基于Arduino、使用互补滤波进行姿态控制的BLDC&#xff08;无刷直流电机&#xff09;机器人&#xff0c;是一个典型的嵌入式实时闭环控制系统。它集成了传感器数据融合、控制算法和电机驱动&#xff0c;广泛应用于对姿态稳定性有要求的场景。 1、…...

5分钟搞定:Mac用户制作Windows启动盘的终极指南

5分钟搞定&#xff1a;Mac用户制作Windows启动盘的终极指南 【免费下载链接】windiskwriter &#x1f5a5; A macOS app that creates bootable USB drives for Windows. &#x1f6e0; Patches Windows 11 to bypass TPM and Secure Boot requirements. 项目地址: https://g…...

别再死记硬背GAT公式了!用Python+PyTorch手把手图解注意力机制(附代码)

图解GAT&#xff1a;用PythonPyTorch拆解图注意力机制的实现奥秘 当你第一次听说图注意力网络&#xff08;GAT&#xff09;时&#xff0c;是否被那些复杂的数学公式和抽象概念吓退&#xff1f;本文将以全新的可视化方式&#xff0c;带你从零实现一个完整的GAT层&#xff0c;用代…...

从裸机到RTOS:IMX6ULL启动流程与FreeRTOS源码实战解析

1. IMX6ULL裸机启动机制详解 第一次拿到IMX6ULL开发板时&#xff0c;很多人会疑惑&#xff1a;为什么我的程序烧录进去没反应&#xff1f;这得从芯片的启动机制说起。IMX6ULL上电后最先执行的并不是我们写的代码&#xff0c;而是芯片内部ROM中的固化程序。这个ROM代码就像个尽职…...

ncmdumpGUI:网易云音乐加密文件转换的完整解决方案

ncmdumpGUI&#xff1a;网易云音乐加密文件转换的完整解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 一、初识ncmdumpGUI&#xff1a;解密音乐文件的…...

Java AI推理服务上线即崩?JVM GC日志暴露真相:Metaspace暴涨470%、Direct Memory泄漏12.6GB——5行代码精准修复方案(含Arthas实时监控脚本)

第一章&#xff1a;Java AI推理服务集成概述在现代企业级AI应用架构中&#xff0c;Java凭借其稳定性、丰富的生态和成熟的微服务支持能力&#xff0c;正成为部署AI推理服务的重要后端语言。与Python主导的模型训练场景不同&#xff0c;Java更常用于高并发、低延迟、强事务保障的…...

SeqGPT-560M智能邮件分类系统实战

SeqGPT-560M智能邮件分类系统实战 1. 引言&#xff1a;邮件管理的痛点与解决方案 每天打开邮箱&#xff0c;看到堆积如山的未读邮件&#xff0c;是不是感觉头大&#xff1f;工作邮件、会议通知、促销信息、垃圾邮件全都混在一起&#xff0c;找重要邮件就像大海捞针。手动分类…...

告别混乱文件管理:用NERDTree打造VIM项目导航系统

告别混乱文件管理&#xff1a;用NERDTree打造VIM项目导航系统 每次打开一个包含数百个文件的复杂项目时&#xff0c;你是否会感到一阵眩晕&#xff1f;当你在多个目录间反复切换查找某个配置文件时&#xff0c;是否觉得时间在指尖悄然流逝&#xff1f;对于资深VIM用户而言&…...