把 iview 组件库升级到 Vue3 的实践

前一段时间,我们团队发布了工具:阿里妈妈又做了新工具,帮你把 Vue2 代码改成 Vue3 的

这个工具使用 GoGoCode 来做代码转换的方式帮助 Vue2 的项目迁移到 Vue3,发出后我们收到了很多社区朋友的反馈,修正了很多的问题,但听到最多的反馈就是:「我的组件库还不支持 Vue3,我业务代码升级了没用啊!」

实际上我们也遇到了这个问题……下面是我们内部用的项目排期管理平台 LaLaLine(看这一脉相承的命名),它使用的是 Vue2 + iView 的技术栈

image.png 当我们把它升级到 Vue3 时,就受到了 iView 的掣肘,这是一个很好用的组件库,但看起来迟迟没有升级 Vue3 的计划,组件库是强依赖,它不升级,我们的项目是跑不起来的。

其实组件库也是基于 Vue2 构建的项目,我们不禁想,能不能试一试把 GoGoCode 的转换直接应用到 iView 组件库上,组件库对 Vue 功能的使用会更加的深度和灵活,这样也能检验我们转换工具的质量。

兵马未动,构建先行

Vue2 和 Vue3 的构建方式有所差异,想让转换后的 Vue3 的代码能顺利跑起来,我们首先要修改构建流程。

按照官网的提示,我们除了要改运行时 Vue 的版本号从 2 到 3,在编译时还要使用 @vue/compiler-sfc 替换原有的 vue-template-compiler,替换后发现跑不起来,原来 @vue/compiler-sfc 要求 Webpack4 以上才行。

那我们就把 Webpack3 升级到 Webpack 4,对应的 Webpack 插件依赖和配置文件都需要随着版本变化进行调整,在调整之后,要记得把 VueLoaderPlugin 加到 plugin 里面,再针对 Vue3 调整一些环境变量的替换:

image.png

利用转换工具粗略跑一遍

观察一下 iView 的项目结构:

image.png

其中 src 目录是组件库源码,examples 则是调试开发组件库时的示例仓库,都是 Vue2 的代码。

我们把它们各自用 GoGoCode 的 Vue 转换插件跑上一遍:

gogocode -t gogocode-plugin-vue -s ./examples -o ./examples

gogocode -t gogocode-plugin-vue -s ./src -o ./src

结果非常的壮观,光是 src 目录下就有 140 Diff

image.png

可以看到很多 Vue2 和 Vue3 的差异点已经被转换好了

比如 slot:

image.png

image.png

事件的 .native 后缀去掉了:

image.png

被去掉的 $on \ $children 等属性以外挂函数的形式的到了支持:

image.png

生命周期也被自动给改了名:

image.png

函数式组件得到了「面目全非」式地修改:

image.png

指令的生命周期也被改好了:

image.png……

看到工具帮我们改了这么多,自然是十分欣喜的,然后就直接跑起来看看!

果然跑不起来。

手动做出调整

这么大的一个组件库,肯定有工具覆盖不到的地方,我们对它的要求也只是帮我们做好重复的 90% 的工作,剩下一些技术活还是要人来调整一下!

比如组件注入的入口文件:

image.png

比如看起来暂时用不上的 isServer:

image.png

比如在 props 的 default 函数里面无法访问 this,得想个办法 hack 掉:

image.png ……

过程中发现的转换规则的 bug 已经随手修改掉了,重跑之后,发现手改的地方是很少的,相比于这接近二百个文件,可能也就十处,而且很少有重复工作。

然后我们试一下 npm run dev

竟然跑起来了:

image.png

image.png

image.png

image.png

image.png 点东点西,修复了一些发现的问题,就可以让老项目升级后直接用上啦!

后记

在此之后,我们的 LaLaLine 项目管理工具也能轻装上阵 Vue3 啦,替 LaLaLine 感谢 GoGoCode

当然,本次实践是以测试、完善 GoGoCode 能力和内部项目升级为主,后续还是希望能用上 iView 官方的 Vue3 版本,不过我们什么时候能用上官方发布的 Vue3 的组件库呢?

当我们去看 iView 的 issue 列表时,发现有很多朋友也都表达了殷切的期望,iView 小组也已经有对应的计划: ([Feature Request]missing vue3.0 support咨询下:Vue3.0已经发布,view-design是否有对Vue3支持的计划?什么时候支持vue3)

刚开始冒出自己动手升级组件库的想法时,都不由得为这个想法感到可怕,想想就是一个巨大的坑,但后来发现,在大部分重复工作被工具做了之后,这件事情也不是那么难!这次实验证明,GoGoCode 可以加速大型 Vue 应用/组件库升级 Vue3 的进程,相关团队若有 GoGoCode 能帮到的地方请尽快联系我们!

issues: github.com/thx/gogocod…

钉钉群:34266233

最后:求 star 支持!

Github:github.com/thx/gogocod…(本次演示转换的 iview 项目也在里面)

官网:gogocode.io