鸟枪换大炮

- Dec 16, 2023

只是记录一下突然从 AngularJS 跳到 Vue3 + TypeScript 的大概历程 (吐槽)

提要 #

刚进公司时做的项目,用的就是 AngularJS,因为最初的 Vue 就是从这个发展而来的,所以上手起来还是蛮顺,在这里把这个项目叫做“10”。然后公司发展需要吧,另一个组基于 Vue2 + ElementUI 开发了一套新的软件系统,我们叫它“20”。再然后就是最近,公司决定开发“30”项目,前端技术栈用的是 Vue3 + TypeScript,UI库用的 Element-Plus,因为人手配置问题,我也有幸加入到该项目中,我一直渴望能在工作中接触到新一点的技术,所以也是愿望成真,能见见世面了。

割裂感 #

割裂感很强,我原以为 TypeScript 只是简单的 JavaScript 基础上加上类型而已,我原本就搞过 Java 的人,加上类型有什么难的呢?结果真接触 TypeScript 的时候,我承认是我搞错了。

我只觉得 麻烦,这大概是因为在 JavaScript 里躺久了,它每一次赋值可能都会引起 TSC(TypeScript编译器) 的报错,然后项目是从 20 升级上来的,这工作简单点来说就是拿 20 的代码复制过来,然后粘贴到 30 的项目中,除了改成 Vue3 的代码外,还要补上各种各样的类型。

说到 2030,其实也是 Vue2Vue3 的差别,众所周知 Vue2 用的是 选项式API,就是说它 data 放一块、events 放一块、watch放一块…迁移到 30 的时候,特地拉了个会,说为了两个版本之间的统一,到了 Vue3 这边,datareactive 整个括起来,events 也是类似地用一个对象括起来,下边 return 的时候再用 ...toRefs 处理 data,这样整体改动会比较小,迁移更快。

逐渐了解 #

写多了,加上一边跟进学习,TypeScript 就逐渐上手了,一开始会觉得麻烦,每次声明变量的时候都要加个类型,但其实有 类型推断,一些简单类型的变量并不需要明着给它安排个类型,它自己就会根据后边的赋值而确定自身的类型。如果遇到需要跨类型的情况,可以在声明的时候加个 联合类型,不用太复杂,后边用这个变量的时候,遇到类型不通用,但确实是 联合类型 里的,就给它加个 类型断言。当然这都只是简单规律,实际上会复杂一点,只是说我一开始把这个看得太庞大了,但其实拆细了还是好弄的。

最最喜欢的时候,封装接口会用 泛型,它支持在开发中实际使用的时候传入一个实际的类型。那我事先定好复杂数据的类型,调接口的时候传进去,拿到返回数据的对象了,我直接敲个“.”,自动就能出来这个对象里包含的属性了,属性对应什么类型也是一目了然。

Vue3 这边我感觉是没做好的,升级后的 template 其实稍微有点破坏性更新,但这都算了,因为知道了 Vue3声明式API,才逐渐觉得当初开会时说的那种写法就像是 明明不是选项式却硬写成了选项式,而这种写法其实一点 Vue3 的好处都没应用到,可惜人微言轻了…但是吧,也正是这次经历才让我对 Vue3 了解得更深刻。

总结 #

没想到还真被我写成了吐槽…

主要就是想说,一开始确实被要求的 工作量和deadline 吓到了,但其实先熟悉了 TypeScript 就能跨一大步了。至于 Vue3,可能在最初这种“时间紧任务重”的情况下,这也是最好的迁移方案了吧。

(后续维护岂不是要命?)

>