万般皆是命,半点不留人。
俗话说没过十五就是年,在这里给看到这篇文章的各位拜个晚年,大家过年好。
在这辞旧迎新的日子里我emo了,倒不是什么特别痛苦的事情,简短的叙述下事情的经过吧,去年年中因项目要求需要和“友商”部门共同开发一个项目,前期明确和本部门的领导沟通需要对方提供技术栈以及代码规范。结果...,我们用了vue2,而他们用了vue3,到这了其实和我都没有什么关系,结果年后开工第一天,人家要求我们将自己的代码集成到人家工程里面去,这个巨恶心的问题也不知道怎么就落到我的头,只知道那夜他们开了好久的会,在会前我给出了以下几套方案:
- 使用微前端进行衔接;
- 推翻之前工程进行代码重构;
- 纯手动、强行迁移,修改不匹配部分;
最后在大佬一顿研讨后,最终选择了方案三,我emo了!
来吧!看看这个纯手动升级的过程中我们都遇到什么问题吧!
Failed to fetch dynamically
这个问题的原因可能以下几种:
- 路由配置的路径上找不到对应的文件;
- 文件内import的路径上找不到对应的文件;
Right-hand side of 'instanceof' is not an object
这个问题是我迁移公共组件以及子组件时发生了,原因是在接收父组件的props时,定义的ts类型,不是单一的类型;
props: {
// bad
needToTop: { type: Boolean | null, default: true }
// good
needToTop: { type: Boolean, default: true }
}
新框架不支持vueJsx
@vitejs/plugin-vue-jsx是Vite官方提供的JSX支持插件,其内部使用了Vue官方提供的@vue/babel-plugin-jsx插件。
vitejs.dev的配置
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
// https://vitejs.dev/config/
export default defineConfig({ plugins: [vue(), vueJsx()], })
提示:安装的时候要关注下当前@vitejs/plugin-vue-jsx
与vite的版本匹配问题。
幽灵函数
这个是问题是目前遇到问题中最奇葩的一个,我自己基于element-plus封装了一个upload组件,主要功能了是在上传你图片以后获取到返回值,然后暴露出去。
// 这是父组件中调用的代码,请记住这里的success函数
handleRemove('fileList', fileList)"
@success="(response) => handleSuccess('fileList', response)"
>
// 这是子组件
const updateSuccess = (response) => {
emit('success', response)
}
上面是父子组件的伪代码,可以看到父组件中传入的@success函数是需要子组件updateSuccess时触发的。
诡异的问题出现了,父组件的handleSuccess函数内是可以看到代码执行打印的log的,但是子组件的:on-success函数以及uploadSuccess函数并未执行。
查阅了一些资料,当前项目使用的element-plus版本为2.1.8,有人说在2.2.9之前,upload组件都存在on-success不触发的bug,但是也没说明为什么父组件的success诡异的执行了。
watch的无效问题
这个问题就比较直白了,父组件传进来的属性,用watch或者watchEffect均无效,但是打印其属性是可以看到属性是有变化的。
总结
有些问题还没解决完,迁移升级的项目也还在继续,新的问题我还会继续更新,未解决的问题也会想办法搞清楚。
其实手动升级也没什么技术含量,无非就是vue以及一些配套的生态有所变化,最难受的可能来自于一个或者一群神仙队友的暴击。
由此可见 沟通是多么的重要!多沟通吧朋友!