vue2项目升级到vue3经历分享1

news2024/11/24 19:38:16

依据vue官方文档,vue2在2023年12月31日终止维护。因此决定将原来的岁月云记账升级到vue3,预计工作量有点大,于是想着把过程记录下来。
原系统使用的技术栈

"dependencies": {
    "axios": "^0.21.1",
    "babel-plugin-lodash": "^3.3.4",
    "babel-plugin-transform-remove-console": "^6.9.4",
    "clipboard": "^2.0.6",
    "core-js": "^3.6.5",
    "echarts": "^5.0.1",
    "element-china-area-data": "^5.0.2",
    "element-ui": "^2.15.2",
    "file-saver": "^2.0.5",
    "js-cookie": "2.2.0",
    "js-md5": "^0.7.3",
    "jsencrypt": "^3.2.1",
    "less": "^4.1.0",
    "less-loader": "^7.2.1",
    "moment": "^2.24.0",
    "nprogress": "0.2.0",
    "pinyin-match": "^1.2.2",
    "postcss-plugin-px2rem": "^0.8.1",
    "resize-detector": "^0.2.2",
    "uuid": "^8.3.2",
    "vue": "^2.6.11",
    "vue-router": "^3.0.7",
    "vuex": "3.0.1",
    "xlsx": "^0.17.0"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "~4.5.0",
    "@vue/cli-plugin-eslint": "~4.5.0",
    "@vue/cli-plugin-router": "~4.5.0",
    "@vue/cli-service": "~4.5.0",
    "babel-eslint": "^10.1.0",
    "compression-webpack-plugin": "^5.0.0",
    "crypto-js": "^4.1.1",
    "eslint": "^6.7.2",
    "eslint-plugin-vue": "^6.2.2",
    "file-loader": "^6.2.0",
    "fingerprintjs2": "^2.1.4",
    "image-webpack-loader": "^7.0.1",
    "lodash-webpack-plugin": "^0.11.6",
    "mini-css-extract-plugin": "^1.5.0",
    "quill-image-extend-module": "^1.1.2",
    "url-loader": "^4.1.1",
    "vue-quill-editor": "^3.0.6",
    "vue-template-compiler": "^2.6.11"
  },

新系统使用的技术栈如下,可以看到至少有下面几点变化

  1. 代码编译从webpack调整为vite
  2. 前端界面框架从element-ui升级到element-plus
  3. 状态管理从vuex调整为pinia
  4. 支持typescript
  5. 菜单框架调整为多页签模式
  6. api调整为动态加载,页面路径调整为动态加载。
"dependencies": {
    "@element-plus/icons-vue": "^2.1.0",
    "@tinymce/tinymce-vue": "5.0.0",
    "axios": "^1.6.1",
    "codemirror": "5.65.5",
    "cropperjs": "^1.6.1",
    "crypto-js": "4.1.1",
    "docx-preview": "^0.3.0",
    "echarts": "^5.4.3",
    "element-china-area-data": "5.0.2",
    "element-plus": "2.2.32",
    "js-cookie": "^3.0.5",
    "js-md5": "^0.8.3",
    "lodash": "^4.17.21",
    "moment": "^2.29.4",
    "nprogress": "^0.2.0",
    "pinia": "^2.1.7",
    "pinyin-match": "1.2.2",
    "resize-detector": "0.2.2",
    "sortablejs": "^1.15.0",
    "tinymce": "6.3.2",
    "uuid": "^9.0.1",
    "vue": "^3.3.8",
    "vue-router": "^4.2.5",
    "xlsx": "^0.18.5"
  },
  "devDependencies": {
    "@types/node": "18.11.11",
    "@vitejs/plugin-vue": "^3.2.0",
    "@vitejs/plugin-vue-jsx": "^3.1.0",
    "less": "^4.2.0",
    "less-loader": "^11.1.3",
    "postcss-plugin-px2rem": "^0.8.1",
    "tailwindcss": "^3.4.3",
    "typescript": "^4.9.3",
    "unplugin-auto-import": "^0.16.7",
    "unplugin-icons": "^0.17.4",
    "unplugin-vue-components": "^0.25.2",
    "vite": "^3.2.3",
    "vite-plugin-compression": "^0.5.1",
    "vite-plugin-html": "3.2.0",
    "vue-tsc": "^1.0.11"
  }

