【前端vue升级】vue2+js+elementUI升级为vue3+ts+elementUI plus

news2024/11/12 12:45:57

一、工具的选择

  近期想将vue+js+elementUI的项目升级为vue3+ts+elementUI plus,以获得更好的开发体验,并且vue3也显著提高了性能,所以在此记录一下升级的过程
 对于一个正在使用的项目手工替换肯定不是个可实现的解决方案,更优方案是基于 AST(抽象语法树)解构代码,根据既定规则,批量修改然后输出文件。
 目前主流的转换工具大致有babel插件、gogo code、jscodeshift 等等,在对比了官方文档、使用方式等方面最后决定使用gogo code来进行便捷升级。(官方文档相比之下更为清晰,使用方式更为方便,对于某些代码的转换核心代码更为简洁)

gogo code 是一个基于 AST (源代码的抽象语法结构树状表现形式)的 JavaScript/Typescript/HTML 代码转换工具,可以用它来构建一个代码转换程序来帮助自动化完成如框架升级、代码重构、多平台转换等工作。
当前 GoGoCode 支持解析和操作如下类型的代码:
○JavaScript(JSX)
○Typescript(TSX)
○HTML
○Vue

二、升级相关依赖

1.使用gogo code

npm install gogocode-cli -g

2.迁移源文件

gogocode -s ./src -t gogocode-plugin-vue -o ./src-out
//  ./src为目标目录,./src-out为输出目录,若两者一致则会覆盖

3.升级依赖

gogocode -s package.json -t gogocode-plugin-vue -o package.json

4.升级elementUI

gogocode -s ./src -t gogocode-plugin-element  -o ./src
// elementUI不支持vue3,需升级至elementUI plus

//图标相关的展示还需手动适配

//代码有语法错误的情况下进行转换会出现卡顿的情况,需手动处理

5.下载相关依赖

npm install

6.升级前注意事项
1)可能存在转化停顿情况,需要排查转换卡住的文件并暂时删除从而转化成功;
2)代码转换将根据gogocode内置的风格进行转换,可能改变原有代码的代码风格;
3)同时因为gogocode仍处于迭代过程中,不同版本会造成升级的效果有差异;

7.工具的优缺点
1)使用该工具能够减少一定的升级工作量,但是同时会产生其他一些未知的隐患,使用过程中需要对转换后的代码进行排查。目前针对大型项目还是优先手动升级
2)若不采用该工具进行一键转换,该工具有单独可取之处,比如:自动生成的事件API代理文件以及package.json变更等

8.升级后注意事项
个别部分仍需手动修改,例如:
1)router的匹配所有路径
2)style中的/deep/.class需手动修改为deep(.class)
3)全局app

//由于 Vue3 全局对象变成 createApp()创建,转换工具将 createApp() 返回对象传递给 window.$vueApp。此时需将window.$vueApp = Vue.createApp(App) 代码块移动到调用 window.$vueApp 代码的最前面。避免window.$vueApp 为 undefined 的情况出现。

在这里插入图片描述

9.工具编译的大致过程
在这里插入图片描述

1.把代码解析成抽象语法树(AST)
2.找到需改动的代码
3.把它修改成想要的样子
4.再生成回字符串形式的代码

三、报错信息

  1. 第一次报错
    在这里插入图片描述

原因:依赖的版本不对应
解决方法:卸载less-loader、webpack重新安装

  1. 第二次报错
    在这里插入图片描述

原因:ValidationError:选项对象无效。已使用与API架构不匹配的选项对象初始化开发服务器。
通俗讲就是使用的某个属性与当前版本不适配
解决方法:在vue.config.js删除报错中提示的不适配属性
在这里插入图片描述

接下来项目就跑起来了,只需修改对应的报错信息

1、eslint-plugin-vue
在这里插入图片描述

解决方法:重新下载’eslint-plugin-vue

2、yarn
在这里插入图片描述

解决方法:删除yarn.lock(如果需要yarn,则需要重新下载)

3、匹配所有路由
在这里插入图片描述

原因:在vue2中匹配所有路由可以使用path:*,在vue3需修改以下path

{
// 匹配所有路径  vue2使用   vue3使用/:pathMatch(.)或              /:pathMatch(.)或/:catchAll(.*)
  path: "/:pathMatch(.)",
   name: "404",
   component: ()=> import("../components/NotFound.vue")
 }