1 界面相关
1.1 slot插槽
slot-scope="scope" 批量更改为#default="scope"
v-slot="scope"统一调整为#default="scope"
1
1.2 jsx语法问题
在vue2开发项目中经常遇到一些动态的dom节点,升级到vue3中,提示The JSX syntax extension is not currently enabled,这个问题也是比较头痛。
1
引入@vitejs/plugin-vue-jsx,在vite.config.ts中配置jsx语法支持,
1
进入到对应的界面,添加lang="jsx"
1
在使用到标签,增加h函数
将原来的

render: (h, data) => {
              return (<span>{(data.row.period != '' && data.row.period != null) ? data.row.period + '年' : ''}</span>)
            }

调整为

render: (data) => {
              return h(<span>{(data.row.period != '' && data.row.period != null) ? data.row.period + '年' : ''}</span>)
            }

1.3 作废的引用

1
1.4 图片require引入的问题
例如下面的代码,会提示index.vue:129 Uncaught (in promise) ReferenceError: require is not defined
因为vite是基于 ES Modules,因此不支持CommonJS require写法
1
故而按照url: new URL('@/assets/home/balance.png',import.meta.url).href, 图片就可以正常加载了
1

2 api请求
看到下面这个结果真是头大,工程师是不是在摸鱼,复制、粘贴不用动脑,为何不写一个指令来实现。只能一个个改。这个里面的工作量非常之大,得耐心去调整。也可以借助Fitten CodeAi插件,可以把重复的事情,自动联想出来,还是可以加速的
1

新的api
2.1 this.$store.dispatch
1
看看原来的store方式调用api,写法确实冗余拖拉,没有新的方式简洁
1
1
新方式,一句话定义完了,不用搞那么多绕绕。
1
2.2 直接应用api方法
有一些人并不是直接用dispatch模式,例如这样的,是直接引用了api里面的方法
1
另外需要注意加上async
1
这种类型就有57处,看来代码走查非常有必要,当时做项目确实疏忽了这个事情,最后前端工程师离职了,吃亏的就是留下来的人。前提还得你懂前端,光靠前端技术经理,这个事情也是够呛。
1

2.3 axios请求
还有人在页面直接写了axios调用,这些也需要统一调整过来,真是一个修行的过程,花了我一天的时间,将256处直接用axios的请求调整过来。
1
继续重构代码,发现还有这样打开界面的,通过window.open直接打开界面,这样的代码都属于比较隐蔽的。
1

3 存储相关
可以参考我之前写的文档多租户平台前端存储结构的选择,工程师采用vuex存储状态,肯定不合理,结果就是多租户被架空。像这类问题估计99%的前端开发工程师面试一定能答上来,但是实际应用就只能呵呵了。
1
4 状态管理
因为使用的是pina,因此下面的写法就失效了。mapStatemapGetters`,因此这块的工作量也是比较大的

  import {mapGetters, mapState} from "vuex";
  computed: {
      ...mapState({
        periodOptions: function (state) {
          return state.accountSets.periodOptions
        },
      }),
      ...mapGetters([
        'changeSubject',
        'initTreeStatus',  
        'categoryTrees',
        'allSubject',
        'bindTime',
      ]),
    },

因为pinia中没有,故而需要调整。

5 Vite相关
服务起来,并不代表迁移的页面一定能运行,因为菜单都调整了,这个问题就不好排查了,因为不知道是那个地方会造成循环调用。

vue-router.js?v=e7f9366d:1117 Uncaught RangeError: Maximum call stack size exceeded
    at [Symbol.replace] (<anonymous>)
    at String.replace (<anonymous>)
    at commonEncode (vue-router.js?v=e7f9366d:1117:31)
    at encodeQueryValue (vue-router.js?v=e7f9366d:1123:10)
    at encodeQueryKey (vue-router.js?v=e7f9366d:1126:10)
    at stringifyQuery (vue-router.js?v=e7f9366d:1169:11)
    at stringifyURL (vue-router.js?v=e7f9366d:73:35)
    at resolve (vue-router.js?v=e7f9366d:2084:22)
    at pushWithRedirect (vue-router.js?v=e7f9366d:2145:46)
    at pushWithRedirect (vue-router.js?v=e7f9366d:2152:14)

遇到这个问题,不知道从哪里下手,调试pushWithRedirect ,发现有一个\的路由,那么第6感告诉我,这个地方会不会因为这个路由导致的。
从代码可以看到/在路由中,被重定向到sysConfig.DASHBOARD_URL,那么如果这个sysConfig.DASHBOARD_URL\,重定向后发生死循环,于是就出现了上面的错误。
1

5.1 全局组件
1
在vue3中写法稍微有差异,在vite中使用完整路径
1
5.2 不支持require
vite不支持requre,因此下面的写法是有问题的
1
5.3 组件全路径
vite中引入组件是全路径,故而下面的写法要调整
1

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

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

相关文章

Qt配置CMake出错

一个项目需要在mingw环境下编译Opencv源码&#xff0c;当我用Qt配置opencv的CMakeLists.txt时&#xff0c;出现了以下配置错误&#xff1a; 首先我根据下述博文介绍&#xff0c;手动配置了CMake&#xff0c;但仍不能解决问题。 Qt(MinGW版本)安装 - 夕西行 - 博客园 (cnblogs.…

数之寻软件怎么样?

数之寻软件是一款功能强大的数据恢复和备份软件&#xff0c;以下是对其特点和功能的详细评价&#xff1a; 一、数据恢复方面&#xff1a; 高效的数据恢复能力&#xff1a;数之寻软件采用了先进的算法和数据恢复技术&#xff0c;能够快速有效地恢复丢失或损坏的数据。无论是文…

laravel视频对接aws

本次对接文件上传&#xff0c;目标是实现超级大文件的上传任务&#xff0c;可能就是4~5个g的视频文件&#xff0c;折腾了蛮久熟悉s3&#xff0c;因此记录一下。 大家要是对filesystem不清楚去看一下官方文档不然可能有点懵逼。 首先我先是对接了一个普通的s3存储文件的功能&a…

[解决] 为什么 App Inventor 扩展导入了,但是没啥反应?

大概率是导入拓展后&#xff0c;没有拖动拓展到界面上&#xff01; 导入拓展后&#xff0c;别忘了拖动拓展到主界面上&#xff0c;这样才算真正创建了拓展对象&#xff0c;这时才能使用拓展的方法。 原文&#xff1a;为什么 App Inventor 扩展导入了&#xff0c;但是没啥反应&…

了解Cookie登录:原理、实践与安全指南

什么是Cookie登录&#xff1f; Cookie是什么 当你首次登录网站时&#xff0c;你会输入用户名和密码。在后台&#xff0c;网站的服务器验证这些凭据是否正确。一旦确认你的身份无误&#xff0c;服务器就会创建一个Cookie&#xff0c;并将其发送到你的浏览器。这了解Cookie登录…

量子+AI,实用还需多久?

生成式人工智能正在席卷全球。OpenAI的GPT-4能够通过律师资格考试&#xff0c;Midjourney的图像作品能够赢得艺术大奖&#xff0c;而Sora则能够根据文本创造出令人难以置信的逼真视频。 这些AI模型的成就预示着通用人工智能的曙光——一个曾经只存在于科幻小说中的概念。然而&a…

快速了解网站访问为什么提示存在安全隐患,该怎么解决

这通常是由于网站使用了不安全的HTTP协议进行通信&#xff0c;或者网站的SSL证书存在问题&#xff0c;或者网站被标记为危险&#xff0c;或者网页中混杂了非HTTPS的内容。 网站访问提示不安全通常是由于以下原因之一引起的&#xff0c;可以按照相应的解决方案进行排查和解决&…

Java集合相关的List、Set、Map基础知识

目录 一、集合介绍 二、List 三、Map HashMap的数据结构 如何理解红黑树 四、set 一、集合介绍 在Java中&#xff0c;集合是一种用于存储对象的数据结构&#xff0c;它提供了一种更加灵活和强大的方式来处理和操作数据。Java集合框架提供了一系列接口和类&#xff0c;用…

CyberData统一元数据服务

CyberData统一元数据服务功能完善&#xff0c;实现了湖仓平台元数据在整个平台的统一管理以及外部数据源元数据的主动发现和多计算引擎间元数据的互通互联。 同时&#xff0c;我们支持跨多元计算场景&#xff0c;以及在元数据基础上的统一数据权限管理和数据湖的自动化优化加速…

2024年好用又便宜的云手机!哪款性价比高?

随着科技的飞速发展&#xff0c;云计算技术也在不断演进&#xff0c;而云手机作为其创新之一&#xff0c;已经开始在我们的生活中崭露头角。它通过将手机的硬件和软件功能移到云端&#xff0c;让用户能够借助强大的云计算资源完成各种任务。2024年&#xff0c;哪款云手机性价比…

springboot整合rabbitMQ系列10 利用插件实现延时消息

插件的安装&#xff0c;本文就不做描述了&#xff0c;插件安装后如下&#xff0c;就说明安装成功了1 添加pom依赖&#xff0c;yml配置就不讲了2 核心类&#xff0c;定义交换机的代码改成如下&#xff0c;其它的定义队列&#xff0c;设置绑定关系&#xff0c;设置死信等&#xf…

WebStorm 2024 for Mac:前端开发的强大助手

WebStorm 2024 for Mac是一款专为前端开发者设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;以其强大的功能和出色的性能&#xff0c;为Mac平台上的开发者提供了高效、便捷的Web开发体验。 WebStorm 2024 for Mac v2024.1.1中文激活版下载 这款IDE支持多种编程语言…

深入理解GTK、Qt、AWTK:跨平台GUI框架对比

目录标题 GTK特性&#xff1a;优点&#xff1a;缺点&#xff1a; Qt特性&#xff1a;优点&#xff1a;缺点&#xff1a; AWTK特性&#xff1a;优点&#xff1a;缺点&#xff1a; 适用场景 在当今的软件开发领域&#xff0c;图形用户界面&#xff08;GUI&#xff09;的开发是不可…

鸿蒙APP开发页面组件之间的属性关系

我们将对于多页面以及更多有趣的功能展开叙述&#xff0c;这次我们对于 HarmonyOS 的很多有趣常用组件并引出一些其他概念以及解决方案、页面跳转传值、生命周期、启动模式&#xff08;UiAbility&#xff09;&#xff0c;样式的书写、状态管理以及动画等方面进行探讨 页面之间…

文件权限管理

文件权限管理 1. 权限对象 权限对象含义u属主&#xff0c;所有者g属组o其他人 2. 权限类型 权限类型含义值r读权限4w写权限2x执行权限1 3. 修改文件属主及属组 命令:chown(change own)更改文件或目录属主与属组名 3.1 修改文件属主与属组 只修改属主&#xff1a;chown $…

交互式探索微生物群落与生态功能的关系

微生物群落在生态系统中发挥则重要功能&#xff0c;我们在对微生物群落进行分析时&#xff0c;会将不同分类水平&#xff08;从门到属&#xff09;的微生物类群的相对丰度与测定的某一生态功能进行相关性分析。但由于微生物类群数较多&#xff0c;又有不同的分类水平&#xff0…

python利用tg机器人推送发消息从安装到使用(二)

上一篇请参考: python利用tg机器人推送发消息从安装到使用-CSDN博客 本篇主要针对第二种方式推送tg消息,也就是使用telegram库的Bot发送消息,不仅可以发送文本,还可以方便的发送超链接内容和图片。 不过,随着telegram库的升级等各种原因,目前网上很多代码都不能直接使…

汽车组装3D电子说明书更通俗易懂

激光打印机由于造价高、技术更先进&#xff0c;因此在使用和维护上需要更专业的手法&#xff0c;而对于普通客户来说并不具备专业操作激光打印机的技能&#xff0c;为了通俗易懂地让客户理解激光打印机&#xff0c;我们为企业定制了激光打印机3D产品说明书&#xff0c;将为您带…

【如此简单!数据库入门系列】之ER模型快速入门

文章目录 模式设计基本概念实体&#xff08;Entity&#xff09;属性&#xff08;Attributes&#xff09;实体集和键&#xff08;key&#xff09;关系&#xff08;Relationship&#xff09; ER图实体和属性关系 泛化与特化总结更多例子 模式设计 大家还记得什么是物理模式、概念…

竞赛课第九周(埃式筛法,矩阵乘法)

1.埃式筛法:求区间[2, n]内所有的素数对 【参考代码】 #include <bits/stdc.h> using namespace std;const int N 1e5; vector<int> prime; bool visit[N];int main() {int n;cin>>n;memset(visit, false, sizeof(visit));for(int i2; i<sqrt(n); i){i…