四、代码相关的修改
1、路由匹配但是页面404
某个页面有可选参数时,在vue2的router中可以写两个在这里插入图片描述

vue3中新增了对可选参数的优化,只需在参数后添加问号即可在这里插入图片描述

const routes = [
  // 匹配 /users 和 /users/posva
  { path: '/users/:userId?' },
  // 匹配 /users 和 /users/42
  { path: '/users/:userId(\\d+)?' },
]
// *也可以代表参数是可选的,但 ? 参数不能重复。

// 可重复的参数
const routes = [
  // /:chapters ->  匹配 /one, /one/two, /one/two/three, 等
  { path: '/:chapters+' },
  // /:chapters -> 匹配 /, /one, /one/two, /one/two/three, 等
  { path: '/:chapters*' },
]
// *:0 个或多个, +:1 个或多个

//或使用正则方式实现可重复参数
const routes = [
  // 仅匹配数字
  // 匹配 /1, /1/2, 等
  { path: '/:chapters(\\d+)+' },
  // 匹配 /, /1, /1/2, 等
  { path: '/:chapters(\\d+)*' },
]

2、vue2中可以el-col嵌套el-col,在vue3中不行,必须是el-row嵌套
在这里插入图片描述

3、main.js
vue2中在原型链上挂载方法时可以直接使用Vue.prototype.xxx,使用时可以直接用this

import Vue from 'vue';
Vue.prototype.$loader = loader;

this.$loader.post....

vue3中修改了这种方式,改为

import App from './App.vue';
import { createApp } from 'vue';
const app = createApp(App);
app.config.globalProperties.$loader = loader;

//使用时
<script setup lang="ts">
  import { getCurrentInstance } from 'vue'
  const { proxy }: any = getCurrentInstance()
  console.log('proxy:', proxy)
  console.log('getAction:', proxy.$getAction)
</script>
//js里还可以用this.xxx使用
//如果全局属性与组件自己的属性冲突,组件自己的属性将具有更高的优先级

4、父子组件传值
1)vue2
由于vue中是单向数据流,父子组件在传值时想要实现v-model的效果就要用到.sync修 饰 符来实现“双向绑定”

<DialogContent
  :title.sync="addDialogTitle"
/>

2)vue3
对v-model进行了改造,不再需要 .sync 修饰符即可达到数据双向绑定的效果。在vue3中支持多个 v-model属性,默认使用 modelValue 作为 prop,update:modelValue作为事件,当多个v-model绑定时,书写为例:v-model:title=“title”,此时 title 作为prop,update:title 作为事件

<DialogContent
  v-model:title="addDialogTitle"
  v-model:Name="addName"
/>

5、根节点
vue2中template中只能有一个根节点

<template>
  <div id="app">
  	...
  </div>
</template>

vue3中可以存在多个根节点

<template>
  <div>...</div>
  <a>...</a>
  <p>...</p>
</template>
//这时候相当于没有根节点,内部会添加根标签 <fragment> </fragment>
//好处就是可以减少标签层级,减少内存消耗

6、template上的key
1)vue2
如果需要对template添加v-for进行循环时,key只能放在子节点上
在这里插入图片描述

在vue3中可以把key绑定在template上
在这里插入图片描述

7、vue-lazyload 目前不支持 Vue3,需等待更新

8、store
vue2

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
    state: {},
    mutations: {},
    actions: {},
    modules: {}
})

vue3

import { createStore } from 'vuex' // 引入 createStore 方法
export default createStore({
    state: {},
    mutations: {},
    actions: {},
    modules: {}
})

vue3中使用vuex

import { createStore } from 'vuex'
export default createStore({
    state: {
        name: "superman",
        arr: [1, 2, 3]
    },
    mutations: {
        muModify(state, val) {
            console.log("commit muModify", val)
            state.name += val
        }
    },
    actions: {
        acModify(context, val) {
            console.log("dispatch acModify", val)
            context.commit("muModify", val)
        }
    },
    getters: {
        getArr(state) {
            return state.arr.map(item => item * 2)
        }
    },
    modules: {}
})
import { useStore } from "vuex";
export default {
    name: "App",
    setup() {
        // 通过 useStore 使用 Vuex
        const {state,getters,dispatch, commit} = useStore();
        // 获取数据
        let name = state.name;
        let arr = computed(() => state.arr);
        let getArr = computed(() => getters.getArr);
        // computed方法作用为将数据变为响应式的
        // computed与react中的useCallBack类型大致一致
        
        // 调用 dispatch 方法
        function diModify() {
            dispatch("acModify", "(Actions)");
        }
        // 调用 commit 方法
        function coModify() {
            commit("muModify", "(Mutations)");
        }
        return { name, arr, getArr, coModify, diModify };
    },
};
</script>

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

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

相关文章

提升研发效能的开发工具

一、前言 随着企业对创新和效率的追求不断升级&#xff0c;研发效能成为了炙手可热的概念。各大公司纷纷成立专门的团队&#xff0c;以提升研发效能为重要目标。本文将从研发人员的视角出发&#xff0c;结合自身的深度思考&#xff0c;探讨研发效能的相关概念&#xff0c;共同寻…

【MySQL系列】MySQL内置函数的学习

「前言」文章内容大致是对MySQL内置函数的学习。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、MySQL的日期函数二、MySQL的字符串函数三、MySQL的数学函数四、 其它函数 一、MySQL的日期函数 常见的日期函数如下&#xff1a; 函数名称描述current…

Netty为什么高效,为什么这么受欢迎?

文章目录 前言Netty 解决的问题简化网络编程粘包和拆包 高性能的设计多线程调度零拷贝 总结 前言 上篇文章通过 Java NIO 的处理流程与 Netty 的总体流程比较&#xff0c;并结合 Netty 的源码&#xff0c;可以更加清晰地理解Netty。本文将结合源码详细解析Netty的高效和强大功…

MySQL 用户管理操作

目录 一、用户管理概述 二、用户管理 1、创建用户 2、删除用户 三、账户密码管理 1、root用户修改自己的密码 2、ROOT用户修改其他普通用户密码 3、普通用户修改自己的密码 4、ROOT用户密码忘记解决办法 1&#xff09;Linux系统 2&#xff09;windows系统 四、用户权…

中小学vr仿真教学课件综合管理平台拓宽了学生的视野

VR智慧教学平台可以为实践课程提供全方位的辅助&#xff0c;帮助学生更好地理解和掌握知识。本文将详细介绍VR智慧教学平台在实践课程中的作用。 一、提供沉浸式的学习体验 传统的实践课程往往需要学生亲自动手操作&#xff0c;但由于条件限制&#xff0c;很多学生无法获得实际…

【Linux命令行与Shell脚本编程】第二十章 sed进阶

Linux命令行与Shell脚本编程 第二十章 sed进阶 文章目录 Linux命令行与Shell脚本编程十.sed进阶10.1.多行命令(nNDP)10.1.1.next命令10.1.1.1.单行next命令n10.1.1.2.合并文本行N 10.1.2.多行删除命令D10.1.3.多行打印命令P 10.2.保留空间(hHgGx)10.3.排除命令(!)10.4.改变执行…

如何管理一个散漫的团队?

散漫的团队管理&#xff0c;是一个让人头疼的问题。团队成员缺乏积极性&#xff0c;工作效率低下&#xff0c;协作能力也不强&#xff0c;这样的团队很容易导致项目延误&#xff0c;影响整个团队的工作进展。那么&#xff0c;如何管理一个散漫的团队呢&#xff1f;接下来&#…

问道管理:环保板块走势强劲,启迪环境三连板,碧兴物联等涨停

环保板块21日盘中大幅走高&#xff0c;到发稿&#xff0c;碧兴物联、国泰环保、太和水、正和生态、启迪环境等涨停&#xff0c;钱江生化涨近9%。值得注意的是&#xff0c;启迪环境已连续3个交易日涨停&#xff0c; 音讯面上&#xff0c;近日国家发改委等部门联合发布《关于促进…

常见的网络设备有哪些?分别有什么作用?

个人主页&#xff1a;insist--个人主页​​​​​​ 本文专栏&#xff1a;网络基础——带你走进网络世界 本专栏会持续更新网络基础知识&#xff0c;希望大家多多支持&#xff0c;让我们一起探索这个神奇而广阔的网络世界。 目录 一、网络设备的概述 二、常见的网络设备 1、…

0009Java程序设计-jsp在线学习平台设计与实现

摘 要目 录系统实现开发环境 摘 要 在线学习平台&#xff0c;是一个利用因特网作为平台传送教学内容&#xff0c;实施网上教学&#xff0c;进行网上交流和学习的信息系统。构建在线学习系统平台&#xff0c;可以克服传统课堂教育的局限性&#xff0c;形成一种主动的、协作的、…

23种设计模式攻关

&#x1f44d;一、创建者模式 &#x1f516;1.1、单例模式 单例模式&#xff08;Singleton Pattern&#xff09;&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供全局访问点。 在某些情况下&#xff0c;我们需要确保一个类只能有一个实例&#xff0c;比如数据库连接…

[oneAPI] 基于BERT预训练模型的命名体识别任务

[oneAPI] 基于BERT预训练模型的命名体识别任务 Intel DevCloud for oneAPI 和 Intel Optimization for PyTorch基于BERT预训练模型的命名体识别任务语料介绍数据集构建使用示例 命名体识别模型前向传播模型训练 结果 参考资料 比赛&#xff1a;https://marketing.csdn.net/p/f3…

PyCharm PyQt5 开发环境搭建

环境 python&#xff1a;3.6.x PyCharm&#xff1a;PyCharm 2019.3.5 (Community Edition) 安装PyQT5 pip install PyQt5 -i https://pypi.douban.com/simplepip install PyQt5-tools -i https://pypi.douban.com/simple配置PyCharm PyQtUIC Program &#xff1a;D:\Pytho…

疲劳驾驶检测和识别4:C++实现疲劳驾驶检测和识别(含源码,可实时检测)

疲劳驾驶检测和识别4&#xff1a;C实现疲劳驾驶检测和识别(含源码&#xff0c;可实时检测) 目录 疲劳驾驶检测和识别4&#xff1a;C实现疲劳驾驶检测和识别(含源码&#xff0c;可实时检测) 1.疲劳驾驶检测和识别方法 2.人脸检测方法 3.疲劳驾驶识别模型(Python) &#xf…

iPhone开启“轻点唤醒”功能但点击屏幕无反应怎么解决?

iPhone的“轻点唤醒”功能启用时&#xff0c;用户只需手指轻触或点击手机屏幕即可快速唤醒设备&#xff0c;无需按压任何按钮。然而&#xff0c;有些用户在使用“轻点唤醒”功能唤醒屏幕时&#xff0c;遇到该功能失灵&#xff0c;无法正常唤醒屏幕的情况&#xff0c;这是怎么回…

找出数组中最小K个数【最小堆】

面试题 17.14. 最小K个数 - 力扣&#xff08;LeetCode&#xff09; 设计一个算法&#xff0c;找出数组中最小的k个数。以任意顺序返回这k个数均可。 示例&#xff1a; 输入&#xff1a; arr [1,3,5,7,2,4,6,8], k 4 输出&#xff1a; [1,2,3,4]提示&#xff1a; 0 < l…

MySQL系统变量 会话变量,用户变量、mysql8.0的全局变量持久化

系统变量 分类 全局系统变量需要添加 global 关键字&#xff0c;有时把全局系统变量简称 全局变量 会话系统变量需要添加 session 关键字&#xff0c;有时也把会话系统变量称为 local 变量 局部变量 如果不写&#xff08;global、session&#xff09;默认会话级别。 静态变量在…

导轨式频率脉冲信号隔离转换电压电流信号变换器0-5KHz/0-10KHz/1-5KHz转0-10V/1-5V/0-20mA/4-20mA

主要特性 将单位脉冲信号转换成直流电压或电流信号。 精度等级&#xff1a;0.1 级、0.2 级、0.5 级。产品出厂前已检验校正&#xff0c;用户可以直接使用。 国际标准信号输入: 0-5KHz/0-10KHz/1-5KHz等 0-5V/0-10V/1-5V 等电压信号,0-10mA/0-20mA/4-20mA 等电流信号。 …

小技巧:一键上传多文件,快速导出3D翻页的电子书

​hi&#xff01;今天咱们聊一聊怎样一键上传多文件&#xff0c;快速导出电子书&#xff0c;其实就是一款很方便的工具。它能一次批量上传多文件&#xff0c;在1分钟后就能呈现出一本3D翻页的电子书 接下来就是看小编是怎么操作的&#xff0c;一起学起来吧&#xff01; 【操作步…

Linux —— 进程间通信(管道)

目录 一&#xff0c;进程间通信 二&#xff0c;管道 匿名管道 命名管道 一&#xff0c;进程间通信 进程间通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;&#xff0c;即在不同进程之间进行信息的传播或交换&#xff1b;由于一般进程用户地址空间是…